Hex Artifact Content

Artifact 38178200a50497ab714046370d1e5407b001fe54:


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 0a  read.h>.#endif..
01d0: 23 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a  #define CK_PTR *
01e0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49  .#define CK_DEFI
01f0: 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75  NE_FUNCTION(retu
0200: 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65  rnType, name) re
0210: 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64  turnType name.#d
0220: 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45  efine CK_DECLARE
0230: 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e  _FUNCTION(return
0240: 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75  Type, name) retu
0250: 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66  rnType name.#def
0260: 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46  ine CK_DECLARE_F
0270: 55 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28  UNCTION_POINTER(
0280: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
0290: 29 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20  ) returnType (* 
02a0: 6e 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b  name).#define CK
02b0: 5f 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49  _CALLBACK_FUNCTI
02c0: 4f 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ON(returnType, n
02d0: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
02e0: 28 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66  (* name).#ifndef
02f0: 20 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66   NULL_PTR.#  def
0300: 69 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23  ine NULL_PTR 0.#
0310: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
0320: 22 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c  "pkcs11.h".#incl
0330: 75 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e 68  ude "asn1-x509.h
0340: 22 0a 0a 23 69 66 6e 64 65 66 20 43 41 43 4b 45  "..#ifndef CACKE
0350: 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
0360: 4f 4e 5f 43 4f 44 45 0a 23 20 20 64 65 66 69 6e  ON_CODE.#  defin
0370: 65 20 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  e CACKEY_CRYPTOK
0380: 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30  I_VERSION_CODE 0
0390: 78 30 32 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a  x021e00.#endif..
03a0: 23 69 66 6e 64 65 66 20 43 4b 41 5f 54 52 55 53  #ifndef CKA_TRUS
03b0: 54 5f 53 45 52 56 45 52 5f 41 55 54 48 0a 23 20  T_SERVER_AUTH.# 
03c0: 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52 55 53   define CKA_TRUS
03d0: 54 5f 53 45 52 56 45 52 5f 41 55 54 48 20 30 78  T_SERVER_AUTH 0x
03e0: 63 65 35 33 36 33 35 38 0a 23 65 6e 64 69 66 0a  ce536358.#endif.
03f0: 23 69 66 6e 64 65 66 20 43 4b 41 5f 54 52 55 53  #ifndef CKA_TRUS
0400: 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 0a 23 20  T_CLIENT_AUTH.# 
0410: 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52 55 53   define CKA_TRUS
0420: 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20 30 78  T_CLIENT_AUTH 0x
0430: 63 65 35 33 36 33 35 39 0a 23 65 6e 64 69 66 0a  ce536359.#endif.
0440: 23 69 66 6e 64 65 66 20 43 4b 41 5f 54 52 55 53  #ifndef CKA_TRUS
0450: 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 0a 23  T_CODE_SIGNING.#
0460: 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54 52 55    define CKA_TRU
0470: 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20  ST_CODE_SIGNING 
0480: 30 78 63 65 35 33 36 33 35 61 0a 23 65 6e 64 69  0xce53635a.#endi
0490: 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54 52  f.#ifndef CKA_TR
04a0: 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43  UST_EMAIL_PROTEC
04b0: 54 49 4f 4e 0a 23 20 20 64 65 66 69 6e 65 20 43  TION.#  define C
04c0: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
04d0: 52 4f 54 45 43 54 49 4f 4e 20 30 78 63 65 35 33  ROTECTION 0xce53
04e0: 36 33 35 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  635b.#endif../* 
04f0: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0500: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0510: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0520: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0530: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0540: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0550: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0560: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0570: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
0580: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
0590: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
05a0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
05b0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
05c0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
05d0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
05e0: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
05f0: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0600: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0610: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0620: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0630: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0640: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0650: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0660: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0670: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
0680: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
0690: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
06a0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
06b0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
06c0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
06d0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
06e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
06f0: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0700: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0710: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0720: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0730: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0740: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0750: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0760: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0770: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
0780: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
0790: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
07a0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
07b0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
07c0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
07d0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
07e0: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
07f0: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0800: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0810: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0820: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0830: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0840: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0850: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0860: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0870: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
0880: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
0890: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
08a0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
08b0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
08c0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
08d0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
08e0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
08f0: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0900: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0910: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0920: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0930: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0940: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0950: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0960: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0970: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0980: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0990: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
09b0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
09c0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
09d0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
09e0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
09f0: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0a00: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0a10: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0a20: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0a30: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0a40: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0a50: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0a60: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0a70: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0a80: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0a90: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0aa0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0ab0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0ac0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0ad0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0ae0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0af0: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0b00: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0b10: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0b20: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0b30: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0b40: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0b50: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0b60: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0b70: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0b80: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0b90: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0ba0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0bb0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0bc0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0bd0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0be0: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0bf0: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0c00: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0c10: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0c20: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0c30: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0c40: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0c50: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0c60: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0c70: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0c80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0c90: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0ca0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0cb0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0cc0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0cd0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0ce0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0cf0: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0d00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0d10: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0d20: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0d30: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0d40: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0d50: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0d60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0d70: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0d80: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0d90: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0da0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0db0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0dc0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0dd0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0de0: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0df0: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0e00: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0e10: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0e20: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0e50: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0e60: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0e70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e80: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0e90: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0ea0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0eb0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0ec0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ed0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
0ee0: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
0ef0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
0f00: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
0f10: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
0f20: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
0f30: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
0f40: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
0f50: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
0f60: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
0f70: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
0f80: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
0f90: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
0fa0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
0fb0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
0fc0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0fd0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
0fe0: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
0ff0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1000: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1010: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1020: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1030: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1040: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1050: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1060: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1070: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
1080: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
1090: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 4b 49 20   0x58../*** PKI 
10a0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46  Information - EF
10b0: 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69   7000 ***/.#defi
10c0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  ne GSCIS_TAG_CER
10d0: 54 49 46 49 43 41 54 45 20 20 20 20 20 20 20 20  TIFICATE        
10e0: 20 30 78 37 30 0a 23 64 65 66 69 6e 65 20 47 53   0x70.#define GS
10f0: 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53  CIS_TAG_CERT_ISS
1100: 55 45 5f 44 41 54 45 20 20 20 20 20 30 78 37 31  UE_DATE     0x71
1110: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1120: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
1130: 41 54 45 20 20 20 20 30 78 37 32 0a 0a 2f 2a 2a  ATE    0x72../**
1140: 20 41 70 70 6c 65 74 20 49 44 73 20 2a 2a 2f 0a   Applet IDs **/.
1150: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 41 49  #define GSCIS_AI
1160: 44 5f 43 43 43 20 20 20 20 20 20 20 20 20 20 20  D_CCC           
1170: 20 20 20 20 20 20 30 78 41 30 2c 20 30 78 30 30        0xA0, 0x00
1180: 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78  , 0x00, 0x01, 0x
1190: 31 36 2c 20 30 78 44 42 2c 20 30 78 30 30 0a 0a  16, 0xDB, 0x00..
11a0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
11b0: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
11c0: 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 20 20 69  E_STDIO_H.#    i
11d0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
11e0: 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20 20 64 65  .#  endif..#  de
11f0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
1200: 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e 29 20 7b  G_PRINTF(x...) {
1210: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1220: 20 22 25 73 28 29 3a 20 22 2c 20 5f 5f 66 75 6e   "%s(): ", __fun
1230: 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66 28 73 74  c__); fprintf(st
1240: 64 65 72 72 2c 20 78 29 3b 20 66 70 72 69 6e 74  derr, x); fprint
1250: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b  f(stderr, "\n");
1260: 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43   }.#  define CAC
1270: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
1280: 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e  UF(f, x, y) { un
1290: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54 4d 50  signed char *TMP
12a0: 42 55 46 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f  BUF; unsigned lo
12b0: 6e 67 20 69 64 78 3b 20 54 4d 50 42 55 46 20 3d  ng idx; TMPBUF =
12c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
12d0: 2a 29 20 28 78 29 3b 20 66 70 72 69 6e 74 66 28  *) (x); fprintf(
12e0: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 20 25  stderr, "%s(): %
12f0: 73 20 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 30  s  (%s/%lu = {%0
1300: 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 66  2x", __func__, f
1310: 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65 64 20  , #x, (unsigned 
1320: 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d 50 42 55  long) (y), TMPBU
1330: 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69 64 78 20  F[0]); for (idx 
1340: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1350: 69 64 78 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66  idx++) { fprintf
1360: 28 73 74 64 65 72 72 2c 20 22 2c 20 25 30 32 78  (stderr, ", %02x
1370: 22 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b  ", TMPBUF[idx]);
1380: 20 7d 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65   }; fprintf(stde
1390: 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20 7d 0a 23  rr, "})\n"); }.#
13a0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
13b0: 44 45 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20  DEBUG_PERROR(x) 
13c0: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
13d0: 2c 20 22 25 73 28 29 3a 20 22 2c 20 5f 5f 66 75  , "%s(): ", __fu
13e0: 6e 63 5f 5f 29 3b 20 70 65 72 72 6f 72 28 78 29  nc__); perror(x)
13f0: 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 66 72  ; }.#  define fr
1400: 65 65 28 78 29 20 7b 20 43 41 43 4b 45 59 5f 44  ee(x) { CACKEY_D
1410: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 52 45  EBUG_PRINTF("FRE
1420: 45 28 25 70 29 20 28 25 73 29 22 2c 20 78 2c 20  E(%p) (%s)", x, 
1430: 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20 7d 0a  #x); free(x); }.
1440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
1450: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
1460: 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73 69  MALLOC(size_t si
1470: 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ze, const char *
1480: 66 75 6e 63 29 20 7b 0a 09 76 6f 69 64 20 2a 72  func) {..void *r
1490: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
14a0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a  = malloc(size);.
14b0: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
14c0: 2c 20 22 25 73 28 29 3a 20 22 2c 20 66 75 6e 63  , "%s(): ", func
14d0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65  );..fprintf(stde
14e0: 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29 20 3d 20  rr, "MALLOC() = 
14f0: 25 70 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66  %p", retval);..f
1500: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1510: 5c 6e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  \n");...return(r
1520: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1530: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
1540: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
1550: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
1560: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
1570: 63 68 61 72 20 2a 66 75 6e 63 29 20 7b 0a 09 76  char *func) {..v
1580: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
1590: 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
15a0: 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66  ptr, size);...if
15b0: 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29   (retval != ptr)
15c0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 73 74 64   {...fprintf(std
15d0: 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 66  err, "%s(): ", f
15e0: 75 6e 63 29 3b 0a 09 09 66 70 72 69 6e 74 66 28  unc);...fprintf(
15f0: 73 74 64 65 72 72 2c 20 22 52 45 41 4c 4c 4f 43  stderr, "REALLOC
1600: 28 25 70 29 20 3d 20 25 70 22 2c 20 70 74 72 2c  (%p) = %p", ptr,
1610: 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 70 72 69   retval);...fpri
1620: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
1630: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  );..}...return(r
1640: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1650: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
1660: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
1670: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67  TAG_TO_STR(unsig
1680: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a  ned char tag) {.
1690: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
16a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
16b0: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75  _CARDID:....retu
16c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
16d0: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  RDID");...case G
16e0: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
16f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1700: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29  IS_TAG_CCC_VER")
1710: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1720: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72  AG_CCG_VER:....r
1730: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1740: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCG_VER");...ca
1750: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
1760: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  DURL:....return(
1770: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55  "GSCIS_TAG_CARDU
1780: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RL");...case GSC
1790: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
17a0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
17b0: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09  TAG_PKCS15");...
17c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
17d0: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09  EG_DATA_MODEL:..
17e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
17f0: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
1800: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  EL");...case GSC
1810: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
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 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
1840: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1850: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a  _TAG_CARD_APDU:.
1860: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1870: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29  _TAG_CARD_APDU")
1880: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1890: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a  AG_REDIRECTION:.
18a0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
18b0: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
18c0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
18d0: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75  _TAG_CT:....retu
18e0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54  rn("GSCIS_TAG_CT
18f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1900: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75  _TAG_ST:....retu
1910: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54  rn("GSCIS_TAG_ST
1920: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1930: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09  _TAG_NEXTCCC:...
1940: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
1950: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09  AG_NEXTCCC");...
1960: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46  case GSCIS_TAG_F
1970: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
1980: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45  "GSCIS_TAG_FNAME
1990: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
19a0: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_MNAME:....r
19b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
19c0: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _MNAME");...case
19d0: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45   GSCIS_TAG_LNAME
19e0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
19f0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a  IS_TAG_LNAME");.
1a00: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1a10: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75  _SUFFIX:....retu
1a20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55  rn("GSCIS_TAG_SU
1a30: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47  FFIX");...case G
1a40: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
1a50: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
1a60: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f  "GSCIS_TAG_GOVT_
1a70: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
1a80: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
1a90: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
1aa0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29  CIS_TAG_BUREAU")
1ab0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1ac0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a  AG_BUREAU_CODE:.
1ad0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1ae0: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
1af0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1b00: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a  _TAG_DEPT_CODE:.
1b10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1b20: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29  _TAG_DEPT_CODE")
1b30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1b40: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74  AG_TITLE:....ret
1b50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54  urn("GSCIS_TAG_T
1b60: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ITLE");...case G
1b70: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
1b80: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  G:....return("GS
1b90: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47  CIS_TAG_BUILDING
1ba0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1bb0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
1bc0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  1:....return("GS
1bd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
1be0: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR1");...case G
1bf0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1c00: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR2:....return
1c10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1c20: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61  CE_ADDR2");...ca
1c30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
1c40: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74  ICE_CITY:....ret
1c50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1c60: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09  FFICE_CITY");...
1c70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1c80: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09  FFICE_STATE:....
1c90: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ca0: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29  G_OFFICE_STATE")
1cb0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1cc0: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09  AG_OFFICE_ZIP:..
1cd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1ce0: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29  TAG_OFFICE_ZIP")
1cf0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1d00: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52  AG_OFFICE_COUNTR
1d10: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1d20: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
1d30: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65  OUNTRY");...case
1d40: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
1d50: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75  E_PHONE:....retu
1d60: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
1d70: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09  FICE_PHONE");...
1d80: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1d90: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a  FFICE_PHONE_EXT:
1da0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1db0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
1dc0: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65  NE_EXT");...case
1dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
1de0: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e  E_FAX:....return
1df0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1e00: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65  CE_FAX");...case
1e10: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
1e20: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75  E_EMAIL:....retu
1e30: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
1e40: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09  FICE_EMAIL");...
1e50: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1e60: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72  FFICE_ROOM:....r
1e70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1e80: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a  _OFFICE_ROOM");.
1e90: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1ea0: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a  _NONGOV_AGENCY:.
1eb0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1ec0: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
1ed0: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
1ee0: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47  IS_TAG_SSN_DESIG
1ef0: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e  NATOR:....return
1f00: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  ("GSCIS_TAG_SSN_
1f10: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09  DESIGNATOR");...
1f20: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
1f30: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  SN:....return("G
1f40: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a  SCIS_TAG_SSN");.
1f50: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1f60: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28  _DOB:....return(
1f70: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29  "GSCIS_TAG_DOB")
1f80: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1f90: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65  AG_GENDER:....re
1fa0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1fb0: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65  GENDER");...case
1fc0: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
1fd0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
1fe0: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29  CIS_TAG_USERID")
1ff0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2000: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65  AG_DOMAIN:....re
2010: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2020: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65  DOMAIN");...case
2030: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
2040: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORD:....return("
2050: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
2060: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RD");...case GSC
2070: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a  IS_TAG_ISSUERID:
2080: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2090: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29  S_TAG_ISSUERID")
20a0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
20b0: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74  AG_SERNO:....ret
20c0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
20d0: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47  ERNO");...case G
20e0: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44  SCIS_TAG_ISSUE_D
20f0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2100: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
2110: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
2120: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2130: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2140: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52  "GSCIS_TAG_EXPIR
2150: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
2160: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
2170: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
2180: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
2190: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TYPE");...case G
21a0: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
21b0: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  Y_CODE:....retur
21c0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43  n("GSCIS_TAG_SEC
21d0: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09  URITY_CODE");...
21e0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
21f0: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65  ARDID_AID:....re
2200: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2210: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09  CARDID_AID");...
2220: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2230: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72  ERTIFICATE:....r
2240: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2250: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a  _CERTIFICATE");.
2260: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2270: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
2280: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2290: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
22a0: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
22b0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
22c0: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
22d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
22e0: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
22f0: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  TE");..}...retur
2300: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
2310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
2320: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
2330: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
2340: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f  O_STR(LONG retco
2350: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72  de) {..switch (r
2360: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65  etcode) {...case
2370: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
2380: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2390: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a  RD_S_SUCCESS");.
23a0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
23b0: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
23c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
23d0: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
23e0: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49   SCARD_E_CANT_DI
23f0: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  SPOSE:....return
2400: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  ("SCARD_E_CANT_D
2410: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65  ISPOSE");...case
2420: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
2430: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09  CIENT_BUFFER:...
2440: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2450: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
2460: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  FFER");...case S
2470: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
2480: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  TR:....return("S
2490: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
24a0: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  TR");...case SCA
24b0: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
24c0: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DLE:....return("
24d0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
24e0: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65  HANDLE");...case
24f0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
2500: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72  _PARAMETER:....r
2510: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
2520: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
2530: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2540: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
2550: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
2560: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
2570: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53  RGET");...case S
2580: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
2590: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
25a0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
25b0: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
25c0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f   SCARD_E_NO_MEMO
25d0: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RY:....return("S
25e0: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
25f0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2600: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
2610: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
2620: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
2630: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
2640: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a  CARD_E_TIMEOUT:.
2650: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2660: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09  _E_TIMEOUT");...
2670: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41  case SCARD_E_SHA
2680: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  RING_VIOLATION:.
2690: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
26a0: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
26b0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53  TION");...case S
26c0: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43  CARD_E_NO_SMARTC
26d0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
26e0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
26f0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
2700: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43  CARD_E_UNKNOWN_C
2710: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
2720: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
2730: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
2740: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
2750: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e  MATCH:....return
2760: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  ("SCARD_E_PROTO_
2770: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61  MISMATCH");...ca
2780: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  se SCARD_E_NOT_R
2790: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  EADY:....return(
27a0: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41  "SCARD_E_NOT_REA
27b0: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  DY");...case SCA
27c0: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43  RD_E_SYSTEM_CANC
27d0: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
27e0: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  ("SCARD_E_SYSTEM
27f0: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
2800: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
2810: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09  _TRANSACTED:....
2820: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2830: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29  NOT_TRANSACTED")
2840: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2850: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
2860: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
2870: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
2880: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09  NAVAILABLE");...
2890: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53  case SCARD_W_UNS
28a0: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09  UPPORTED_CARD:..
28b0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
28c0: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
28d0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
28e0: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
28f0: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  E_CARD:....retur
2900: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  n("SCARD_W_UNRES
2910: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a  PONSIVE_CARD");.
2920: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
2930: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09  NPOWERED_CARD:..
2940: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2950: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
2960: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2970: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09  _W_RESET_CARD:..
2980: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2990: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a  W_RESET_CARD");.
29a0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
29b0: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09  EMOVED_CARD:....
29c0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
29d0: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a  REMOVED_CARD");.
29e0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
29f0: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09  CI_TOO_SMALL:...
2a00: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2a10: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  _PCI_TOO_SMALL")
2a20: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2a30: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
2a40: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
2a50: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
2a60: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
2a70: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50  case SCARD_E_DUP
2a80: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09  LICATE_READER:..
2a90: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
2aa0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
2ab0: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
2ac0: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50  RD_E_CARD_UNSUPP
2ad0: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
2ae0: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  ("SCARD_E_CARD_U
2af0: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
2b00: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
2b10: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75  SERVICE:....retu
2b20: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
2b30: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65  ERVICE");...case
2b40: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45   SCARD_E_SERVICE
2b50: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74  _STOPPED:....ret
2b60: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52  urn("SCARD_E_SER
2b70: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a  VICE_STOPPED");.
2b80: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
2b90: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
2ba0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
2bb0: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
2bc0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2bd0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41  _UNSUPPORTED_FEA
2be0: 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TURE:....return(
2bf0: 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f  "SCARD_E_UNSUPPO
2c00: 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a  RTED_FEATURE");.
2c10: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  .}...return("UNK
2c20: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
2c30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
2c40: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2c50: 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e  OBJID_TO_STR(uin
2c60: 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09  t16_t objid) {..
2c70: 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b  switch (objid) {
2c80: 0a 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a  ...case 0x2000:.
2c90: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
2ca0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
2cb0: 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73  RALINFO");...cas
2cc0: 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74  e 0x2100:....ret
2cd0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
2ce0: 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41  OBJID_PROPERSONA
2cf0: 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20  LINFO");...case 
2d00: 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x3000:....retur
2d10: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2d20: 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f  JID_ACCESSCONTRO
2d30: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30  L");...case 0x40
2d40: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
2d50: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
2d60: 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20  LOGIN");...case 
2d70: 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x5000:....retur
2d80: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2d90: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a  JID_CARDINFO");.
2da0: 09 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09  ..case 0x6000:..
2db0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
2dc0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45  _TLV_OBJID_BIOME
2dd0: 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20  TRICS");...case 
2de0: 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x7000:....retur
2df0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2e00: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
2e10: 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  RT");...case 0x0
2e20: 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  200:....return("
2e30: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
2e40: 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09  _CAC_PERSON");..
2e50: 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09  .case 0x0202:...
2e60: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
2e70: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45  TLV_OBJID_CAC_BE
2e80: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65  NEFITS");...case
2e90: 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75   0x0203:....retu
2ea0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2eb0: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
2ec0: 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65  NEFITS");...case
2ed0: 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75   0x0201:....retu
2ee0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2ef0: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e  BJID_CAC_PERSONN
2f00: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  EL");...case 0x0
2f10: 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  2FE:....return("
2f20: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
2f30: 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a  _CAC_PKICERT");.
2f40: 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e  .}....return("UN
2f50: 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74  KNOWN");.}..stat
2f60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
2f70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2f80: 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28  _APPTYPE_TO_STR(
2f90: 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29  uint8_t apptype)
2fa0: 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74   {..switch (appt
2fb0: 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78  ype) {...case 0x
2fc0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e  00:....return("N
2fd0: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ONE");...case 0x
2fe0: 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  01:....return("C
2ff0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3000: 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20  NERIC");...case 
3010: 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x02:....return(
3020: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
3030: 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SKI");...case 0x
3040: 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  03:....return("C
3050: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
3060: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54  NERIC | CACKEY_T
3070: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09  LV_APP_SKI");...
3080: 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65  case 0x04:....re
3090: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
30a0: 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61  _APP_PKI");...ca
30b0: 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75  se 0x05:....retu
30c0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
30d0: 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43  PP_GENERIC | CAC
30e0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
30f0: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a  );...case 0x06:.
3100: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3110: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3120: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3130: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3140: 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  7:....return("CA
3150: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3160: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
3170: 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b  V_APP_SKI | CACK
3180: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
3190: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49  ;..}...return("I
31a0: 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 23 20 20  NVALID");.}..#  
31b0: 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29  define malloc(x)
31c0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
31d0: 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66  NC_MALLOC(x, __f
31e0: 75 6e 63 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  unc__).#  define
31f0: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
3200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
3210: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
3220: 5f 66 75 6e 63 5f 5f 29 0a 23 65 6c 73 65 0a 23  _func__).#else.#
3230: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
3250: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
3260: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
3270: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
3280: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
3290: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 45 52  CACKEY_DEBUG_PER
32a0: 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23 20 20 64  ROR(x) /**/.#  d
32b0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
32c0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
32d0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
32e0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
32f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3300: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
3310: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
3320: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
3330: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3340: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
3350: 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c  x) "DEBUG_DISABL
3360: 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41  ED".#  define CA
3370: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3380: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 78  APPTYPE_TO_STR(x
3390: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
33a0: 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74 72 75 63  D".#endif..struc
33b0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
33c0: 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73 69 67 6e  entity {..unsign
33d0: 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37  ed char applet[7
33e0: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ];..uint16_t fil
33f0: 65 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  e;...unsigned ch
3400: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 73 69 7a  ar *label;...siz
3410: 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f  e_t certificate_
3420: 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  len;..unsigned c
3430: 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
3440: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3450: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
3460: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
3470: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
3480: 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52  ntity;...CK_ATTR
3490: 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65  IBUTE *attribute
34a0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74  s;..CK_ULONG att
34b0: 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d  ributes_count;.}
34c0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
34d0: 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20  _session {..int 
34e0: 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f  active;...CK_SLO
34f0: 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43  T_ID slotID;...C
3500: 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09  K_STATE state;..
3510: 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a  CK_FLAGS flags;.
3520: 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69  .CK_ULONG ulDevi
3530: 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49  ceError;..CK_VOI
3540: 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69  D_PTR pApplicati
3550: 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e  on;..CK_NOTIFY N
3560: 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20  otify;...struct 
3570: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
3580: 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
3590: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
35a0: 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
35b0: 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76  int search_activ
35c0: 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  e;..CK_ATTRIBUTE
35d0: 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72  _PTR search_quer
35e0: 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61  y;..CK_ULONG sea
35f0: 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
3600: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3610: 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a  search_curr_id;.
3620: 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76  ..int sign_activ
3630: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
3640: 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61  _TYPE sign_mecha
3650: 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50  nism;..CK_BYTE_P
3660: 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e  TR sign_buf;..un
3670: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3680: 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e  _buflen;..unsign
3690: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66  ed long sign_buf
36a0: 75 73 65 64 3b 0a 0a 09 69 6e 74 20 64 65 63 72  used;...int decr
36b0: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
36c0: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
36d0: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
36e0: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
36f0: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
3700: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
3710: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
3720: 3b 0a 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  ;..};..struct ca
3730: 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69 6e 74  ckey_slot {..int
3740: 20 61 63 74 69 76 65 3b 0a 0a 09 63 68 61 72 20   active;...char 
3750: 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09  *pcsc_reader;...
3760: 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63 6f  int pcsc_card_co
3770: 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44 48  nnected;..SCARDH
3780: 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64 3b  ANDLE pcsc_card;
3790: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
37a0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
37b0: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
37c0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
37d0: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
37e0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
37f0: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
3800: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
3810: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
3820: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
3830: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3840: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
3850: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
3860: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
3870: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
3880: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
3890: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
38a0: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
38b0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
38c0: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
38d0: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
38e0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
38f0: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
3900: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
3910: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3920: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
3930: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
3940: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
3950: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
3960: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
3970: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3980: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
3990: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
39a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
39b0: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
39c0: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
39d0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
39e0: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
39f0: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
3a00: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3a10: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
3a20: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
3a30: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3a40: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
3a50: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
3a60: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
3a70: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
3a80: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
3a90: 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b  NT    = 2,..CACK
3aa0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41  EY_PCSC_S_TOKENA
3ab0: 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09  BSENT     = 1,..
3ac0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
3ae0: 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  0,..CACKEY_PCSC_
3af0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20  E_GENERIC       
3b00: 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f    = -1,..CACKEY_
3b10: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20  PCSC_E_BADPIN   
3b20: 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41         = -2,..CA
3b30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
3b40: 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33  ED          = -3
3b50: 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a  ,.} cackey_ret;.
3b60: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
3b70: 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e  lv_cardurl {..un
3b80: 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20  signed char     
3b90: 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b     rid[5];..cack
3ba0: 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20  ey_tlv_apptype  
3bb0: 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65   apptype;..cacke
3bc0: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20  y_tlv_objectid  
3bd0: 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65  objectid;..cacke
3be0: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20  y_tlv_objectid  
3bf0: 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64  appid;..unsigned
3c00: 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69 6e   char        pin
3c10: 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  id;.};..struct c
3c20: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
3c30: 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ;.struct cackey_
3c40: 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69  tlv_entity {..ui
3c50: 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65  nt8_t tag;..size
3c60: 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69  _t length;...uni
3c70: 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c  on {...void *val
3c80: 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63  ue;...struct cac
3c90: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
3ca0: 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a  *value_cardurl;.
3cb0: 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f  ..uint8_t value_
3cc0: 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75  byte;..};...stru
3cd0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
3ce0: 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a  tity *_next;.};.
3cf0: 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61  ./* CACKEY Globa
3d00: 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61  l Handles */.sta
3d10: 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79  tic void *cackey
3d20: 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  _biglock = NULL;
3d30: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
3d40: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61  ackey_session ca
3d50: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32  ckey_sessions[12
3d60: 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  8];.static struc
3d70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61  t cackey_slot ca
3d80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b  ckey_slots[128];
3d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
3da0: 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
3db0: 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63   0;.static int c
3dc0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
3dd0: 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49  it = 0;.CK_C_INI
3de0: 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63  TIALIZE_ARGS cac
3df0: 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43  key_args;../* PC
3e00: 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  SC Global Handle
3e10: 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43  s */.static LPSC
3e20: 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65  ARDCONTEXT cacke
3e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
3e40: 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e  NULL;..static un
3e50: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
3e60: 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f  ey_getversion(vo
3e70: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e  id) {..static un
3e80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76  signed long retv
3e90: 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67  al = 255;..unsig
3ea0: 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d  ned long major =
3eb0: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f   0;..unsigned lo
3ec0: 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63  ng minor = 0;..c
3ed0: 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d  har *major_str =
3ee0: 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69   NULL;..char *mi
3ef0: 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  nor_str = NULL;.
3f00: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
3f10: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
3f20: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
3f30: 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45  = 255) {...CACKE
3f40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
3f50: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20  Returning 0x%lx 
3f60: 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76  (cached).", retv
3f70: 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72  al);....return(r
3f80: 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
3f90: 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  val = 0;..#ifdef
3fa0: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
3fb0: 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73  .        major_s
3fc0: 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52  tr = PACKAGE_VER
3fd0: 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72  SION;..if (major
3fe0: 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20  _str) {..       
3ff0: 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c   major = strtoul
4000: 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e  (major_str, &min
4010: 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09  or_str, 10);....
4020: 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b  if (minor_str) {
4030: 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74  ....minor = strt
4040: 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20  oul(minor_str + 
4050: 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09  1, NULL, 10);...
4060: 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  }..}...retval = 
4070: 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20  (major << 16) | 
4080: 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65  (minor << 8);.#e
4090: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
40a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
40b0: 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65  rning 0x%lx", re
40c0: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
40d0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50  retval);.}../* P
40e0: 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e  C/SC Related Fun
40f0: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
4100: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
4110: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
4120: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4130: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
4140: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
4150: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
4160: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
4170: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
4180: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
4190: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
41a0: 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a  from all cards..
41b0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static 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 20 7b 0a 09 75 69 6e 74 33 32 5f 74  oid) {..uint32_t
41f0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
4200: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4210: 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69  led.");...for (i
4220: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
4230: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
4240: 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
4250: 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
4260: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
4270: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4280: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
4290: 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45  cted) {....CACKE
42a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
42b0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
42c0: 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75  %lu) called", (u
42d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
42e0: 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73  x);.....SCardDis
42f0: 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73  connect(cackey_s
4300: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
4310: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
4320: 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  _CARD);...}....c
4330: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4340: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
4350: 63 74 65 64 20 3d 20 30 3b 0a 09 7d 0a 0a 09 43  cted = 0;..}...C
4360: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4370: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  TF("Returning");
4380: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
4390: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
43a0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
43b0: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
43c0: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
43d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
43e0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
43f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
4400: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
4410: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
4420: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
4430: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
4440: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
4450: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
4460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
4470: 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43  nnects to the PC
4480: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
4490: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74  anager and updat
44a0: 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c  es the. *     gl
44b0: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a  obal handle.. *.
44c0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
44d0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
44e0: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20  c_connect(void) 
44f0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73  {..LONG scard_es
4500: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23  t_context_ret;.#
4510: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
4520: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
4530: 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c  LONG scard_isval
4540: 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  id_ret;.#endif..
4550: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4560: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
4570: 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
4580: 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c  sc_handle == NUL
4590: 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63  L) {...cackey_pc
45a0: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c  sc_handle = mall
45b0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  oc(sizeof(*cacke
45c0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b  y_pcsc_handle));
45d0: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
45e0: 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c  sc_handle == NUL
45f0: 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
4600: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4610: 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61  l to malloc() fa
4620: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
4630: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
4640: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
4650: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
4660: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
4670: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
4680: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
4690: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
46a0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
46b0: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
46c0: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
46d0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
46e0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
46f0: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
4700: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
4710: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
4720: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
4730: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4740: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
4750: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
4760: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4770: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
4780: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
4790: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
47a0: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
47b0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
47c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
47d0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
47e0: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
47f0: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
4800: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
4810: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
4820: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
4830: 6e 64 6c 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ndle);.....cacke
4840: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
4850: 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65  ct_all();.....re
4860: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
4870: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
4880: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ..}..#ifdef HAVE
4890: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
48a0: 54 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42  TEXT..CACKEY_DEB
48b0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
48c0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29  IsValidContext()
48d0: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72   called");..scar
48e0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20  d_isvalid_ret = 
48f0: 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74  SCardIsValidCont
4900: 65 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ext(*cackey_pcsc
4910: 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73  _handle);..if (s
4920: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
4930: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
4940: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
4950: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
4960: 6e 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20  ndle has become 
4970: 69 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73  invalid (SCardIs
4980: 56 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25  ValidContext = %
4990: 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74  s/%li), trying t
49a0: 6f 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e  o re-establish..
49b0: 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
49c0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
49d0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61  O_STR(scard_isva
49e0: 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  lid_ret), (long)
49f0: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
4a00: 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  et);....CACKEY_D
4a10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
4a20: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
4a30: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
4a40: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
4a50: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
4a60: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
4a70: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
4a80: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
4a90: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4aa0: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
4ab0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
4ac0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
4ad0: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
4ae0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4af0: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
4b00: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
4b10: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
4b20: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
4b30: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
4b40: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
4b50: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
4b60: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4b70: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
4b80: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
4b90: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
4ba0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
4bb0: 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  e);.....cackey_s
4bc0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
4bd0: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
4be0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
4bf0: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
4c00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4c10: 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73  INTF("Handle has
4c20: 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69   been re-establi
4c30: 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69  shed");..}.#endi
4c40: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
4c50: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
4c60: 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74  ully connected t
4c70: 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69  o PC/SC, returni
4c80: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
4c90: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
4ca0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
4cb0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
4cc0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
4cd0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
4ce0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
4cf0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
4d00: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
4d10: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
4d20: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
4d30: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
4d40: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
4d50: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
4d60: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
4d70: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
4d80: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
4d90: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
4da0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
4db0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
4dc0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
4dd0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
4de0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
4df0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
4e00: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
4e10: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
4e20: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
4e30: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
4e40: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
4e50: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
4e60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4e70: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
4e80: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
4e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4ea0: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
4eb0: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
4ec0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
4ed0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
4ee0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
4ef0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
4f00: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
4f10: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
4f20: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
4f30: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
4f40: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
4f50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4f60: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
4f70: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
4f80: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
4f90: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
4fa0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
4fb0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
4fc0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
4fd0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
4fe0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
4ff0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
5000: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
5010: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
5020: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
5030: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
5040: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
5050: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
5060: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
5070: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5080: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
5090: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
50a0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
50b0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
50c0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
50d0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
50e0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
50f0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
5100: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
5110: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
5120: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
5130: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
5140: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
5150: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
5160: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
5170: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
5180: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
5190: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
51a0: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
51b0: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
51c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
51d0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
51e0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
51f0: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 7d  onnected = 1;..}
5200: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5210: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
5220: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5230: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
5240: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
5250: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
5260: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
5270: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
5280: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
5290: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
52a0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
52b0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
52c0: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
52d0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
52e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
52f0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
5300: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5310: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
5320: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
5330: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20  OTES. *     The 
5340: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75  transaction shou
5350: 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64  ld be terminated
5360: 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65   using "cackey_e
5370: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a  nd_transaction".
5380: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
5390: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
53a0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
53b0: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
53c0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
53d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
53e0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47  _conn_ret;..LONG
53f0: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
5400: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
5410: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
5420: 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e  ");...cackey_con
5430: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  n_ret = cackey_c
5440: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
5450: 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63  );..if (cackey_c
5460: 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  onn_ret != CACKE
5470: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
5480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5490: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
54a0: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
54b0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
54c0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
54d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
54e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63  ENERIC);..}...sc
54f0: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20  ard_trans_ret = 
5500: 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61  SCardBeginTransa
5510: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
5520: 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61  _card);..if (sca
5530: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20  rd_trans_ret != 
5540: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
5550: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
5560: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
5570: 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61   to begin transa
5580: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
5590: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
55a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
55b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
55c0: 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  }...return(CACKE
55d0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
55e0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
55f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
5600: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
5610: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
5620: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5630: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
5640: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
5650: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
5660: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
5670: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
5680: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
5690: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
56a0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
56b0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
56c0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
56d0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
56e0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
56f0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
5700: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
5710: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
5720: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
5730: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
5740: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
5750: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
5760: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
5770: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5780: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
5790: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
57a0: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
57b0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
57c0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
57d0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
57e0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
57f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5800: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
5810: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
5820: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
5830: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
5840: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
5850: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  RIC);..}...scard
5860: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
5870: 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  rdEndTransaction
5880: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
5890: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
58a0: 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  RD);..if (scard_
58b0: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
58c0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
58d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
58e0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
58f0: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
5900: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
5910: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
5920: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
5930: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72  GENERIC);..}...r
5940: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5950: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41  C_S_OK);.}../* A
5960: 50 44 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63  PDU Related Func
5970: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53  tions */./*. * S
5980: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
5990: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
59a0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
59b0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
59c0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
59d0: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
59e0: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
59f0: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
5a00: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
5a10: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
5a20: 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67  d char lc, unsig
5a30: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20  ned char *data, 
5a40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
5a50: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
5a60: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
5a70: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
5a80: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
5a90: 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  len);. *. * ARGU
5aa0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
5ab0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
5ac0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
5ad0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
5ae0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
5af0: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
5b00: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
5b10: 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c   Class (GSCIS_CL
5b20: 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47  ASS_ISO7816 or G
5b30: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
5b40: 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20  L_PLATFORM. *   
5b50: 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20        usually), 
5b60: 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20  (CLA). *. *     
5b70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
5b80: 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20  struction. *    
5b90: 20 20 20 20 20 41 50 44 55 20 49 6e 73 74 72 75       APDU Instru
5ba0: 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20  ction (INS). *. 
5bb0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
5bc0: 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20  har p1. *       
5bd0: 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72    APDU Parameter
5be0: 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20   1 (P1). *. *   
5bf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5c00: 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  p2. *         AP
5c10: 44 55 20 50 61 72 61 6d 65 74 65 72 20 32 20 28  DU Parameter 2 (
5c20: 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  P2). *. *     un
5c30: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20  signed char lc. 
5c40: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c  *         APDU L
5c50: 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74  ength of Content
5c60: 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73   (Lc) -- this is
5c70: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22   the length of "
5c80: 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20  data". *        
5c90: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20   parameter.  If 
5ca0: 22 64 61 74 61 22 20 69 73 20 73 70 65 63 69 66  "data" is specif
5cb0: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69  ied as NULL, thi
5cc0: 73 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c  s parameter will
5cd0: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 69  . *         be i
5ce0: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
5cf0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5d00: 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20  *data. *        
5d10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
5d20: 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20  er to send.  It 
5d30: 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62  should be "Lc" b
5d40: 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20  ytes long.  If. 
5d50: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
5d60: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63  ied as NULL, "Lc
5d70: 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65  " will not be se
5d80: 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66  nt, and this buf
5d90: 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20  fer will be. *  
5da0: 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a         ignored..
5db0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
5dc0: 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20  ed char le. *   
5dd0: 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74        APDU Lengt
5de0: 68 20 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e  h of Expectation
5df0: 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73   (Le) -- this is
5e00: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
5e10: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78  he. *         ex
5e20: 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49  pected reply.  I
5e30: 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66  f this is specif
5e40: 69 65 64 20 61 73 20 30 20 74 68 65 6e 20 69 74  ied as 0 then it
5e50: 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20   will not. *    
5e60: 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a       be sent.. *
5e70: 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74  . *     uint16_t
5e80: 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20   *respcode. *   
5e90: 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e        [OUT] Poin
5ea0: 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f  ter to storage o
5eb0: 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20  f APDU response 
5ec0: 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73 20 69  code.  If this i
5ed0: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  s. *         spe
5ee0: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
5ef0: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64  the response cod
5f00: 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72  e will be discar
5f10: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ded.. *. *     u
5f20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65  nsigned char *re
5f30: 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20  spdata. *       
5f40: 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20    [OUT] Pointer 
5f50: 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50  to storage of AP
5f60: 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61  DU response data
5f70: 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a  .  If this is. *
5f80: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
5f90: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ed as NULL, the 
5fa0: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69  response data wi
5fb0: 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  ll be discarded.
5fc0: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
5fd0: 74 68 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65  the "respdata_le
5fe0: 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  n" parameter is 
5ff0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
6000: 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72 0a 20  L, this buffer. 
6010: 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e  *         will n
6020: 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  ot be updated.. 
6030: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
6040: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a  *respdata_len. *
6050: 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55           [IN, OU
6060: 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69  T] Pointer initi
6070: 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  aling containing
6080: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6090: 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20   "respdata". *  
60a0: 20 20 20 20 20 20 20 62 75 66 66 65 72 2e 20 20         buffer.  
60b0: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
60c0: 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f  , the pointed to
60d0: 20 76 61 6c 75 65 20 69 73 20 75 70 64 61 74 65   value is update
60e0: 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20  d to the. *     
60f0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79      number of by
6100: 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  tes written to t
6110: 68 65 20 62 75 66 66 65 72 2e 20 20 49 66 20 74  he buffer.  If t
6120: 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64  his is specified
6130: 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e   as. *         N
6140: 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74  ULL, it will not
6150: 20 62 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64   be updated, and
6160: 20 22 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c   "respdata" will
6170: 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73   be ignored caus
6180: 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74  ing. *         t
6190: 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61  he response data
61a0: 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
61b0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
61c0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
61d0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
61e0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
61f0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6200: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
6210: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
6220: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6230: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
6240: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
6250: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
6260: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
6270: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
6280: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
6290: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
62a0: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
62b0: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
62c0: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
62d0: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
62e0: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
62f0: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
6300: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
6310: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
6320: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
6330: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
6340: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6350: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
6360: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
6370: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
6380: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
6390: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
63a0: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
63b0: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
63c0: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
63d0: 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67  d char lc, unsig
63e0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20  ned char *data, 
63f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
6400: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
6410: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
6420: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
6430: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
6440: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
6450: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
6460: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
6470: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
6480: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57  espdata_len;..DW
6490: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44  ORD protocol;..D
64a0: 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72  WORD xmit_len, r
64b0: 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ecv_len;..LONG s
64c0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73  card_xmit_ret, s
64d0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
64e0: 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b  ..BYTE xmit_buf[
64f0: 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b  1024], recv_buf[
6500: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63  1024];..int pcsc
6510: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63  _connect_ret, pc
6520: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a  sc_getresp_ret;.
6530: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
6540: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6550: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
6560: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
6570: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6580: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
6590: 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09  pecified.");....
65a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
65b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
65c0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
65d0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
65e0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
65f0: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
6600: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
6610: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
6620: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6630: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
6640: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
6650: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6660: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
6670: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6680: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6690: 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09  /* Transmit */..
66a0: 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78  xmit_len = 0;..x
66b0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
66c0: 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d  ++] = class;..xm
66d0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
66e0: 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e  +] = instruction
66f0: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ;..xmit_buf[xmit
6700: 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78  _len++] = p1;..x
6710: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
6720: 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64  ++] = p2;..if (d
6730: 61 74 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75  ata) {...xmit_bu
6740: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
6750: 6c 63 3b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d  lc;...for (idx =
6760: 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64   0; idx < lc; id
6770: 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62  x++) {....xmit_b
6780: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
6790: 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a   data[idx];...}.
67a0: 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30  .}...if (le != 0
67b0: 78 30 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75  x00) {...xmit_bu
67c0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
67d0: 6c 65 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  le;..}...CACKEY_
67e0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
67f0: 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20  Sending APDU:", 
6800: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
6810: 65 6e 29 3b 0a 0a 09 72 65 63 76 5f 6c 65 6e 20  en);...recv_len 
6820: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
6830: 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f  f);..scard_xmit_
6840: 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73  ret = SCardTrans
6850: 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  mit(slot->pcsc_c
6860: 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f 54  ard, SCARD_PCI_T
6870: 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  0, xmit_buf, xmi
6880: 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43 49  t_len, SCARD_PCI
6890: 5f 54 31 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  _T1, recv_buf, &
68a0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 69 66 20 28  recv_len);..if (
68b0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
68c0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
68d0: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
68e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
68f0: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
6900: 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72  to card (SCardTr
6910: 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c  ansmit() = %s/%l
6920: 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
6930: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6940: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
6950: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
6960: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
6970: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  it_ret);....if (
6980: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
6990: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
69a0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
69b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
69c0: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
69d0: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
69e0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
69f0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
6a00: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
6a10: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
6a20: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
6a30: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
6a40: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
6a50: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
6a60: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
6a70: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
6a80: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
6a90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6aa0: 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65  NTF("Reset succe
6ab0: 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69  ssful, retransmi
6ac0: 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 73 63 61  tting");.....sca
6ad0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43  rd_xmit_ret = SC
6ae0: 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74  ardTransmit(slot
6af0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
6b00: 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74 5f  RD_PCI_T0, xmit_
6b10: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 53  buf, xmit_len, S
6b20: 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 72 65 63  CARD_PCI_T0, rec
6b30: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
6b40: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
6b50: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
6b60: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6b70: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
6b80: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61  UG_PRINTF("Retra
6b90: 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65  nsmit failed, re
6ba0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6bb0: 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e  re after disconn
6bc0: 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20  ecting the card 
6bd0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d  (SCardTransmit =
6be0: 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45   %s/%li)", CACKE
6bf0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
6c00: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
6c10: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c  rd_xmit_ret), (l
6c20: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
6c30: 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72  ret);.......SCar
6c40: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
6c50: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
6c60: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b 0a  RD_RESET_CARD);.
6c70: 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  .....slot->pcsc_
6c80: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
6c90: 20 30 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e   0;.......return
6ca0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6cb0: 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d 0a 09  ENERIC);.....}..
6cc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
6cd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6ce0: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
6cf0: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53  g card");......S
6d00: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
6d10: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
6d20: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
6d30: 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  );.....slot->pcs
6d40: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6d50: 20 3d 20 30 3b 0a 0a 09 09 09 09 43 41 43 4b 45   = 0;......CACKE
6d60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6d70: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
6d80: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
6d90: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6da0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 7d 0a  _GENERIC);....}.
6db0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
6dc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6dd0: 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67  F("Disconnecting
6de0: 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61   card");.....SCa
6df0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
6e00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
6e10: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b  ARD_RESET_CARD);
6e20: 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
6e30: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
6e40: 30 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  0;.....CACKEY_DE
6e50: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
6e60: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6e70: 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
6e80: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6e90: 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  RIC);...}..}...C
6ea0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6eb0: 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56  TBUF("Returned V
6ec0: 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66  alue:", recv_buf
6ed0: 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69  , recv_len);...i
6ee0: 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29  f (recv_len < 2)
6ef0: 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20   {.../* Minimal 
6f00: 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20  response length 
6f10: 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75  is 2 bytes, retu
6f20: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6f30: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
6f40: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
6f50: 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  nse too small, r
6f60: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6f70: 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20  ure (recv_len = 
6f80: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
6f90: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
6fa0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
6fb0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6fc0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  C);..}.../* Dete
6fd0: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
6fe0: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
6ff0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
7000: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
7010: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
7020: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
7030: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
7040: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
7050: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
7060: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
7070: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
7080: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
7090: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
70a0: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
70b0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
70c0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
70d0: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
70e0: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
70f0: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
7100: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
7110: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
7120: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
7130: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
7140: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
7150: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
7160: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
7170: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
7180: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7190: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
71a0: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
71b0: 66 66 65 72 22 2c 20 28 75 6e 73 69 67 6e 65 64  ffer", (unsigned
71c0: 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f   long) bytes_to_
71d0: 63 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63 70 79  copy);....memcpy
71e0: 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f  (respdata, recv_
71f0: 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  buf, bytes_to_co
7200: 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20  py);...respdata 
7210: 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  += bytes_to_copy
7220: 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c  ;....*respdata_l
7230: 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en = bytes_to_co
7240: 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61  py;...tmp_respda
7250: 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f  ta_len -= bytes_
7260: 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65  to_copy;..} else
7270: 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65   {...if (recv_le
7280: 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  n != 0) {....CAC
7290: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
72a0: 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20  ("Throwing away 
72b0: 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65  %lu bytes, nowhe
72c0: 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22  re to put them!"
72d0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
72e0: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d  ) recv_len);...}
72f0: 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ..}...if (major_
7300: 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09  rc == 0x61) {...
7310: 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45  /* We need to RE
7320: 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  AD */...CACKEY_D
7330: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66  EBUG_PRINTF("Buf
7340: 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72 65  fer read require
7350: 64 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67 65 74  d");....pcsc_get
7360: 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65  resp_ret = cacke
7370: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
7380: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
7390: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
73a0: 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c  TR_GET_RESPONSE,
73b0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20   0x00, 0x00, 0, 
73c0: 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20  NULL, minor_rc, 
73d0: 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61  respcode, respda
73e0: 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74  ta, &tmp_respdat
73f0: 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 70 63  a_len);...if (pc
7400: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21  sc_getresp_ret !
7410: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
7420: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
7430: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
7440: 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64  ffer read failed
7450: 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  !  Returning in 
7460: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72  failure");.....r
7470: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7480: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
7490: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
74a0: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
74b0: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
74c0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
74d0: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
74e0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
74f0: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20  ning in success 
7500: 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d  (buffer read com
7510: 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75  plete)");...retu
7520: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
7530: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6d  _OK);..}...if (m
7540: 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29  ajor_rc == 0x90)
7550: 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20   {.../* Success 
7560: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
7570: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
7580: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28  ing in success (
7590: 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29  major_rc = 0x90)
75a0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
75b0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
75c0: 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
75d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55  BUG_PRINTF("APDU
75e0: 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   Returned an err
75f0: 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  or, returning in
7600: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65   failure");...re
7610: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7620: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a  _E_GENERIC);.}..
7630: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
7640: 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61  *     ssize_t ca
7650: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
7660: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7670: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
7680: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
7690: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
76a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
76b0: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
76c0: 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a  tial_offset);. *
76d0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
76e0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
76f0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
7700: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
7710: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
7720: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
7730: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
7740: 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  r. *         [OU
7750: 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20  T] Buffer. *. * 
7760: 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74      size_t count
7770: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62  . *         Numb
7780: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
7790: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20  ttempt to read. 
77a0: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
77b0: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a  d char t_or_v. *
77c0: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
77d0: 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31  the T-buffer (01
77e0: 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30  ) or V-buffer (0
77f0: 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e  2) to read from.
7800: 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a    . *. *     siz
7810: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
7820: 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70  et. *         Sp
7830: 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74  ecify the offset
7840: 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65   to begin the re
7850: 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a  ad from. *. *. *
7860: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
7870: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
7880: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  on returns the n
7890: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
78a0: 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72  ctually read, or
78b0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a   -1 on error.. *
78c0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
78d0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
78e0: 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b  tic ssize_t cack
78f0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
7900: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7910: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
7920: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
7930: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
7940: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
7950: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
7960: 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 73 69  al_offset) {..si
7970: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c  ze_t offset = 0,
7980: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78   max_offset, max
7990: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65  _count;..unsigne
79a0: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09  d char cmd[2];..
79b0: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
79c0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
79d0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
79e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
79f0: 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74  ");...max_offset
7a00: 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63   = count;..max_c
7a10: 6f 75 6e 74 20 3d 20 32 35 32 3b 0a 0a 09 69 66  ount = 252;...if
7a20: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26   (t_or_v != 1 &&
7a30: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a   t_or_v != 2) {.
7a40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a50: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54  RINTF("Invalid T
7a60: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20   or V parameter 
7a70: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
7a80: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7a90: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
7aa0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20  ;..}...cmd[0] = 
7ab0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20  t_or_v;...while 
7ac0: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73  (1) {...if (offs
7ad0: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74  et >= max_offset
7ae0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
7af0: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
7b00: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  er too small, re
7b10: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20  turning what we 
7b20: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72  got...");.....br
7b30: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e  eak;...}....coun
7b40: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d  t = max_offset -
7b50: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63   offset;...if (c
7b60: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74  ount > max_count
7b70: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d  ) {....count = m
7b80: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09  ax_count;...}...
7b90: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b  .cmd[1] = count;
7ba0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
7bb0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
7bc0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
7bd0: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
7be0: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  M, GSCIS_INSTR_R
7bf0: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e  EAD_BUFFER, ((in
7c00: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
7c10: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30  ffset) >> 8) & 0
7c20: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66  xff, (initial_of
7c30: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26  fset + offset) &
7c40: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d   0xff, sizeof(cm
7c50: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26  d), cmd, 0x00, &
7c60: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
7c70: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e   + offset, &coun
7c80: 74 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  t);...if (send_r
7c90: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
7ca0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
7cb0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
7cc0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d  A86) {.....if (m
7cd0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b  ax_count == 1) {
7ce0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
7cf0: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e  .}......max_coun
7d00: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20  t = max_count / 
7d10: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  2;......continue
7d20: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
7d30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7d40: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
7d50: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
7d60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7d70: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
7d80: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74  );...}....offset
7d90: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66   += count;....if
7da0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f   (count < max_co
7db0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
7dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7dd0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75  hort read -- cou
7de0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20  nt = %i, cmd[1] 
7df0: 3d 20 25 69 22 2c 20 63 6f 75 6e 74 2c 20 63 6d  = %i", count, cm
7e00: 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b  d[1]);.....break
7e10: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
7e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7e30: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
7e40: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
7e50: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
7e60: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
7e70: 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29  ..return(offset)
7e80: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7e90: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
7ea0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
7eb0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
7ec0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7ed0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
7ee0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
7ef0: 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  aid_len);. *. * 
7f00: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7f10: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
7f20: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
7f30: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
7f40: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
7f50: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
7f60: 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20   char *aid. *   
7f70: 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e        Buffer con
7f80: 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49  taining Applet I
7f90: 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  D to select. *. 
7fa0: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64  *     size_t aid
7fb0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
7fc0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7fd0: 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70  in the "aid" (Ap
7fe0: 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74  plet ID) paramet
7ff0: 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  er. *. * RETURN 
8000: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8010: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8020: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8030: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8040: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8050: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8060: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
8070: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
8080: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8090: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
80a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
80b0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
80c0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
80d0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a  ze_t aid_len) {.
80e0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
80f0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8100: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
8110: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8120: 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74  PRINTBUF("Select
8130: 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69  ing applet:", ai
8140: 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73  d, aid_len);...s
8150: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
8160: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
8170: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
8180: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
8190: 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f  R_SELECT, GSCIS_
81a0: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
81b0: 4c 45 54 2c 20 30 78 30 43 2c 20 61 69 64 5f 6c  LET, 0x0C, aid_l
81c0: 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e  en, aid, 0x00, N
81d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
81e0: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
81f0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
8200: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
8210: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
8220: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
8230: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
8240: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
8250: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8260: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8270: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
8280: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
8290: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
82a0: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
82b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
82c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
82d0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
82e0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
82f0: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
8300: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8310: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
8320: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
8330: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
8340: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8350: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
8360: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
8370: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
8380: 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20  uint16_t ef. *  
8390: 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c         Elemental
83a0: 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a   File to select.
83b0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
83c0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
83d0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
83e0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
83f0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8400: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8410: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8420: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73  ES. *     This s
8430: 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e  elects an Elemen
8440: 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75  tary File (EF) u
8450: 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  nder the current
8460: 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20  ly selected. *  
8470: 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c     Dedicated Fil
8480: 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20  e (DF). *. *    
8490: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20   Typically this 
84a0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
84b0: 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f  selecting the co
84c0: 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73  rrect Applet (us
84d0: 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  ing. *     cacke
84e0: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29  y_select_applet)
84f0: 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a   for VM cards. *
8500: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
8510: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
8520: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
8530: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8540: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
8550: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
8560: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
8570: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
8580: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8590: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
85a0: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
85b0: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
85c0: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
85d0: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
85e0: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
85f0: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8610: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
8620: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
8630: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
8640: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
8650: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
8660: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
8670: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
8680: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
8690: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
86a0: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
86b0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
86c0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
86d0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
86e0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
86f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8700: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
8710: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
8720: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8730: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8740: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8750: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
8760: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
8770: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
8780: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
8790: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
87a0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
87b0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
87c0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
87d0: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
87e0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
87f0: 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  root);. *. * ARG
8800: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
8810: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
8820: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20  entity *root. * 
8830: 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20          Root of 
8840: 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20  the TLV list to 
8850: 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a  start freeing. *
8860: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
8870: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
8880: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
8890: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72  This function fr
88a0: 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b  ees the TLV link
88b0: 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e  ed listed return
88c0: 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22  ed from. *     "
88d0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22  cackey_read_tlv"
88e0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
88f0: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
8900: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
8910: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
8920: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
8930: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
8940: 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09  *curr, *next;...
8950: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
8960: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
8970: 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72  ...for (curr = r
8980: 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20  oot; curr; curr 
8990: 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74  = next) {...next
89a0: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a   = curr->_next;.
89b0: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d  ...switch (curr-
89c0: 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  >tag) {....case 
89d0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
89e0: 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43  BLE:....case GSC
89f0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
8a00: 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  TE:.....if (curr
8a10: 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  ->value) {......
8a20: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
8a30: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
8a40: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
8a50: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
8a60: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
8a70: 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09  ue_cardurl) {...
8a80: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
8a90: 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09  lue_cardurl);...
8aa0: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
8ab0: 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29  .}....free(curr)
8ac0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
8ad0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8ae0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
8af0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
8b00: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
8b10: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
8b20: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
8b30: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
8b40: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
8b50: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
8b60: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
8b70: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
8b80: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
8b90: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
8ba0: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
8bb0: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
8bc0: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
8bd0: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
8be0: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
8bf0: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
8c00: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
8c10: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
8c20: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
8c30: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
8c40: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
8c50: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c  ;..ssize_t tlen,
8c60: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20   vlen;..ssize_t 
8c70: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
8c80: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20  t offset_t = 0, 
8c90: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75  offset_v = 0;..u
8ca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
8cb0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
8cc0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8cd0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8ce0: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
8cf0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
8d00: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
8d10: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
8d20: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
8d30: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
8d40: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
8d50: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
8d60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8d70: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
8d80: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8d90: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
8da0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
8db0: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
8dc0: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
8dd0: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
8de0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
8df0: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
8e00: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
8e10: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
8e20: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
8e30: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
8e40: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
8e50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8e60: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
8e70: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
8e80: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
8e90: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
8ea0: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
8eb0: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
8ec0: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
8ed0: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
8ee0: 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75  ength = %i, Valu
8ef0: 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20  e Length = %i", 
8f00: 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 74  tlen, vlen);...t
8f10: 6c 65 6e 20 2d 3d 20 32 3b 0a 09 6f 66 66 73 65  len -= 2;..offse
8f20: 74 5f 74 20 2b 3d 20 32 3b 0a 0a 09 76 6c 65 6e  t_t += 2;...vlen
8f30: 20 2d 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   -= 2;..offset_v
8f40: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
8f50: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
8f60: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
8f70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
8f80: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
8f90: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
8fa0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
8fb0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
8fc0: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
8fd0: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
8fe0: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
8ff0: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
9000: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
9010: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
9020: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
9030: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
9040: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
9050: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
9060: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
9070: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
9080: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
9090: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
90a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
90b0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
90c0: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
90d0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
90e0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
90f0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
9100: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
9110: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
9120: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
9130: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
9140: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
9150: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
9160: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9170: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
9180: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
9190: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
91a0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
91b0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
91c0: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
91d0: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
91e0: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
91f0: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
9200: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
9210: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
9220: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
9230: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
9240: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
9250: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
9260: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
9270: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
9280: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
9290: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
92a0: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
92b0: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
92c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
92d0: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
92e0: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
92f0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
9300: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
9310: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
9320: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9330: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
9340: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
9350: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
9360: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
9370: 68 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  h;....curr_entit
9380: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
9390: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
93a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
93b0: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
93c0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
93d0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
93e0: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
93f0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
9400: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
9410: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
9420: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
9430: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
9440: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
9450: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
9460: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
9470: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
9480: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
9490: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
94a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
94b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
94c0: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
94d0: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
94e0: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
94f0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
9500: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
9510: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
9520: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
9530: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
9540: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
9550: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
9560: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9570: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
9580: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
9590: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
95a0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
95b0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
95c0: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
95d0: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
95e0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
95f0: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
9600: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
9610: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
9620: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
9630: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
9640: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
9650: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
9660: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
9670: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
9680: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
9690: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
96a0: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
96b0: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
96c0: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
96d0: 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ));.....tmpbuf =
96e0: 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b   malloc(length);
96f0: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ......memcpy(tmp
9700: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
9710: 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  h);......curr_en
9720: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
9730: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
9740: 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  ->length = lengt
9750: 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  h;.....curr_enti
9760: 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62  ty->value = tmpb
9770: 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  uf;.....curr_ent
9780: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
9790: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
97a0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
97b0: 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75 72  _PKCS15:.....cur
97c0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
97d0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
97e0: 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63 75  ntity));......cu
97f0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
9800: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
9810: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74  ntity->value_byt
9820: 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09  e = vval[0];....
9830: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
9840: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
9850: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
9860: 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21  f (curr_entity !
9870: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
9880: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
9890: 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72  .....root = curr
98a0: 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09  _entity;....}...
98b0: 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55  ..if (last != NU
98c0: 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e  LL) {.....last->
98d0: 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74  _next = curr_ent
98e0: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61  ity;....}.....la
98f0: 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  st = curr_entity
9900: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
9910: 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  n(root);.}../*. 
9920: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
9930: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
9940: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
9950: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
9960: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
9970: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9980: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
9990: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
99a0: 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63  free_certs(struc
99b0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
99c0: 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73  entity *start, s
99d0: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74  ize_t count, int
99e0: 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09   free_start) {..
99f0: 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f  size_t idx;...fo
9a00: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
9a10: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
9a20: 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64  {...if (start[id
9a30: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20  x].certificate) 
9a40: 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b  {....free(start[
9a50: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
9a60: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
9a70: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09  free_start) {...
9a80: 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a  free(start);..}.
9a90: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
9aa0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
9ab0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
9ac0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
9ad0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
9ae0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
9af0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
9b00: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
9b10: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
9b20: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
9b30: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
9b40: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
9b50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
9b60: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
9b70: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
9b80: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
9b90: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
9ba0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
9bb0: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
9bc0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
9bd0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
9be0: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
9bf0: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
9c00: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
9c10: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
9c20: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b  {GSCIS_AID_CCC};
9c30: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
9c40: 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e  curr_aid[7];..un
9c50: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69  signed long outi
9c60: 64 78 20 3d 20 30 3b 0a 09 69 6e 74 20 63 65 72  dx = 0;..int cer
9c70: 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69  ts_resizable;..i
9c80: 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c  nt send_ret, sel
9c90: 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ect_ret;...CACKE
9ca0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9cb0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
9cc0: 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  (count == NULL) 
9cd0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9ce0: 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69  _PRINTF("count i
9cf0: 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e  s NULL, returnin
9d00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
9d10: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
9d20: 0a 09 7d 0a 0a 09 69 66 20 28 2a 63 6f 75 6e 74  ..}...if (*count
9d30: 20 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 63   == 0) {...if (c
9d40: 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  erts != NULL) {.
9d50: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9d60: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65  PRINTF("Requeste
9d70: 64 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62  d we return 0 ob
9d80: 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72  jects, short-cir
9d90: 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  cuit");.....retu
9da0: 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09  rn(certs);...}..
9db0: 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53  }.../* Begin a S
9dc0: 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63  martCard transac
9dd0: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
9de0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
9df0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63  n(slot);...if (c
9e00: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
9e10: 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
9e20: 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
9e30: 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
9e40: 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
9e50: 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
9e60: 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
9e70: 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
9e80: 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43  ./* Select the C
9e90: 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65  CC Applet */..se
9ea0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
9eb0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
9ec0: 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a  ot, ccc_aid, siz
9ed0: 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09  eof(ccc_aid));..
9ee0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
9ef0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9f00: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9f10: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
9f20: 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20  e to select CCC 
9f30: 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  Applet, returnin
9f40: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
9f50: 0a 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
9f60: 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61  SmartCard Transa
9f70: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
9f80: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
9f90: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
9fa0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
9fb0: 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61  * Read all the a
9fc0: 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20  pplets from the 
9fd0: 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63  CCC's TLV */..cc
9fe0: 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  c_tlv = cackey_r
9ff0: 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a  ead_tlv(slot);..
a000: 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52  ./* Look for CAR
a010: 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65  DURLs that coore
a020: 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70  spond to PKI app
a030: 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63  lets */..for (cc
a040: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
a050: 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
a060: 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
a070: 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b  >_next) {...CACK
a080: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a090: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
a0a0: 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
a0b0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
a0c0: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
a0d0: 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63  ));....if (ccc_c
a0e0: 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49  urr->tag != GSCI
a0f0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b  S_TAG_CARDURL) {
a100: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a110: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
a120: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
a130: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
a140: 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
a150: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
a160: 09 69 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e  .if ((ccc_curr->
a170: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
a180: 70 70 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f  pptype & CACKEY_
a190: 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20  TLV_APP_PKI) != 
a1a0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
a1b0: 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  KI) {....CACKEY_
a1c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
a1d0: 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
a1e0: 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
a1f0: 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c  out PKI applets,
a200: 20 74 68 69 73 20 61 70 70 6c 65 74 20 73 75 70   this applet sup
a210: 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22  ports: %s/%02x)"
a220: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a230: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
a240: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
a250: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
a260: 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
a270: 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  int) ccc_curr->v
a280: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
a290: 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74  ptype);.....cont
a2a0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  inue;...}....CAC
a2b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a2c0: 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63  UF("RID:", ccc_c
a2d0: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
a2e0: 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28  rl->rid, sizeof(
a2f0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
a300: 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a  cardurl->rid));.
a310: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a320: 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
a330: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
a340: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
a350: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
a360: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
a370: 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
a380: 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
a390: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
a3a0: 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43  l->appid);...CAC
a3b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a3c0: 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
a3d0: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
a3e0: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
a3f0: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
a400: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
a410: 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
a420: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
a430: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
a440: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
a450: 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69  ..memcpy(curr_ai
a460: 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  d, ccc_curr->val
a470: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
a480: 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72   sizeof(ccc_curr
a490: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
a4a0: 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61  >rid));...curr_a
a4b0: 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
a4c0: 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f  id) - 2] = (ccc_
a4d0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
a4e0: 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29  url->appid >> 8)
a4f0: 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f   & 0xff;...curr_
a500: 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f  aid[sizeof(curr_
a510: 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f  aid) - 1] = ccc_
a520: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
a530: 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66  url->appid & 0xf
a540: 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20  f;..../* Select 
a550: 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
a560: 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74   */...select_ret
a570: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
a580: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
a590: 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
a5a0: 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20  urr_aid));...if 
a5b0: 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43  (select_ret != C
a5c0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
a5d0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
a5e0: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
a5f0: 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
a600: 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
a610: 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
a620: 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f  object");.....co
a630: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f  ntinue;...}..../
a640: 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74  * ... and object
a650: 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c   (file) */...sel
a660: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
a670: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
a680: 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t, ccc_curr->val
a690: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
a6a0: 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c  ctid);...if (sel
a6b0: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a6c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a6d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a6e0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a6f0: 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
a700: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
a710: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
a720: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
a730: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63  ;...}..../* Proc
a740: 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
a750: 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
a760: 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
a770: 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b  ..app_tlv = cack
a780: 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74  ey_read_tlv(slot
a790: 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63  );....for (app_c
a7a0: 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61  urr = app_tlv; a
a7b0: 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72  pp_curr; app_cur
a7c0: 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e  r = app_curr->_n
a7d0: 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
a7e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
a7f0: 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
a800: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
a810: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
a820: 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
a830: 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
a840: 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
a850: 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
a860: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a870: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
a880: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
a890: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52  y care about CER
a8a0: 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09  TIFICATEs)");...
a8b0: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
a8c0: 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
a8d0: 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
a8e0: 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
a8f0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d  .memcpy(curr_id-
a900: 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  >applet, curr_ai
a910: 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
a920: 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  d->applet));....
a930: 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20  curr_id->file = 
a940: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
a950: 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
a960: 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6c  d;....curr_id->l
a970: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  abel = NULL;....
a980: 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
a990: 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f  icate_len = app_
a9a0: 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09  curr->length;...
a9b0: 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
a9c0: 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
a9d0: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
a9e0: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65  cate_len);....me
a9f0: 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
aa00: 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
aa10: 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
aa20: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
aa30: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _len);.....if (o
aa40: 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
aa50: 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72 74 73   {.....if (certs
aa60: 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09  _resizable) {...
aa70: 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
aa80: 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61  .....certs = rea
aa90: 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
aaa0: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
aab0: 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c  ount));.....} el
aac0: 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  se {......break;
aad0: 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a  .....}....}...}.
aae0: 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  ...cackey_free_t
aaf0: 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09  lv(app_tlv);....
ab00: 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
ab10: 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b  ount) {....break
ab20: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
ab30: 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74  y_free_tlv(ccc_t
ab40: 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20  lv);...*count = 
ab50: 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65  outidx;...if (ce
ab60: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b  rts_resizable) {
ab70: 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
ab80: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
ab90: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
aba0: 6e 74 29 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 65  nt));..}.../* Te
abb0: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
abc0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
abd0: 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
abe0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
abf0: 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
ac00: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
ac10: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
ac20: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
ac30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
ac40: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
ac50: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
ac60: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
ac70: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
ac80: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f  ey_ret cackey_lo
ac90: 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  gin(struct cacke
aca0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
acb0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e  signed char *pin
acc0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
acd0: 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72  pin_len, int *tr
ace0: 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
acf0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
ad00: 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
ad10: 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
ad20: 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
ad30: 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
ad40: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
ad50: 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
ad60: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
ad70: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
ad80: 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
ad90: 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
ada0: 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
adb0: 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
adc0: 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
add0: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
ade0: 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
adf0: 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
ae00: 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
ae10: 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
ae20: 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
ae30: 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
ae40: 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
ae50: 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
ae60: 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
ae70: 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
ae80: 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
ae90: 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
aea0: 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
aeb0: 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49  .}.../* Issue PI
aec0: 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e  N Verify */..sen
aed0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
aee0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
aef0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
af00: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
af10: 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 30 78  VERIFY, 0x00, 0x
af20: 30 30 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70  00, sizeof(cac_p
af30: 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78  in), cac_pin, 0x
af40: 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f  00, &response_co
af50: 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  de, NULL, NULL);
af60: 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
af70: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
af80: 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
af90: 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
afa0: 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
afb0: 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
afc0: 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
afd0: 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
afe0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
aff0: 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
b000: 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
b010: 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
b020: 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
b030: 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74  ning);.....if (t
b040: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
b050: 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72  ) {.....*tries_r
b060: 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69  emaining_p = tri
b070: 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09  es_remaining;...
b080: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
b090: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
b0a0: 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IN);...}....if (
b0b0: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d  response_code ==
b0c0: 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41   0x6983) {....CA
b0d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b0e0: 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
b0f0: 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69  ion failed, devi
b100: 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  ce is locked");.
b110: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b120: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
b130: 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
b140: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
b150: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
b160: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b170: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
b180: 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
b190: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
b1a0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
b1b0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
b1c0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
b1d0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
b1e0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
b1f0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
b200: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
b210: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
b220: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
b230: 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
b240: 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
b250: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
b260: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
b270: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
b280: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
b290: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
b2a0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43 43  /* Select the CC
b2b0: 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e  C Applet */..sen
b2c0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
b2d0: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
b2e0: 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  t, ccc_aid, size
b2f0: 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69  of(ccc_aid));..i
b300: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
b310: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b320: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
b330: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41  EY_PCSC_S_TOKENA
b340: 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74  BSENT);..}...ret
b350: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b360: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
b370: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
b380: 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
b390: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
b3a0: 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f  _mutex_create(vo
b3b0: 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70  id **mutex) {..p
b3c0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
b3d0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
b3e0: 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
b3f0: 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
b400: 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
b410: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b420: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
b430: 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
b440: 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
b450: 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
b460: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
b470: 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
b480: 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  x = malloc(sizeo
b490: 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  f(*pthread_mutex
b4a0: 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65  ));...if (!pthre
b4b0: 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43  ad_mutex) {....C
b4c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b4d0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c  TF("Failed to al
b4e0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29  locate memory.")
b4f0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
b500: 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64  ;...}....pthread
b510: 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
b520: 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68  d_mutex_init(pth
b530: 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c  read_mutex, NULL
b540: 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
b550: 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
b560: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b570: 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
b580: 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74  mutex_init() ret
b590: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
b5a0: 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
b5b0: 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
b5c0: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74  -1);...}....*mut
b5d0: 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  ex = pthread_mut
b5e0: 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ex;..} else {...
b5f0: 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
b600: 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09  CreateMutex) {..
b610: 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
b620: 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  = cackey_args.Cr
b630: 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29  eateMutex(mutex)
b640: 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
b650: 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
b660: 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
b670: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
b680: 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
b690: 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
b6a0: 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
b6b0: 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
b6c0: 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
b6d0: 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
b6e0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
b6f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
b700: 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
b710: 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
b720: 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
b730: 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
b740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
b750: 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
b760: 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09  void *mutex) {..
b770: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
b780: 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
b790: 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
b7a0: 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
b7b0: 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
b7c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b7d0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
b7e0: 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
b7f0: 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
b800: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
b810: 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
b820: 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
b830: 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70  ex = mutex;....p
b840: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
b850: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
b860: 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
b870: 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
b880: 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
b890: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b8a0: 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
b8b0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74  mutex_lock() ret
b8c0: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
b8d0: 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
b8e0: 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
b8f0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
b900: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
b910: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20  args.LockMutex) 
b920: 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
b930: 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
b940: 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  .LockMutex(mutex
b950: 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
b960: 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
b970: 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
b980: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
b990: 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
b9a0: 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
b9b0: 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
b9c0: 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
b9d0: 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
b9e0: 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
b9f0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
ba00: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
ba10: 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
ba20: 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
ba30: 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
ba40: 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
ba50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
ba60: 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
ba70: 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
ba80: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
ba90: 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
baa0: 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
bab0: 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
bac0: 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
bad0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bae0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
baf0: 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
bb00: 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
bb10: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
bb20: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
bb30: 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
bb40: 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
bb50: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
bb60: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
bb70: 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  nlock(pthread_mu
bb80: 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
bb90: 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
bba0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
bbb0: 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
bbc0: 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
bbd0: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
bbe0: 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
bbf0: 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
bc00: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
bc10: 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
bc20: 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
bc30: 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
bc40: 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
bc50: 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
bc60: 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
bc70: 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
bc80: 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
bc90: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bca0: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
bcb0: 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
bcc0: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
bcd0: 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
bce0: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
bcf0: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
bd00: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
bd10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bd20: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
bd30: 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
bd40: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
bd50: 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52  ..static CK_ATTR
bd60: 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79  IBUTE_PTR cackey
bd70: 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
bd80: 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
bd90: 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72  objectclass, str
bda0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
bdb0: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
bdc0: 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ty, unsigned lon
bdd0: 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20  g identity_num, 
bde0: 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
bdf0: 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63  Count) {..static
be00: 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75   CK_BBOOL ck_tru
be10: 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43  e = 1;..static C
be20: 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65  K_BBOOL ck_false
be30: 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20   = 0;..CK_ULONG 
be40: 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
be50: 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
be60: 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
be70: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
be80: 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
be90: 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
bea0: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
beb0: 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
bec0: 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
bed0: 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
bee0: 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
bef0: 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
bf00: 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
bf10: 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
bf20: 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
bf30: 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
bf40: 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
bf50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
bf60: 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69  ertificate;..ssi
bf70: 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65  ze_t certificate
bf80: 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f  _len = -1, x509_
bf90: 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70  read_ret;..int p
bfa0: 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41  Value_free;...CA
bfb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bfc0: 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63  F("Called (objec
bfd0: 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64  tClass = %lu, id
bfe0: 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75  entity_num = %lu
bff0: 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
c000: 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73  ong) objectclass
c010: 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  , identity_num);
c020: 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
c030: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
c040: 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
c050: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
c060: 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  IC_KEY && object
c070: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
c080: 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 43 41  VATE_KEY) {...CA
c090: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c0a0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
c0b0: 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
c0c0: 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c  nvalid object cl
c0d0: 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ass");....return
c0e0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
c0f0: 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20  Get Cert */..if 
c100: 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
c110: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
c120: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
c130: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
c140: 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
c150: 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64  identiy provided
c160: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
c170: 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66  LL);..}...certif
c180: 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
c190: 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
c1a0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
c1b0: 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
c1c0: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
c1d0: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
c1e0: 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74  en == -1 || cert
c1f0: 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  ificate == NULL)
c200: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c210: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
c220: 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
c230: 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74  ULL), this ident
c240: 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ity does not hav
c250: 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69  e an X.509 certi
c260: 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
c270: 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69  d with it and wi
c280: 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a  ll not work");..
c290: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c2a0: 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
c2b0: 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20  hat certificate 
c2c0: 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64  is ASN.1 encoded
c2d0: 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
c2e0: 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f  te */..if (x509_
c2f0: 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
c300: 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
c310: 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20  te_len, NULL) < 
c320: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
c330: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
c340: 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
c350: 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30  (NULL), the X.50
c360: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
c370: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
c380: 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e  is identity is n
c390: 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72  ot valid");....r
c3a0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
c3b0: 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
c3c0: 20 31 36 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d   16;..retval = m
c3d0: 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75  alloc(retval_cou
c3e0: 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
c3f0: 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75  val));...for (cu
c400: 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
c410: 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
c420: 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20 63   < 0xce53635f; c
c430: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29  urr_attr_type++)
c440: 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74   {...if (curr_at
c450: 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30  tr_type == 0x800
c460: 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
c470: 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33  _type = 0xce5363
c480: 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75  00;...}....pValu
c490: 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56  e_free = 0;...pV
c4a0: 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
c4b0: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
c4c0: 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69  LONG) -1;....swi
c4d0: 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74  tch (curr_attr_t
c4e0: 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
c4f0: 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41  KA_CLASS:.....CA
c500: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c510: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
c520: 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53  tribute CKA_CLAS
c530: 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
c540: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c550: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
c560: 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63  );......ck_objec
c570: 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74  t_class = object
c580: 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c  class;......pVal
c590: 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f  ue = &ck_object_
c5a0: 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c  class;.....ulVal
c5b0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
c5c0: 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b  k_object_class);
c5d0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
c5e0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
c5f0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
c600: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
c610: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f  ed long) *((CK_O
c620: 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70  BJECT_CLASS *) p
c630: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
c640: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c650: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
c660: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
c670: 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09   CKA_TOKEN:.....
c680: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c690: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
c6a0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f  attribute CKA_TO
c6b0: 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  KEN (0x%08lx) ..
c6c0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
c6d0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
c6e0: 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
c6f0: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
c700: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
c710: 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
c720: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c730: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
c740: 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
c750: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
c760: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
c770: 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
c780: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
c790: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
c7a0: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
c7b0: 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
c7c0: 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
c7d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c7e0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
c7f0: 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
c800: 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
c810: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
c820: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
c830: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
c840: 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
c850: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
c860: 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
c870: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
c880: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
c890: 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
c8a0: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
c8b0: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
c8c0: 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
c8d0: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
c8e0: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
c8f0: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
c900: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
c910: 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
c920: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
c930: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
c940: 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
c950: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
c960: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
c970: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
c980: 09 09 09 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..../* Determine
c990: 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 69 66 20   name */.....if 
c9a0: 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
c9b0: 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
c9c0: 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
c9d0: 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65  09_to_subject(ce
c9e0: 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
c9f0: 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
ca00: 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
ca10: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
ca20: 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
ca30: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
ca40: 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
ca50: 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
ca60: 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
ca70: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
ca80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ca90: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
caa0: 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
cab0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
cac0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
cad0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
cae0: 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
caf0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb00: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
cb10: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
cb20: 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20  VALUE (0x%08lx) 
cb30: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
cb40: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
cb50: 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74  type);......swit
cb60: 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29  ch (objectclass)
cb70: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f   {......case CKO
cb80: 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09  _PRIVATE_KEY:...
cb90: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
cba0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
cbb0: 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
cbc0: 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
cbd0: 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29  a private key.")
cbe0: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
cbf0: 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55  .....case CKO_PU
cc00: 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09  BLIC_KEY:.......
cc10: 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a  /* XXX: TODO */.
cc20: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
cc30: 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54  ...case CKO_CERT
cc40: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70  IFICATE:.......p
cc50: 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63  Value = certific
cc60: 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c  ate;.......ulVal
cc70: 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63  ueLen = certific
cc80: 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09  ate_len;........
cc90: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
cca0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ccb0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
ccc0: 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
ccd0: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
cce0: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
ccf0: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
cd00: 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
cd10: 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
cd20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
cd30: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
cd40: 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78  e CKA_ISSUER (0x
cd50: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
cd60: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
cd70: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
cd80: 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
cd90: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
cda0: 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
cdb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cdc0: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
cdd0: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
cde0: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
cdf0: 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
ce00: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
ce10: 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
ce20: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
ce30: 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
ce40: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
ce50: 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63  _issuer(certific
ce60: 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
ce70: 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
ce80: 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
ce90: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
cea0: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
ceb0: 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
cec0: 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
ced0: 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
cee0: 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
cef0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
cf00: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
cf10: 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
cf20: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
cf30: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
cf40: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
cf50: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
cf60: 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09  ERIAL_NUMBER:...
cf70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cf80: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
cf90: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
cfa0: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30  SERIAL_NUMBER (0
cfb0: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
cfc0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
cfd0: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
cfe0: 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
cff0: 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
d000: 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
d010: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d020: 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
d030: 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
d040: 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
d050: 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
d060: 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
d070: 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
d080: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
d090: 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
d0a0: 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
d0b0: 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
d0c0: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
d0d0: 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
d0e0: 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
d0f0: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
d100: 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
d110: 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
d120: 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
d130: 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
d140: 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
d150: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d160: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
d170: 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
d180: 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
d190: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
d1a0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
d1b0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
d1c0: 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
d1d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d1e0: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
d1f0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
d200: 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
d210: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
d220: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
d230: 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
d240: 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
d250: 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
d260: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d270: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
d280: 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
d290: 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
d2a0: 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
d2b0: 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
d2c0: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
d2d0: 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
d2e0: 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
d2f0: 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
d300: 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
d310: 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
d320: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
d330: 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
d340: 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
d350: 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
d360: 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
d370: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
d380: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
d390: 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
d3a0: 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
d3b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d3c0: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
d3d0: 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
d3e0: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
d3f0: 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
d400: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
d410: 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09  ase CKA_ID:.....
d420: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d430: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
d440: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44  attribute CKA_ID
d450: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
d460: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d470: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
d480: 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  ;......ucTmpBuf[
d490: 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f  0] = ((identity_
d4a0: 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26  num + 1) >> 8) &
d4b0: 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70   0xff;.....ucTmp
d4c0: 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74  Buf[1] =  (ident
d4d0: 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30  ity_num + 1) & 0
d4e0: 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  xff;......pValue
d4f0: 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09   = &ucTmpBuf;...
d500: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32  ..ulValueLen = 2
d510: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
d520: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
d530: 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
d540: 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
d550: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
d560: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
d570: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
d580: 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
d590: 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
d5a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
d5b0: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
d5c0: 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
d5d0: 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
d5e0: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
d5f0: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
d600: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
d610: 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
d620: 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
d630: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
d640: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
d650: 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
d660: 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
d670: 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
d680: 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
d690: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
d6a0: 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
d6b0: 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63  ort one certific
d6c0: 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  ate type */.....
d6d0: 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
d6e0: 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b  ype = CKC_X_509;
d6f0: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
d700: 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
d710: 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
d720: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
d730: 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
d740: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
d750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
d760: 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f  . returning CKC_
d770: 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f  X_509 (%lu) (%p/
d780: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
d790: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
d7a0: 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
d7b0: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
d7c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d7d0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
d7e0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
d7f0: 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
d800: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d810: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
d820: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
d830: 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25  KA_KEY_TYPE (0x%
d840: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
d850: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
d860: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
d870: 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
d880: 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
d890: 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
d8a0: 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
d8b0: 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41  C_KEY) {......CA
d8c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d8d0: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
d8e0: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
d8f0: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
d900: 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  key.");.......br
d910: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
d920: 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
d930: 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20  rt one key type 
d940: 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79  */.....ck_key_ty
d950: 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09  pe = CKK_RSA;...
d960: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
d970: 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  key_type;.....ul
d980: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
d990: 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a  f(ck_key_type);.
d9a0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d9b0: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
d9c0: 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41  eturning CKK_RSA
d9d0: 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
d9e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d9f0: 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
da00: 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
da10: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
da20: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
da30: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
da40: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
da50: 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b  A_SIGN:.....CACK
da60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da70: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
da80: 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28  ibute CKA_SIGN (
da90: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
daa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
dab0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
dac0: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
dad0: 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
dae0: 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
daf0: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
db00: 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
db10: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
db20: 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
db30: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
db40: 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
db50: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
db60: 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
db70: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
db80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
db90: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
dba0: 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
dbb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
dbc0: 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
dbd0: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
dbe0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
dbf0: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
dc00: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
dc10: 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09  KA_DECRYPT:.....
dc20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dc30: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
dc40: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45  attribute CKA_DE
dc50: 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20  CRYPT (0x%08lx) 
dc60: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
dc70: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
dc80: 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
dc90: 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
dca0: 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c  KO_PRIVATE_KEY |
dcb0: 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d  | objectclass ==
dcc0: 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
dcd0: 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
dce0: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
dcf0: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
dd00: 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
dd10: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
dd20: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
dd30: 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
dd40: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
dd50: 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
dd60: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dd70: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
dd80: 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
dd90: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
dda0: 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
ddb0: 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
ddc0: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
ddd0: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
dde0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
ddf0: 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
de00: 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
de10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
de20: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
de30: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
de40: 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54  TRUST_SERVER_AUT
de50: 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
de60: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
de70: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
de80: 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
de90: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
dea0: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
deb0: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
dec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ded0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
dee0: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
def0: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
df00: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
df10: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
df20: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
df30: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
df40: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
df50: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
df60: 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
df70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
df80: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
df90: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
dfa0: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
dfb0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
dfc0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
dfd0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
dfe0: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
dff0: 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
e000: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
e010: 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
e020: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e030: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
e040: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
e050: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
e060: 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
e070: 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
e080: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
e090: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
e0a0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
e0b0: 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
e0c0: 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
e0d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e0e0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
e0f0: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
e100: 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
e110: 47 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  G (0x%08lx) ..."
e120: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e130: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
e140: 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
e150: 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
e160: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
e170: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
e180: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e190: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
e1a0: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
e1b0: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
e1c0: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
e1d0: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
e1e0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
e1f0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
e200: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
e210: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
e220: 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e  EMAIL_PROTECTION
e230: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
e240: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
e250: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
e260: 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
e270: 50 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30  PROTECTION (0x%0
e280: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
e290: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
e2a0: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
e2b0: 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
e2c0: 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
e2d0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
e2e0: 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
e2f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e300: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
e310: 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
e320: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
e330: 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
e340: 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
e350: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
e360: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
e370: 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
e380: 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  t:.....pValue = 
e390: 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75  NULL;.....ulValu
e3a0: 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
e3b0: 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a   -1;.....break;.
e3c0: 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f  ..}....if (((CK_
e3d0: 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e  LONG) ulValueLen
e3e0: 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20  ) != ((CK_LONG) 
e3f0: 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73  -1)) {..../* Pus
e400: 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f  h curr_attr onto
e410: 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09   the stack */...
e420: 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20  .curr_attr.type 
e430: 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  = curr_attr_type
e440: 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75  ;....curr_attr.u
e450: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
e460: 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72  lueLen;.....curr
e470: 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d  _attr.pValue = m
e480: 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e  alloc(curr_attr.
e490: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
e4a0: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
e4b0: 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  .pValue, pValue,
e4c0: 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c   curr_attr.ulVal
e4d0: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28  ueLen);.....if (
e4e0: 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70  pValue_free && p
e4f0: 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65  Value) {.....fre
e500: 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a  e(pValue);....}.
e510: 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73  ....if (numattrs
e520: 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   >= retval_count
e530: 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63  ) {.....retval_c
e540: 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72  ount *= 2;.....r
e550: 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
e560: 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63  retval, retval_c
e570: 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
e580: 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09  etval));....}...
e590: 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c  ..memcpy(&retval
e5a0: 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72  [numattrs], &cur
e5b0: 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63  r_attr, sizeof(c
e5c0: 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e  urr_attr));....n
e5d0: 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09  umattrs++;...}..
e5e0: 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73  }...if (numattrs
e5f0: 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61   != 0) {...retva
e600: 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  l_count = numatt
e610: 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72  rs;...retval = r
e620: 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
e630: 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
e640: 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
e650: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65  .} else {...free
e660: 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74  (retval);....ret
e670: 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  val = NULL;..}..
e680: 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d  .*pulCount = num
e690: 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  attrs;...CACKEY_
e6a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e6b0: 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65  turning %lu obje
e6c0: 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61  cts (%p).", numa
e6d0: 74 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  ttrs, retval);..
e6e0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
e6f0: 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
e700: 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
e710: 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56  Initialize)(CK_V
e720: 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67  OID_PTR pInitArg
e730: 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49  s) {..CK_C_INITI
e740: 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54  ALIZE_ARGS CK_PT
e750: 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f  R args;..uint32_
e760: 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
e770: 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41  x_init_ret;...CA
e780: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e790: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
e7a0: 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d  if (pInitArgs !=
e7b0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20   NULL) {...args 
e7c0: 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d  = pInitArgs;...m
e7d0: 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72  emcpy(&cackey_ar
e7e0: 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66  gs, args, sizeof
e7f0: 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a  (cackey_args));.
e800: 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
e810: 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ateMutex == NULL
e820: 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
e830: 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  yMutex == NULL |
e840: 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
e850: 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
e860: 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  s->UnlockMutex =
e870: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
e880: 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
e890: 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
e8a0: 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
e8b0: 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
e8c0: 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  ->LockMutex != N
e8d0: 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
e8e0: 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
e8f0: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
e900: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
e910: 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f  or. Some, but no
e920: 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20  t All threading 
e930: 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69  primitives provi
e940: 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ded.");......ret
e950: 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
e960: 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d  S_BAD);....}...}
e970: 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 70 52  ....if (args->pR
e980: 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
e990: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
e9a0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
e9b0: 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
e9c0: 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09  ot NULL.");.....
e9d0: 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
e9e0: 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 09  ENTS_BAD);...}..
e9f0: 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
ea00: 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
ea10: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
ea20: 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
ea30: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
ea40: 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
ea50: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
ea60: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
ea70: 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
ea80: 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
ea90: 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ags = 0;..}...if
eaa0: 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
eab0: 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
eac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
ead0: 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
eae0: 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
eaf0: 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
eb00: 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
eb10: 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
eb20: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
eb30: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
eb40: 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
eb50: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
eb60: 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
eb70: 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
eb80: 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
eb90: 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
eba0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
ebb0: 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
ebc0: 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
ebd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
ebe0: 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
ebf0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
ec00: 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63  .active = 0;...c
ec10: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
ec20: 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
ec30: 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
ec40: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31  _initialized = 1
ec50: 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
ec60: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a  biglock_init) {.
ec70: 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  ..mutex_init_ret
ec80: 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
ec90: 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62  create(&cackey_b
eca0: 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
ecb0: 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21  mutex_init_ret !
ecc0: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
ecd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
ece0: 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69  rror.  Mutex ini
ecf0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
ed00: 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
ed10: 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29  n(CKR_CANT_LOCK)
ed20: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
ed30: 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31  biglock_init = 1
ed40: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
ed50: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
ed60: 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
ed70: 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
ed80: 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
ed90: 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
eda0: 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
edb0: 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f  nalize)(CK_VOID_
edc0: 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b  PTR pReserved) {
edd0: 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a  ..uint32_t idx;.
ede0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
edf0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
ee00: 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65  ;...if (pReserve
ee10: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d != NULL) {...C
ee20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ee30: 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65  TF("Error. pRese
ee40: 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rved is not NULL
ee50: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
ee60: 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
ee70: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
ee80: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
ee90: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
eea0: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
eeb0: 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
eec0: 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
eed0: 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
eee0: 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
eef0: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
ef00: 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
ef10: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
ef20: 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
ef30: 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
ef40: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
ef50: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
ef60: 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
ef70: 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28  .C_CloseSession(
ef80: 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  idx);...}..}...c
ef90: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
efa0: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
efb0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
efc0: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
efd0: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
efe0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
eff0: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
f000: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
f010: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
f020: 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  er) {....free(ca
f030: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
f040: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09  pcsc_reader);...
f050: 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e  }..}...cackey_in
f060: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
f070: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f080: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
f090: 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
f0a0: 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
f0b0: 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
f0c0: 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
f0d0: 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29  K_RV, C_GetInfo)
f0e0: 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  (CK_INFO_PTR pIn
f0f0: 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
f100: 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
f110: 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
f120: 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
f130: 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
f140: 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72  HAR libraryDescr
f150: 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
f160: 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ey";...CACKEY_DE
f170: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
f180: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e  ed.");...if (pIn
f190: 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fo == NULL) {...
f1a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f1b0: 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66  NTF("Error. pInf
f1c0: 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  o is NULL.");...
f1d0: 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
f1e0: 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
f1f0: 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
f200: 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
f210: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f220: 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
f230: 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
f240: 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
f250: 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
f260: 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  LIZED);..}...pIn
f270: 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
f280: 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
f290: 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
f2a0: 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
f2b0: 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
f2c0: 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
f2d0: 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
f2e0: 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
f2f0: 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
f300: 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65   & 0xff;...memse
f310: 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
f320: 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
f330: 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
f340: 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
f350: 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
f360: 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
f370: 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
f380: 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
f390: 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  ID) - 1);...pInf
f3a0: 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b  o->flags = 0x00;
f3b0: 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
f3c0: 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
f3d0: 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
f3e0: 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
f3f0: 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
f400: 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62  emcpy(pInfo->lib
f410: 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c  raryDescription,
f420: 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
f430: 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72  ion, sizeof(libr
f440: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20  aryDescription) 
f450: 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c  - 1);...pInfo->l
f460: 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61  ibraryVersion.ma
f470: 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  jor = (cackey_ge
f480: 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36  tversion() >> 16
f490: 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
f4a0: 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
f4b0: 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
f4c0: 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
f4d0: 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   8) & 0xff;...CA
f4e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f4f0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
f500: 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
f510: 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
f520: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50  _OK);.}../*. * P
f530: 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72  rocess list of r
f540: 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61  eaders, and crea
f550: 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65  te mapping betwe
f560: 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61  en reader name a
f570: 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43  nd slot ID. */.C
f580: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
f590: 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
f5a0: 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c  otList)(CK_BBOOL
f5b0: 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43   tokenPresent, C
f5c0: 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53  K_SLOT_ID_PTR pS
f5d0: 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e  lotList, CK_ULON
f5e0: 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
f5f0: 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
f600: 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  val;..int pcsc_c
f610: 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f  onnect_ret;..CK_
f620: 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f  ULONG count, slo
f630: 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72  t_count = 0, cur
f640: 72 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63  rslot;..char *pc
f650: 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
f660: 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
f670: 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44  sc_readers_e;..D
f680: 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72  WORD pcsc_reader
f690: 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  s_len;..LONG sca
f6a0: 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
f6b0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72  et;..size_t curr
f6c0: 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43  _reader_len;...C
f6d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f6e0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
f6f0: 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d  .if (pulCount ==
f700: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
f710: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f720: 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20  Error. pulCount 
f730: 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
f740: 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
f750: 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
f760: 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
f770: 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
f780: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f790: 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
f7a0: 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
f7b0: 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
f7c0: 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
f7d0: 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ZED);..}...mutex
f7e0: 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
f7f0: 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
f800: 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
f810: 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
f820: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
f830: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
f840: 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
f850: 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
f860: 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
f870: 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43  RROR);..}.../* C
f880: 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f  lear list of slo
f890: 74 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74  ts */..if (pSlot
f8a0: 4c 69 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c  List) {.../* Onl
f8b0: 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
f8c0: 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
f8d0: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
f8e0: 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73  ing supply the s
f8f0: 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
f900: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  */...cackey_slot
f910: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
f920: 28 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72  ();....for (curr
f930: 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
f940: 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
f950: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
f960: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
f970: 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
f980: 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  +) {....if (cack
f990: 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
f9a0: 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  t].pcsc_reader) 
f9b0: 7b 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  {.....free(cacke
f9c0: 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
f9d0: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
f9e0: 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
f9f0: 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
fa00: 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
fa10: 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
fa20: 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
fa30: 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a  active = 0;...}.
fa40: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
fa50: 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
fa60: 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
fa70: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
fa80: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
fa90: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
faa0: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
fab0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
fac0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fad0: 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  TF("Connection t
fae0: 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20  o PC/SC failed, 
faf0: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74  assuming no slot
fb00: 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75  s");....slot_cou
fb10: 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  nt = 0;..} else 
fb20: 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  {...pcsc_readers
fb30: 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61  _len = 0;....sca
fb40: 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
fb50: 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65  et = SCardListRe
fb60: 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63  aders(*cackey_pc
fb70: 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c  sc_handle, NULL,
fb80: 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61   NULL, &pcsc_rea
fb90: 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20  ders_len);...if 
fba0: 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
fbb0: 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
fbc0: 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73  S_SUCCESS && pcs
fbd0: 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d  c_readers_len !=
fbe0: 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65   0) {....pcsc_re
fbf0: 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70  aders = malloc(p
fc00: 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
fc10: 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  ;....pcsc_reader
fc20: 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_s = pcsc_reade
fc30: 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69  rs;.....scard_li
fc40: 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
fc50: 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
fc60: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
fc70: 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63  ndle, NULL, pcsc
fc80: 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f  _readers, &pcsc_
fc90: 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
fca0: 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
fcb0: 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
fcc0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
fcd0: 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
fce0: 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_e = pcsc_reade
fcf0: 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72  rs + pcsc_reader
fd00: 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72  s_len;......curr
fd10: 73 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68  slot = 0;.....wh
fd20: 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72  ile (pcsc_reader
fd30: 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73  s < pcsc_readers
fd40: 5f 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f  _e) {......curr_
fd50: 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72  reader_len = str
fd60: 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73  len(pcsc_readers
fd70: 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63  );.......if ((pc
fd80: 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72  sc_readers + cur
fd90: 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20  r_reader_len) > 
fda0: 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
fdb0: 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
fdc0: 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
fdd0: 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
fde0: 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72  == 0) {.......br
fdf0: 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
fe00: 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
fe10: 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
fe20: 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
fe30: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
fe40: 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ))) {.......CACK
fe50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fe60: 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64  "Found more read
fe70: 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61  ers than slots a
fe80: 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b  re available!");
fe90: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
fea0: 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b  ....}.......CACK
feb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fec0: 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25  "Found reader: %
fed0: 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  s", pcsc_readers
fee0: 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79  );......./* Only
fef0: 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
ff00: 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
ff10: 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
ff20: 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
ff30: 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
ff40: 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74  /......if (pSlot
ff50: 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61  List) {.......ca
ff60: 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
ff70: 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  lot].active = 1;
ff80: 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
ff90: 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
ffa0: 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64  sc_reader = strd
ffb0: 75 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  up(pcsc_readers)
ffc0: 3b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
ffd0: 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
ffe0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
fff0: 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 7d 0a 09  ed = 0;......}..
10000 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
10010 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
10020 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
10030 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
10040 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
10050 6f 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  ot > 0) {......s
10060 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72  lot_count = curr
10070 73 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  slot;.....}....}
10080 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
10090 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
100a0 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
100b0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
100c0 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
100d0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
100e0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
100f0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
10100 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
10110 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
10120 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
10130 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
10140 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
10150 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
10160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10170 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
10180 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
10190 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
101a0 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
101b0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
101c0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
101d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
101e0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
101f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
10200 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
10210 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
10220 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
10230 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
10240 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
10250 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
10260 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10270 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
10280 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
10290 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
102a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
102b0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
102c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
102d0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
102e0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
102f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
10300 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
10310 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
10320 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
10330 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
10340 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
10350 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
10360 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10370 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
10380 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
10390 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
103a0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
103b0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
103c0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
103d0 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
103e0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09  R_TOO_SMALL);...
103f0 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  }...for (currslo
10400 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
10410 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75  < slot_count; cu
10420 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53  rrslot++) {...pS
10430 6c 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74  lotList[currslot
10440 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d  ] = currslot;..}
10450 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73  ...*pulCount = s
10460 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43  lot_count;...CAC
10470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10480 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
10490 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
104a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
104b0 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
104c0 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
104d0 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
104e0 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
104f0 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
10500 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
10510 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
10520 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
10530 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
10540 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
10550 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
10560 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
10570 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
10580 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
10590 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
105a0 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
105b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
105c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
105d0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
105e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
105f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10600 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
10610 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
10620 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
10630 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
10640 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
10650 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
10660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
10670 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
10680 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
10690 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
106a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
106b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
106c0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
106d0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
106e0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
106f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
10700 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
10710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10720 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
10730 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
10740 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
10750 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
10760 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
10770 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
10780 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
10790 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
107a0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
107b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
107c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
107d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
107e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
107f0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
10800 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
10810 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
10820 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
10830 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
10840 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
10850 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
10860 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
10870 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
10880 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
10890 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
108a0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
108b0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
108c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
108d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
108e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
108f0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
10900 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
10910 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
10920 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
10930 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
10940 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
10950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
10970 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
10980 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
10990 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
109a0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
109b0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
109c0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
109d0 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
109e0 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
109f0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
10a00 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
10a10 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
10a20 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
10a30 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
10a40 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
10a50 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
10a60 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
10a70 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
10a80 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
10a90 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
10aa0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
10ab0 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
10ac0 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
10ad0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
10ae0 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
10af0 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
10b00 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
10b10 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
10b20 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
10b30 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
10b40 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
10b50 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
10b60 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
10b70 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
10b80 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69 66  >flags = 0;...if
10b90 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
10ba0 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
10bb0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
10bc0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
10bd0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
10be0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
10bf0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
10c00 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  NT;..}...pInfo->
10c10 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
10c20 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
10c30 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
10c40 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
10c50 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
10c60 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
10c70 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
10c80 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
10c90 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
10ca0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
10cb0 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
10cc0 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
10cd0 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
10ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10cf0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
10d00 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
10d10 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
10d20 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
10d30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
10d40 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
10d50 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
10d60 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
10d70 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
10d80 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
10d90 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
10da0 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
10db0 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
10dc0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
10dd0 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
10de0 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
10df0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
10e00 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
10e10 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 69 6e 74  CAC Token";..int
10e20 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
10e30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10e40 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
10e50 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
10e60 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
10e70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
10e80 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
10e90 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
10ea0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
10eb0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
10ec0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
10ed0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
10ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
10ef0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
10f00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
10f10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
10f20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
10f30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
10f40 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
10f50 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
10f60 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
10f70 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
10f80 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
10f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
10fa0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
10fb0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
10fc0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
10fd0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
10fe0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
10ff0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
11000 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
11010 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
11020 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
11030 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
11040 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
11050 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
11060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11070 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
11080 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
11090 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
110a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
110b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
110c0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
110d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
110e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
110f0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
11100 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
11110 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
11120 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
11130 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
11140 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
11150 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
11160 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
11170 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
11180 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
11190 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
111a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
111b0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
111c0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
111d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
111e0 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65  _PRINTF("No toke
111f0 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  n is present in 
11200 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73  slotID = %lu", s
11210 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
11220 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
11230 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
11240 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
11250 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29  KEN_NOT_PRESENT)
11260 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
11270 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
11280 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
11290 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
112a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
112b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
112c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
112d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
112e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
112f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
11300 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73  RROR);..}...mems
11310 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  et(pInfo->label,
11320 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
11330 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 69 66  fo->label));..if
11340 20 28 31 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28   (1) {...memcpy(
11350 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
11360 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
11370 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
11380 20 2d 20 31 29 3b 0a 09 7d 20 65 6c 73 65 20 7b   - 1);..} else {
11390 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
113a0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
113b0 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
113c0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
113d0 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
113e0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
113f0 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
11400 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
11410 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
11420 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
11430 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c  nfo->model, ' ',
11440 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
11450 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28  odel));..memcpy(
11460 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f  pInfo->model, mo
11470 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65  del, sizeof(mode
11480 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  l) - 1);...memse
11490 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  t(pInfo->serialN
114a0 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65  umber, ' ', size
114b0 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  of(pInfo->serial
114c0 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73  Number));...mems
114d0 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d  et(pInfo->utcTim
114e0 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  e, ' ', sizeof(p
114f0 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b  Info->utcTime));
11500 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
11510 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
11520 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
11530 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
11540 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
11550 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
11560 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
11570 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
11580 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
11590 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
115a0 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
115b0 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
115c0 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
115d0 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0x00;...pInfo->f
115e0 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45  lags = CKF_WRITE
115f0 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46  _PROTECTED | CKF
11600 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41  _USER_PIN_INITIA
11610 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45  LIZED | CKF_TOKE
11620 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
11630 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
11640 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ED;...pInfo->ulM
11650 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  axSessionCount =
11660 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
11670 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
11680 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
11690 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49  ns[0])) - 1;..pI
116a0 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f  nfo->ulSessionCo
116b0 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
116c0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
116d0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52  ;..pInfo->ulMaxR
116e0 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
116f0 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53  0;..pInfo->ulRwS
11700 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
11710 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
11720 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
11730 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20  ->ulMaxPinLen = 
11740 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  128;..pInfo->ulM
11750 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70  inPinLen = 0;..p
11760 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62  Info->ulTotalPub
11770 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
11780 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
11790 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
117a0 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f  ulFreePublicMemo
117b0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
117c0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
117d0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
117e0 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
117f0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
11800 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
11810 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74  fo->ulFreePrivat
11820 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
11830 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
11840 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  TION;...CACKEY_D
11850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
11860 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
11870 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
11880 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
11890 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
118a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
118b0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29  aitForSlotEvent)
118c0 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c  (CK_FLAGS flags,
118d0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
118e0 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44  pSlotID, CK_VOID
118f0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
11900 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
11910 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
11920 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
11930 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
11940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11950 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
11960 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
11970 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
11980 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
11990 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
119a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
119b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
119c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
119d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
119e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
119f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
11a00 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
11a10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
11a20 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
11a30 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
11a40 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
11a50 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
11a60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
11a70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
11a80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
11a90 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
11aa0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
11ab0 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
11ac0 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f  nismList)(CK_SLO
11ad0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
11ae0 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50  MECHANISM_TYPE_P
11af0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  TR pMechanismLis
11b00 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
11b10 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43  pulCount) {..CAC
11b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
11b40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
11b50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
11b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11b70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
11b80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
11b90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
11ba0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
11bb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
11bc0 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
11bd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11be0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11bf0 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55    pulCount is NU
11c00 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
11c10 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
11c20 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
11c30 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20  echanismList == 
11c40 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
11c50 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43 4b  unt = 3;....CACK
11c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11c70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
11c80 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
11c90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
11ca0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70  OK);..}...if (*p
11cb0 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a 09  ulCount < 3) {..
11cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11cd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75  INTF("Error.  Bu
11ce0 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22  ffer too small."
11cf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
11d00 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
11d10 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e  L);..}...pMechan
11d20 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d  ismList[0] = CKM
11d30 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65 63  _RSA_PKCS;..pMec
11d40 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d 20  hanismList[1] = 
11d50 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
11d60 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
11d70 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  2;...CACKEY_DEBU
11d80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
11d90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
11da0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
11db0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
11dc0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
11dd0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
11de0 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
11df0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
11e00 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
11e10 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
11e20 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
11e30 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
11e40 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
11e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11e60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
11e70 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
11e80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11e90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11ea0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
11eb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
11ec0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
11ed0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
11ee0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
11ef0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11f00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11f10 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
11f20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
11f30 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
11f40 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
11f50 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
11f60 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
11f70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
11f80 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
11f90 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
11fa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11fb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11fc0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
11fd0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
11fe0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
11ff0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
12000 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
12010 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
12020 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
12030 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
12040 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
12050 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
12060 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
12070 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12080 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
12090 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
120a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
120b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
120c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
120d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
120e0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
120f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12100 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
12110 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
12120 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
12130 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
12140 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
12150 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
12160 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
12170 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
12180 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
12190 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
121a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
121b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
121c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
121d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
121e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
121f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12200 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
12210 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
12220 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
12230 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
12240 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69  ../* XXX: This i
12250 73 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20  s untested, and 
12260 66 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20  further I'm not 
12270 72 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74  really sure if t
12280 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20  his is correct. 
12290 2a 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  */..switch (type
122a0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
122b0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
122c0 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
122d0 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
122e0 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
122f0 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
12300 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
12310 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43   CKF_ENCRYPT | C
12320 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46  KF_DECRYPT | CKF
12330 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
12340 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  FY;....break;...
12350 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35  case CKM_RSA_X_5
12360 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  09:....pInfo->ul
12370 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
12380 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
12390 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
123a0 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
123b0 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
123c0 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45  ENCRYPT | CKF_DE
123d0 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e  CRYPT | CKF_SIGN
123e0 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09   | CKF_VERIFY;..
123f0 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
12400 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
12410 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
12420 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
12430 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
12440 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
12450 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
12460 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53  = CKF_HW | CKF_S
12470 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
12480 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
12490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
124a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
124b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
124c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
124d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
124e0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
124f0 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
12500 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
12510 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
12520 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
12530 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
12540 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
12550 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
12560 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
12570 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
12580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12590 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
125a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
125b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
125c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
125d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
125e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
125f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
12600 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
12610 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
12620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12630 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
12640 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
12650 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
12660 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
12670 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
12680 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
12690 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
126a0 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
126b0 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
126c0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
126d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
126e0 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
126f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
12700 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
12710 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
12720 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
12730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12740 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
12750 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
12760 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
12770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12780 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
12790 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
127a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
127b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
127c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
127d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
127e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
127f0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
12800 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
12810 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
12820 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
12830 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
12840 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
12850 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
12860 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
12870 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
12880 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
12890 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
128a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
128b0 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
128c0 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
128d0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
128e0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
128f0 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
12900 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
12910 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
12920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
12930 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
12940 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
12950 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
12960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12970 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
12980 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
12990 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
129a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
129b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
129c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
129d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
129e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
129f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
12a00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
12a10 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
12a20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
12a30 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
12a40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
12a50 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
12a60 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
12a70 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
12a80 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
12a90 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
12aa0 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
12ab0 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
12ac0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
12ad0 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
12ae0 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
12af0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
12b00 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
12b10 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
12b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
12b30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
12b40 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
12b50 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
12b60 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
12b70 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
12b80 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
12b90 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
12ba0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
12bb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
12bc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12bd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12be0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
12bf0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
12c00 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
12c10 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
12c20 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
12c30 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
12c40 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
12c50 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
12c60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
12c70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12c80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12c90 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
12ca0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
12cb0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
12cc0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
12cd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
12ce0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
12cf0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
12d00 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
12d10 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
12d20 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
12d30 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
12d40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
12d50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
12d60 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
12d70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
12d80 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
12d90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
12da0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
12db0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
12dc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12dd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
12de0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
12df0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
12e00 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
12e10 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
12e20 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
12e30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
12e40 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
12e50 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
12e60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
12e70 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
12e80 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
12e90 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
12ea0 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  /..if (cackey_to
12eb0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
12ec0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
12ed0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
12ee0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
12ef0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12f00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12f10 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73  .  Card not pres
12f20 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
12f30 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
12f40 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ED");....cackey_
12f50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
12f60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
12f70 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49  .return(CKR_DEVI
12f80 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a  CE_REMOVED);..}.
12f90 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20  ..for (idx = 1; 
12fa0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
12fb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
12fc0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
12fd0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
12fe0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  x++) {...if (!ca
12ff0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
13000 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
13010 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20  found_session = 
13020 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f  1;.....*phSessio
13030 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63  n = idx;.....cac
13040 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
13050 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
13060 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
13070 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73  [idx].slotID = s
13080 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79  lotID;....cackey
13090 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
130a0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
130b0 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09  BLIC_SESSION;...
130c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
130d0 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c  [idx].flags = fl
130e0 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ags;....cackey_s
130f0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44  essions[idx].ulD
13100 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a  eviceError = 0;.
13110 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
13120 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61  ns[idx].pApplica
13130 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74  tion = pApplicat
13140 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ion;....cackey_s
13150 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74  essions[idx].Not
13160 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09  ify = notify;...
13170 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
13180 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
13190 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
131a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
131b0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
131c0 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  nt = 0;.....cack
131d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
131e0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
131f0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
13200 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67  essions[idx].sig
13210 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
13220 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
13230 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61  s[idx].decrypt_a
13240 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 62  ctive = 0;.....b
13250 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  reak;...}..}...m
13260 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
13270 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
13280 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
13290 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
132a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
132b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
132c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
132d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
132e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
132f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
13300 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73  }...if (!found_s
13310 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b  ession) {...CACK
13320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13330 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53  "Returning CKR_S
13340 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69  ESSION_COUNT (%i
13350 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  )", CKR_SESSION_
13360 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72  COUNT);....retur
13370 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  n(CKR_SESSION_CO
13380 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  UNT);..}...CACKE
13390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
133a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
133b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
133c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
133d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
133e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
133f0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28  C_CloseSession)(
13400 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
13410 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
13420 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
13430 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65  r_attr;..unsigne
13440 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61  d long id_idx, a
13450 74 74 72 5f 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ttr_idx;..int mu
13460 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
13470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13480 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
13490 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
134a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
134b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
134c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
134d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
134e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
134f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
13500 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
13510 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
13520 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
13530 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
13540 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
13550 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
13560 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
13570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13580 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
13590 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
135a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
135b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
135c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
135d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
135e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
135f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
13600 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
13610 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
13620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13630 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
13640 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
13650 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
13660 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
13670 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
13680 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
13690 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
136a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
136b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
136c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
136d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
136e0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
136f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
13700 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
13710 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
13720 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
13730 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
13740 69 76 65 20 3d 20 30 3b 0a 09 69 66 20 28 63 61  ive = 0;..if (ca
13750 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
13760 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
13770 65 73 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 5f  es) {...for (id_
13780 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20  idx = 0; id_idx 
13790 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
137a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
137b0 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
137c0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20  _idx++) {....if 
137d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
137e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
137f0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
13800 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09  tributes) {.....
13810 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
13820 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 63 61  0; attr_idx < ca
13830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
13840 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
13850 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
13860 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74  butes_count; att
13870 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 09  r_idx++) {......
13880 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
13890 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
138a0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
138b0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
138c0 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
138d0 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61  ......if (curr_a
138e0 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09  ttr->pValue) {..
138f0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61  .....free(curr_a
13900 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09  ttr->pValue);...
13910 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
13920 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
13930 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
13940 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
13950 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
13960 09 09 7d 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ..}...}....free(
13970 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13980 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
13990 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ties);..}...mute
139a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
139b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
139c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
139d0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
139e0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
139f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13a00 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
13a10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13a30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13a40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13a50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13a60 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
13a70 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
13a80 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
13a90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
13aa0 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c  K_RV, C_CloseAll
13ab0 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f  Sessions)(CK_SLO
13ac0 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09  T_ID slotID) {..
13ad0 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
13ae0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
13af0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13b00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
13b10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
13b20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
13b30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13b40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
13b50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
13b60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
13b70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
13b80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
13b90 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
13ba0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
13bb0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
13bc0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
13bd0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
13be0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13bf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
13c00 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
13c10 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
13c20 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
13c30 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
13c40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
13c50 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
13c60 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
13c70 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
13c80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
13c90 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
13ca0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
13cb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13cc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
13cd0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
13ce0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13cf0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
13d00 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
13d10 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
13d20 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
13d30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13d40 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
13d50 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
13d60 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
13d70 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
13d80 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
13d90 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
13da0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
13db0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
13dc0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
13dd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  LID);..}...for (
13de0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
13df0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
13e00 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
13e10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
13e20 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
13e30 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
13e40 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
13e50 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  e) {....if (cack
13e60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
13e70 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49  .slotID != slotI
13e80 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  D) {.....continu
13e90 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  e;....}.....cack
13ea0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
13eb0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13ec0 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
13ed0 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b  on(idx);....cack
13ee0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
13ef0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
13f00 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
13f10 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
13f20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
13f30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
13f40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
13f50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
13f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13f70 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
13f80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
13f90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
13fa0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
13fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13fc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
13fd0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
13fe0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
13ff0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
14000 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
14010 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  , C_GetSessionIn
14020 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fo)(CK_SESSION_H
14030 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
14040 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f  CK_SESSION_INFO_
14050 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
14060 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
14070 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14080 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
14090 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
140a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
140b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
140c0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
140d0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
140e0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
140f0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
14100 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
14110 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
14120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14130 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
14140 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
14150 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
14160 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
14170 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
14180 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
14190 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
141a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
141b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
141c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
141d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
141e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
141f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
14200 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
14210 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
14220 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
14230 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
14240 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
14250 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
14260 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
14270 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
14280 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
14290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
142a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
142b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
142c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
142d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
142e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
142f0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
14300 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
14310 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
14320 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
14330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14340 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
14350 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
14360 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
14370 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
14380 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
14390 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63  Info->slotID = c
143a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
143b0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
143c0 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d  ..pInfo->state =
143d0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
143e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
143f0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ;..pInfo->flags 
14400 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
14410 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67  s[hSession].flag
14420 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76  s;..pInfo->ulDev
14430 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65  iceError = cacke
14440 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
14450 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  ion].ulDeviceErr
14460 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  or;...mutex_retv
14470 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
14480 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
14490 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
144a0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
144b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
144c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
144d0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
144e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
144f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
14500 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
14510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14520 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
14530 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
14540 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
14550 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
14560 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
14570 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
14580 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
14590 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
145a0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
145b0 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
145c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70  _ULONG_PTR pulOp
145d0 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29  erationStateLen)
145e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
145f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
14600 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
14610 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
14620 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14630 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14640 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
14650 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
14660 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
14670 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
14680 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14690 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
146a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
146b0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
146c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
146d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
146e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
146f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
14700 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
14710 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
14720 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  V, C_SetOperatio
14730 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
14740 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
14750 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
14760 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
14770 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72   CK_ULONG ulOper
14780 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43  ationStateLen, C
14790 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
147a0 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20  hEncryptionKey, 
147b0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
147c0 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   hAuthentication
147d0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
147e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
147f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
14800 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
14810 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
14820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14830 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
14840 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
14850 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
14860 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
14870 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
14880 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
14890 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
148a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
148b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
148c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
148d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
148e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
148f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
14900 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
14910 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
14920 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
14930 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
14940 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
14950 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
14960 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
14970 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 69  G ulPinLen) {..i
14980 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
14990 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b  ..int login_ret;
149a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
149b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
149c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
149d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
149e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
149f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
14a00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
14a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14a20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
14a30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
14a40 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
14a50 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
14a60 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
14a70 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
14a80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
14a90 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
14aa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14ab0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
14ac0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
14ad0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
14ae0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
14af0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
14b00 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21  ..if (userType !
14b10 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09  = CKU_USER) {...
14b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14b30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
14b40 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45  only support USE
14b50 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f  R mode, asked fo
14b60 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75  r %lu mode.", (u
14b70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73  nsigned long) us
14b80 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72  erType)....retur
14b90 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f  n(CKR_USER_TYPE_
14ba0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
14bb0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
14bc0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
14bd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
14be0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
14bf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
14c00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14c10 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
14c20 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
14c30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
14c40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
14c50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
14c60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
14c70 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
14c80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
14c90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
14ca0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14cb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14cc0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
14cd0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
14ce0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
14cf0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
14d00 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d  .}...login_ret =
14d10 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63   cackey_login(&c
14d20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
14d30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
14d40 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 70  sion].slotID], p
14d50 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 4e  Pin, ulPinLen, N
14d60 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  ULL);..if (login
14d70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
14d80 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61  CSC_S_OK) {...ca
14d90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
14da0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
14db0 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f  );....if (login_
14dc0 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
14dd0 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09  SC_E_LOCKED) {..
14de0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14df0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54  RINTF("Error.  T
14e00 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22  oken is locked."
14e10 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
14e20 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09  R_PIN_LOCKED);..
14e30 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69  .} else if (logi
14e40 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
14e50 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b  PCSC_E_BADPIN) {
14e60 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14e70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
14e80 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b   Invalid PIN.");
14e90 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
14ea0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
14eb0 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
14ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14ed0 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r.  Unknown erro
14ee0 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  r returned from 
14ef0 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28  cackey_login() (
14f00 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29  %i)", login_ret)
14f10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14f20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
14f30 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
14f40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
14f50 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
14f60 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
14f70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
14f80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
14f90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
14fa0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
14fb0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
14fc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14fd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
14fe0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
14ff0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15000 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
15010 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15020 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15030 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
15040 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
15050 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
15060 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
15070 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
15080 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
15090 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
150a0 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
150b0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
150c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
150d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
150e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
150f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
15110 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
15120 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15130 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
15140 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
15150 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
15160 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
15170 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
15180 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
15190 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
151a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
151b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
151c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
151d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
151e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
151f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
15200 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
15210 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
15220 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
15230 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
15240 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
15250 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
15260 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15270 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15280 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
15290 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
152a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
152b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
152c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
152d0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
152e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
152f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
15300 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
15310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15320 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
15330 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
15340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
15350 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
15360 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
15370 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
15380 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
15390 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
153a0 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ION;...mutex_ret
153b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
153c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
153d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
153e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
153f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
15400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15410 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
15420 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
15430 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
15440 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
15450 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15460 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
15470 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
15480 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
15490 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
154a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
154b0 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
154c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
154d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
154e0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
154f0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
15500 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
15510 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
15520 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
15530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15540 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15550 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
15560 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
15570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15580 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
15590 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
155a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
155b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
155c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
155d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
155e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
155f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
15600 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
15610 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
15620 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
15630 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
15640 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
15650 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
15660 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
15670 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
15680 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
15690 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
156a0 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
156b0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
156c0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
156d0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
156e0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
156f0 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
15700 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
15710 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15720 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
15730 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
15740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
15760 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
15770 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15780 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
15790 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
157a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
157b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
157c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
157d0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
157e0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
157f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
15800 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
15810 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15820 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
15830 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
15840 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
15850 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
15860 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
15870 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
15880 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
15890 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
158a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
158b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
158c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
158d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
158e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
158f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
15900 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
15910 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
15920 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
15930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15940 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
15950 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
15960 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
15970 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
15980 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
15990 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
159a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
159b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
159c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
159d0 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
159e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
159f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
15a00 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
15a10 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
15a20 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
15a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15a40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
15a50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
15a60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
15a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15a80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
15a90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
15aa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
15ab0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
15ac0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
15ad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15ae0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
15af0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15b00 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
15b10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
15b20 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
15b30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
15b40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
15b50 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
15b60 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
15b70 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
15b80 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
15b90 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
15ba0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
15bb0 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
15bc0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
15bd0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
15be0 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
15bf0 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
15c00 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
15c10 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
15c20 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
15c30 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
15c40 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
15c50 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
15c60 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
15c70 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
15c80 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
15c90 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
15ca0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
15cb0 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
15cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15cd0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
15ce0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
15cf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
15d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15d10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
15d20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
15d30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
15d40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
15d50 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
15d60 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
15d70 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
15d80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
15d90 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
15da0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
15db0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15dc0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
15dd0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
15de0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
15df0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
15e00 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
15e10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
15e20 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
15e30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15e40 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
15e50 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
15e60 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
15e70 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
15e80 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
15e90 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
15ea0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
15eb0 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
15ec0 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
15ed0 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
15ee0 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
15ef0 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
15f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15f10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15f20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
15f30 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
15f40 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
15f50 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
15f60 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
15f70 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
15f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15f90 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
15fa0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
15fb0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
15fc0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
15fd0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
15fe0 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
15ff0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
16000 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
16010 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16020 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
16030 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
16040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16050 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
16060 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
16070 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
16080 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
16090 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
160a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
160b0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
160c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
160d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
160e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
160f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
16100 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
16110 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
16120 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
16130 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
16140 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
16150 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16160 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
16170 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
16180 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
16190 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
161a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
161b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
161c0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
161d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
161e0 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
161f0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
16200 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
16210 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
16220 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16230 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
16240 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16250 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
16260 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
16270 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
16280 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
16290 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
162a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
162b0 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
162c0 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
162d0 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
162e0 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
162f0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
16300 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
16310 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
16320 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
16330 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
16340 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
16350 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16360 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
16370 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
16380 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
16390 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
163a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
163b0 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
163c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
163d0 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
163e0 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
163f0 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
16400 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
16410 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
16420 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
16430 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
16440 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
16450 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
16460 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
16470 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
16480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16490 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
164a0 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
164b0 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
164c0 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
164d0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
164e0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
164f0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
16500 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
16510 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
16520 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
16530 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
16540 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
16550 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
16560 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16570 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
16580 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
16590 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
165a0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
165b0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
165c0 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
165d0 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
165e0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
165f0 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
16600 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
16610 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
16620 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
16630 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
16640 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
16650 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
16660 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
16670 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
16680 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
16690 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
166a0 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
166b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
166c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
166d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
166e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
166f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
16700 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16710 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16720 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
16730 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
16740 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
16750 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
16760 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
16770 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
16780 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
16790 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
167a0 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
167b0 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
167c0 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
167d0 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
167e0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
167f0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
16800 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
16810 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16820 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
16830 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
16840 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
16850 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
16860 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
16870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16880 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16890 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
168a0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
168b0 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
168c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
168d0 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
168e0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
168f0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
16900 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
16910 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
16920 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
16930 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
16940 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
16950 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
16960 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
16970 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
16980 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
16990 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
169a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
169b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
169c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
169d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
169e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
169f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
16a00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
16a10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
16a20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
16a30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
16a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16a50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
16a60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
16a70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
16a80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
16a90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
16aa0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
16ab0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
16ac0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
16ad0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
16ae0 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
16af0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
16b00 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
16b10 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
16b20 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
16b30 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  lCount) {..struc
16b40 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
16b50 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
16b60 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
16b70 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
16b80 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
16b90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
16ba0 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
16bb0 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
16bc0 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
16bd0 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
16be0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
16bf0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
16c00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
16c10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
16c20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
16c30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16c40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16c50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
16c60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
16c70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
16c80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
16c90 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
16ca0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
16cb0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
16cc0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
16cd0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
16ce0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
16cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16d00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
16d10 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
16d20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
16d30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
16d40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
16d50 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
16d60 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
16d70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
16d80 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
16d90 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
16da0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16db0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
16dc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
16dd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16de0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
16df0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
16e00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
16e10 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
16e20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
16e30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
16e40 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
16e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16e60 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
16e70 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
16e80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
16e90 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
16ea0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
16eb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16ec0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
16ed0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
16ee0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16ef0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16f20 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61  Search already a
16f30 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
16f40 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
16f50 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
16f60 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
16f70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
16f80 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
16f90 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65  LL) {...pcsc_ide
16fa0 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
16fb0 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63  _read_certs(&cac
16fc0 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b 65 79  key_slots[cackey
16fd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
16fe0 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c  on].slotID], NUL
16ff0 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
17000 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
17010 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
17020 0a 09 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e  ..../* Convert n
17030 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74  umber of Certs t
17040 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  o number of obje
17050 63 74 73 20 2a 2f 0a 09 09 09 6e 75 6d 5f 69 64  cts */....num_id
17060 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45  s = (CKO_PRIVATE
17070 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49  _KEY - CKO_CERTI
17080 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75  FICATE + 1) * nu
17090 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 09 69 64 65  m_certs;.....ide
170a0 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63  ntities = malloc
170b0 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f  (num_ids * sizeo
170c0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b  f(*identities));
170d0 0a 0a 09 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  .....id_idx = 0;
170e0 0a 09 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64  ....for (cert_id
170f0 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20  x = 0; cert_idx 
17100 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72  < num_certs; cer
17110 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 66  t_idx++) {.....f
17120 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
17130 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
17140 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
17150 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
17160 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
17170 65 2b 2b 29 20 7b 0a 09 09 09 09 09 69 64 65 6e  e++) {......iden
17180 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
17190 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
171a0 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
171b0 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20  s(curr_id_type, 
171c0 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
171d0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74  [cert_idx], cert
171e0 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
171f0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17200 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  utes_count);....
17210 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
17220 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
17230 75 74 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  utes == NULL) {.
17240 09 09 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
17250 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
17260 74 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  tes_count = 0;..
17270 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 64 5f 69  ....}.......id_i
17280 64 78 2b 2b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  dx++;.....}....}
17290 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
172a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
172b0 64 65 6e 74 69 74 69 65 73 20 3d 20 69 64 65 6e  dentities = iden
172c0 74 69 74 69 65 73 3b 0a 09 09 09 63 61 63 6b 65  tities;....cacke
172d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
172e0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
172f0 63 6f 75 6e 74 20 3d 20 6e 75 6d 5f 69 64 73 3b  count = num_ids;
17300 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
17310 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
17320 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
17330 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  s, 1);...}..}...
17340 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
17350 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
17360 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
17370 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
17380 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
17390 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
173a0 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
173b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
173c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
173d0 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
173e0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
173f0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
17400 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
17410 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17420 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
17430 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
17440 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
17450 70 6c 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73  plate));...} els
17460 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
17470 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17480 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
17490 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
174a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
174b0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
174c0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
174d0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
174e0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
174f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17500 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17510 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
17520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17530 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
17540 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
17550 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
17560 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
17570 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
17580 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
17590 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
175a0 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
175b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
175c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
175d0 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
175e0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
175f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
17600 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
17610 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
17620 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17630 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
17640 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
17650 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
17660 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
17670 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
17680 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
17690 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
176a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
176b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
176c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
176d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
176e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
176f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17700 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
17710 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
17720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17730 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
17740 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
17750 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
17760 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
17770 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
17780 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b  _FindObjects)(CK
17790 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
177a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
177b0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
177c0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
177d0 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  G ulMaxObjectCou
177e0 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  nt, CK_ULONG_PTR
177f0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29   pulObjectCount)
17800 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
17810 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72  y_identity *curr
17820 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  _id;..CK_ATTRIBU
17830 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
17840 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64  CK_ULONG curr_id
17850 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69  _idx, curr_out_i
17860 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72  d_idx, curr_attr
17870 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
17880 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d  idx;..CK_ULONG m
17890 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72  atched_count, pr
178a0 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
178b0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
178c0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
178d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
178e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
178f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
17900 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17920 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
17930 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17940 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
17950 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
17960 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65  .}...if (pulObje
17970 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ctCount == NULL)
17980 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
17990 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
179a0 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74    pulObjectCount
179b0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
179c0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
179d0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
179e0 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20  if (phObject == 
179f0 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a  NULL && ulMaxObj
17a00 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
17a10 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
17a20 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
17a30 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
17a40 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
17a50 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
17a60 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63  y */...*pulObjec
17a70 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43  tCount = 0;....C
17a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17a90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
17aa0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
17ab0 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
17ac0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
17ad0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
17ae0 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c  (phObject == NUL
17af0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
17b00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17b10 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20  r.  phObject is 
17b20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
17b30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
17b40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
17b50 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
17b60 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
17b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17b80 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20  Error.  Maximum 
17b90 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
17ba0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a  s specified as z
17bb0 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ero.");....retur
17bc0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
17bd0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
17be0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
17bf0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
17c00 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
17c10 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
17c20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
17c30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
17c40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17c50 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
17c60 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
17c70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
17c80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
17c90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
17ca0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
17cb0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
17cc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
17cd0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
17ce0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
17cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17d00 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
17d10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
17d20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
17d30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
17d40 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
17d50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
17d60 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
17d70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17d80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
17d90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17da0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
17db0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
17dc0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
17dd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
17de0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
17df0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
17e00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
17e10 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
17e20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
17e30 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
17e40 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
17e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17e60 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
17e70 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
17e80 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
17e90 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
17ea0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
17eb0 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 30 3b  curr_id_idx = 0;
17ec0 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  ..curr_out_id_id
17ed0 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
17ee0 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65  r_id_idx = cacke
17ef0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
17f00 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
17f10 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  _id; curr_id_idx
17f20 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
17f30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
17f40 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26  ntities_count &&
17f50 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
17f60 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b  t; curr_id_idx++
17f70 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20  ) {...curr_id = 
17f80 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
17f90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
17fa0 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64  ities[curr_id_id
17fb0 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  x];....CACKEY_DE
17fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63  BUG_PRINTF("Proc
17fd0 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  essing identity:
17fe0 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
17ff0 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64  long) curr_id_id
18000 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63  x);....matched_c
18010 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72  ount = 0;....for
18020 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20   (curr_attr_idx 
18030 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  = 0; curr_attr_i
18040 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
18050 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
18060 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
18070 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  t; curr_attr_idx
18080 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61  ++) {....prev_ma
18090 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61  tched_count = ma
180a0 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09  tched_count;....
180b0 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61  .curr_attr = &ca
180c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
180d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
180e0 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69  uery[curr_attr_i
180f0 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  dx];.....CACKEY_
18100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
18110 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74  Checking for att
18120 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 69  ribute 0x%08lx i
18130 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e  n identity:%i...
18140 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18150 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
18160 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
18170 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
18180 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
18190 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
181a0 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
181b0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
181c0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
181d0 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
181e0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
181f0 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
18200 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
18210 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
18220 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
18230 09 09 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d  ....if (curr_id-
18240 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
18250 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
18260 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
18270 70 65 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  pe) {......CACKE
18280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18290 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61      ... found ma
182a0 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22  tching type ..."
182b0 29 3b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
182c0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
182d0 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65     ... our value
182e0 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74  :", curr_id->att
182f0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
18300 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63  r_idx].pValue, c
18310 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
18320 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
18330 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ].ulValueLen);..
18340 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
18350 74 72 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55  tr->pValue == NU
18360 4c 4c 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  LL) {.......CACK
18370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18380 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
18390 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68  d wildcard match
183a0 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68  ");........match
183b0 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
183c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
183d0 0a 0a 20 09 09 09 09 09 69 66 20 28 63 75 72 72  .. .....if (curr
183e0 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
183f0 6e 20 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74  n == curr_id->at
18400 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
18410 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
18420 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72  en && memcmp(cur
18430 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20  r_attr->pValue, 
18440 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
18450 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
18460 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  x].pValue, curr_
18470 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
18480 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
18490 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20  ValueLen) == 0) 
184a0 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  {.......CACKEY_D
184b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
184c0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78      ... found ex
184d0 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  act match");....
184e0 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
184f0 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
18500 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
18510 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74  ...}...../* If t
18520 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75  he attribute cou
18530 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65  ld not be matche
18540 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f  d, do not try to
18550 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61   match additiona
18560 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a  l attributes */.
18570 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63  ...if (prev_matc
18580 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74  hed_count == mat
18590 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ched_count) {...
185a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
185b0 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64  }....if (matched
185c0 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79  _count == cackey
185d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
185e0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
185f0 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
18600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18610 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61  ("  ... All %i a
18620 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
18630 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64  d for found, add
18640 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20  ing identity:%i 
18650 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74  to returned list
18660 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f  ", (int) cackey_
18670 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
18680 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
18690 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
186a0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70  r_id_idx);.....p
186b0 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74  hObject[curr_out
186c0 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f  _id_idx] = curr_
186d0 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09  id_idx + 1;.....
186e0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
186f0 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74  --;.....curr_out
18700 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65  _id_idx++;...} e
18710 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
18720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
18730 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28  ... Not all %i (
18740 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61  only found %i) a
18750 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
18760 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74  d for found, not
18770 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
18780 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b  :%i", (int) cack
18790 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
187a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
187b0 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ry_count, (int) 
187c0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28  matched_count, (
187d0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
187e0 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65  );...}..}..cacke
187f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
18800 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
18810 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  _id = curr_id_id
18820 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  x;..*pulObjectCo
18830 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69  unt = curr_out_i
18840 64 5f 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72  d_idx;...mutex_r
18850 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
18860 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
18870 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
18880 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
18890 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
188a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
188b0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
188c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
188d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
188e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
188f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18900 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
18910 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62  _OK (%i), num ob
18920 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b  jects = %lu", CK
18930 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74  R_OK, *pulObject
18940 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  Count);...return
18950 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
18960 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
18970 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
18980 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
18990 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
189a0 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
189b0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
189c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
189d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
189e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
189f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18a10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18a20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
18a30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18a40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18a50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
18a60 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
18a70 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
18a80 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
18a90 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
18aa0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
18ab0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
18ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18ad0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
18ae0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
18af0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
18b00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
18b10 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
18b20 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
18b30 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
18b40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
18b50 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
18b60 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
18b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18b80 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
18b90 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
18ba0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
18bb0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
18bc0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
18bd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
18be0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
18bf0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
18c00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
18c10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18c20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
18c30 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
18c40 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
18c50 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
18c60 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
18c70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
18c80 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18c90 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
18ca0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
18cb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
18cc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
18cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18ce0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
18cf0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
18d00 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
18d10 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
18d20 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18d30 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
18d40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
18d50 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69  h_active = 0;..i
18d60 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
18d70 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
18d80 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
18d90 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
18da0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
18db0 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
18dc0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
18dd0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
18de0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18df0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
18e00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
18e10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18e20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
18e30 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
18e40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18e50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
18e60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
18e70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18e80 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
18e90 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
18ea0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
18eb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
18ec0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
18ed0 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
18ee0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
18ef0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
18f00 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
18f10 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
18f20 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
18f30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18f40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18f50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18f60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18f80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18f90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
18fa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18fb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18fc0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
18fd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18fe0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
18ff0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
19000 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
19010 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
19020 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
19030 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
19040 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
19050 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
19060 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
19070 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
19080 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
19090 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
190a0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
190b0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
190c0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
190d0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
190e0 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
190f0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
19100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19110 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
19120 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
19130 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
19140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19150 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
19160 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
19170 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
19180 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
19190 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
191a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
191b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
191c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
191d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
191e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
191f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
19200 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
19210 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
19220 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
19230 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
19240 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
19250 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
19260 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
19270 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
19280 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
19290 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
192a0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
192b0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
192c0 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
192d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
192e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
192f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
19300 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
19310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19320 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
19330 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
19340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
19350 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
19360 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
19370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19380 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19390 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
193a0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
193b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
193c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
193d0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
193e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
193f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
19400 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
19410 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
19420 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
19430 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
19440 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
19450 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
19460 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
19470 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
19480 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
19490 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
194a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
194b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
194c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
194d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
194e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
194f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19500 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
19510 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
19520 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19530 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19540 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
19550 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
19560 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
19570 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
19580 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
19590 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
195a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
195b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
195c0 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
195d0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
195e0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
195f0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
19600 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
19610 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
19620 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
19630 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
19640 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19650 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19660 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
19670 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
19680 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19690 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
196a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
196b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
196c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
196d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
196e0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
196f0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
19700 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19710 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
19720 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
19730 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
19740 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
19750 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
19760 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
19770 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
19780 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19790 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
197a0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
197b0 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
197c0 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
197d0 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
197e0 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
197f0 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
19800 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
19810 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
19820 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
19830 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
19840 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
19850 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
19860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19870 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
19880 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
19890 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
198a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
198b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
198c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
198d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
198e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
198f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
19900 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
19910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19920 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
19930 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
19940 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19950 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19960 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
19970 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19980 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
19990 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
199a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
199b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
199c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
199d0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
199e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
199f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
19a00 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
19a10 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
19a20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19a30 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
19a40 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
19a50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
19a60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19a70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19a80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19a90 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
19aa0 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
19ab0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
19ac0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
19ad0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
19ae0 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
19af0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
19b00 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
19b10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
19b20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
19b30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
19b40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19b50 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
19b60 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
19b70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19b80 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e  KR_KEY_HANDLE_IN
19b90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
19ba0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19bb0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
19bc0 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
19bd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19be0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
19bf0 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
19c00 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
19c10 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
19c20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
19c30 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d  rypt_mech_parm =
19c40 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61   pMechanism->pPa
19c50 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79  rameter;..cackey
19c60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19c70 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
19c80 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68  _parmlen = pMech
19c90 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74  anism->ulParamet
19ca0 65 72 4c 65 6e 3b 0a 0a 09 6d 75 74 65 78 5f 72  erLen;...mutex_r
19cb0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19cc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
19cd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
19ce0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
19cf0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
19d00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
19d10 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
19d20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
19d30 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
19d40 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
19d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19d60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
19d70 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
19d80 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
19d90 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
19da0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
19db0 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
19dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
19dd0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
19de0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
19df0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
19e00 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
19e10 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
19e20 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
19e30 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
19e40 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
19e50 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
19e60 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
19e70 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09   decrypt_ret;...
19e80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19e90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
19ea0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
19eb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
19ec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19ed0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
19ee0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
19ef0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
19f00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
19f10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
19f20 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
19f30 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
19f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19f50 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
19f60 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
19f70 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
19f80 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
19f90 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
19fa0 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
19fb0 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
19fc0 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
19fd0 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
19fe0 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
19ff0 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
1a000 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
1a010 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
1a020 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
1a030 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1a040 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a050 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
1a060 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
1a070 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
1a080 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a090 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
1a0a0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
1a0b0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
1a0c0 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
1a0d0 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
1a0e0 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
1a0f0 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
1a100 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
1a110 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
1a120 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
1a130 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
1a140 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
1a150 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
1a160 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
1a170 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1a180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a190 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
1a1a0 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
1a1b0 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
1a1c0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1a1d0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
1a1e0 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
1a1f0 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
1a200 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
1a210 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
1a220 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
1a230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a240 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1a250 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1a260 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a270 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1a280 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1a290 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
1a2a0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1a2b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1a2c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
1a2d0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
1a2e0 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
1a2f0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
1a300 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
1a310 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
1a320 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
1a330 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
1a340 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
1a350 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  n;..CK_RV retval
1a360 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
1a370 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78  RROR;..int mutex
1a380 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1a390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a3a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a3b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a3c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a3e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a3f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a400 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a410 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a420 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1a430 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1a440 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1a450 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1a460 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1a470 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1a480 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a490 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a4a0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1a4b0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1a4c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1a4d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1a4e0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  ID);..}...if (pE
1a4f0 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
1a500 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70  NULL && ulEncryp
1a510 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
1a520 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
1a530 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
1a540 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74  asked to decrypt
1a550 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
1a560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a570 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1a580 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
1a590 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
1a5a0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
1a5b0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
1a5c0 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
1a5d0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1a5e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a5f0 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72  TF("Error. pEncr
1a600 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c  yptedPart is NUL
1a610 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74  L, but ulEncrypt
1a620 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  edPartLen is not
1a630 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
1a640 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1a650 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
1a660 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1a670 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
1a680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a690 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74  Error. ulEncrypt
1a6a0 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  edPartLen is 0, 
1a6b0 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
1a6c0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1a6d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a6e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1a6f0 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  (pulPartLen == N
1a700 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1a710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a720 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20  ror. pulPartLen 
1a730 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1a740 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1a750 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
1a760 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1a770 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1a780 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1a790 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1a7a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1a7b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a7c0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1a7d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1a7e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1a7f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1a800 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
1a810 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
1a820 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1a830 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1a840 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a870 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
1a880 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1a890 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
1a8a0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
1a8b0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1a8c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1a8d0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1a8e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1a8f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1a900 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1a910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a920 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
1a930 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
1a940 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
1a950 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
1a960 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a970 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
1a980 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1a990 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
1a9a0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
1a9b0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
1a9c0 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 2d 31 3b  ....buflen = -1;
1a9d0 0a 0a 09 09 09 2f 2a 20 58 58 58 3a 20 41 73 6b  ...../* XXX: Ask
1a9e0 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
1a9f0 20 2a 2f 0a 0a 09 09 09 69 66 20 28 62 75 66 6c   */.....if (bufl
1aa00 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
1aa10 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c   Decryption fail
1aa20 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  ed. */.....retva
1aa30 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1aa40 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65  ERROR;....} else
1aa50 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
1aa60 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
1aa70 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
1aa80 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
1aa90 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
1aaa0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
1aab0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
1aac0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
1aad0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
1aae0 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
1aaf0 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
1ab00 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
1ab10 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
1ab20 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
1ab30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
1ab40 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
1ab50 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
1ab60 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ab70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ab80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ab90 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1aba0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1abb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1abc0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1abd0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1abe0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1abf0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1ac00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ac10 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
1ac20 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
1ac30 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
1ac40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1ac50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1ac60 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
1ac70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1ac80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1ac90 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
1aca0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1acb0 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
1acc0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1acd0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
1ace0 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
1acf0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ad00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ad10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1ad20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1ad30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ad40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1ad50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1ad60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ad70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1ad80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1ad90 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1ada0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1adb0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1adc0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1add0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1ade0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1adf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ae00 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1ae10 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1ae20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ae30 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ae40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ae50 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
1ae60 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
1ae70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ae80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
1ae90 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
1aea0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1aeb0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1aec0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1aed0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1aee0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1aef0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1af00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1af10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1af20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1af30 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1af40 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1af50 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1af60 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1af70 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1af80 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1af90 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1afa0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1afb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1afc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1afd0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1afe0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1aff0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1b000 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1b010 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1b020 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1b030 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1b040 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
1b050 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1b060 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1b070 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1b080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b090 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
1b0a0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1b0b0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1b0c0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1b0d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1b0e0 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
1b0f0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
1b100 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
1b110 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
1b120 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
1b130 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
1b140 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
1b150 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b160 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
1b170 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
1b180 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1b190 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1b1a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1b1b0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1b1c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1b1d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b1e0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1b1f0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1b200 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1b210 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1b220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b230 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1b240 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1b250 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1b260 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1b270 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1b280 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
1b290 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
1b2a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1b2b0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
1b2c0 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
1b2d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b2e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1b2f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1b300 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1b330 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1b340 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1b350 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1b360 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1b370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b380 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1b390 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b3a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1b3b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1b3c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1b3d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1b3e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1b3f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1b400 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1b410 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
1b420 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1b430 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1b440 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
1b450 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
1b460 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
1b470 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1b480 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
1b490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b4a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1b4b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1b4c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1b4d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b4e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1b4f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1b500 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1b510 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1b520 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1b530 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b540 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1b550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1b560 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1b570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1b580 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1b590 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1b5a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b5b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1b5c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1b5d0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
1b5e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b5f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1b600 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
1b610 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
1b620 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1b630 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1b640 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1b650 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b660 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b670 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b680 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b690 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b6a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b6b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b6c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b6d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b6e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1b6f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1b700 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1b710 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b720 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1b730 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b740 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1b750 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1b760 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
1b770 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1b780 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1b790 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
1b7a0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1b7b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b7c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1b7d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1b7e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b7f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b800 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1b810 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b820 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1b830 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1b840 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b850 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b860 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1b870 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1b880 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1b890 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1b8a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1b8b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b8c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1b8d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b8e0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
1b8f0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
1b900 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1b910 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
1b920 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
1b930 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
1b940 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1b950 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1b960 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1b970 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1b980 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b990 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b9a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1b9b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b9c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1b9d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1b9e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b9f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ba00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ba10 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1ba20 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1ba30 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ba40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1ba50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1ba60 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1ba70 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ba80 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
1ba90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1baa0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1bab0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1bac0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
1bad0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
1bae0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1baf0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
1bb00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bb10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1bb20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1bb30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1bb40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bb50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1bb60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1bb70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1bb80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1bb90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1bba0 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
1bbb0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1bbc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bbd0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
1bbe0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1bbf0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1bc00 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1bc10 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
1bc20 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
1bc30 5f 52 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65  _RSA_PKCS && pMe
1bc40 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1bc50 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52  sm != CKM_SHA1_R
1bc60 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43  SA_PKCS) {...CAC
1bc70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bc80 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
1bc90 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e  ism->mechanism n
1bca0 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
1bcb0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20  CKM_RSA_PKCS or 
1bcc0 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43  CKM_SHA1_RSA_PKC
1bcd0 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
1bce0 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
1bcf0 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
1bd00 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1bd10 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1bd20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1bd30 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1bd40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1bd50 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1bd60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bd70 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1bd80 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1bd90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1bda0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1bdb0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1bdc0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1bdd0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1bde0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1bdf0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1be00 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1be10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1be20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1be30 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1be40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1be50 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1be60 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1be70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1be80 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1be90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1bea0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1beb0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1bec0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bed0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1bee0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1bef0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1bf00 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1bf10 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
1bf20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bf30 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
1bf40 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1bf50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1bf60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1bf70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
1bf90 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  n already in pro
1bfa0 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
1bfb0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1bfc0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
1bfd0 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
1bfe0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1bff0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
1c000 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
1c010 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c020 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c030 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1c040 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c050 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
1c060 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 0a  t of range.");..
1c070 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59  ..return(CKR_KEY
1c080 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1c090 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1c0a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c0b0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31  .sign_active = 1
1c0c0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
1c0d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1c0e0 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70  gn_mechanism = p
1c0f0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
1c100 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  nism;...cackey_s
1c110 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1c120 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
1c130 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  128;..cackey_ses
1c140 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1c150 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30  sign_bufused = 0
1c160 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
1c170 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1c180 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73  n_buf = malloc(s
1c190 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65  izeof(*cackey_se
1c1a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c1b0 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63  .sign_buf) * cac
1c1c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1c1d0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
1c1e0 65 6e 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  en);...mutex_ret
1c1f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1c200 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c210 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1c220 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1c230 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1c240 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c250 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1c260 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1c270 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1c280 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1c290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c2a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1c2b0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1c2c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1c2d0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1c2e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1c2f0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
1c300 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1c310 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1c320 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1c330 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1c340 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
1c350 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
1c360 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1c370 29 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f  ) {..CK_RV sign_
1c380 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
1c390 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1c3a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1c3b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c3c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c3d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c3e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c3f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c400 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c410 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c420 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1c430 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
1c440 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
1c450 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
1c460 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
1c470 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1c480 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c490 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
1c4a0 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1c4b0 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1c4c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1c4d0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
1c4e0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
1c4f0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1c500 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
1c510 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
1c520 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
1c530 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
1c540 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
1c550 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c560 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
1c570 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
1c580 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
1c590 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
1c5a0 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
1c5b0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
1c5c0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
1c5d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c5e0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c5f0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1c600 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1c610 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1c620 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1c630 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
1c640 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1c650 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1c660 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
1c670 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
1c680 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
1c690 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1c6a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c6b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c6c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1c6d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1c6e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c6f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1c700 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1c710 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1c720 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1c730 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1c740 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1c750 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1c760 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c770 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c7a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c7b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1c7c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1c7d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1c7e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1c7f0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
1c800 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
1c810 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
1c820 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
1c830 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
1c840 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
1c850 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
1c860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c870 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1c880 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1c890 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1c8a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c8b0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
1c8c0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
1c8d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c8e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
1c8f0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
1c900 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
1c910 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
1c920 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c930 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
1c940 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1c950 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c960 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
1c970 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
1c980 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
1c990 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1c9a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1c9b0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1c9c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1c9d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1c9e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1c9f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1ca00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ca10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ca20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1ca30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ca40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ca50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ca60 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1ca70 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1ca80 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ca90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1caa0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1cab0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cac0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1cad0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1cae0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1caf0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1cb00 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1cb10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1cb20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cb30 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
1cb40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1cb50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1cb60 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1cb70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1cb80 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
1cb90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1cba0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1cbb0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
1cbc0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
1cbd0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
1cbe0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1cbf0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
1cc00 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
1cc10 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
1cc20 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
1cc30 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
1cc40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1cc50 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
1cc60 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
1cc70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1cc80 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1cc90 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
1cca0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ccb0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1ccc0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
1ccd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1cce0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
1ccf0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
1cd00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1cd10 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
1cd20 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
1cd30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1cd40 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
1cd50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1cd60 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1cd70 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
1cd80 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
1cd90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1cda0 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
1cdb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1cdc0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
1cdd0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
1cde0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
1cdf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ce00 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
1ce10 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
1ce20 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
1ce30 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1ce40 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
1ce50 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
1ce60 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
1ce70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ce80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ce90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cea0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ceb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1cec0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1ced0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1cee0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1cef0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1cf00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1cf10 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
1cf20 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
1cf30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1cf40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1cf50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1cf60 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1cf70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1cf80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cf90 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1cfa0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1cfb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1cfc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1cfd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cfe0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1cff0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1d000 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1d010 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1d020 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d030 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
1d040 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1d050 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1d060 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1d070 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
1d080 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
1d090 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
1d0a0 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
1d0b0 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
1d0c0 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  len;..CK_RV retv
1d0d0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
1d0e0 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72  _ERROR;..int ter
1d0f0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
1d100 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1d110 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1d120 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1d130 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1d140 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1d150 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d160 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d170 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1d180 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1d190 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1d1a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1d1b0 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61  }...if (pulSigna
1d1c0 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  tureLen == NULL)
1d1d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d1e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d1f0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1d200 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1d210 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1d220 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1d230 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1d240 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1d250 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d260 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1d270 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1d280 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1d290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d2a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1d2b0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1d2c0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1d2d0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1d2e0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1d2f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1d300 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1d310 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d320 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d330 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d350 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1d360 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1d370 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1d380 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1d390 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1d3a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1d3b0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1d3c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d3d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d3e0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1d3f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d400 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1d410 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1d420 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1d430 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1d440 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1d450 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1d460 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
1d470 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1d480 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d490 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1d4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d4b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
1d4c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1d4d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1d4e0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1d4f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d500 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
1d510 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1d520 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
1d530 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
1d540 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 73 69 67  RSA_PKCS:....sig
1d550 62 75 66 6c 65 6e 20 3d 20 2d 31 3b 0a 0a 09 09  buflen = -1;....
1d560 09 2f 2a 20 58 58 58 3a 20 41 73 6b 20 63 61 72  ./* XXX: Ask car
1d570 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 0a 09 09  d to sign */....
1d580 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c  .if (sigbuflen <
1d590 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67   0) {...../* Sig
1d5a0 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  ning failed. */.
1d5b0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
1d5c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
1d5d0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
1d5e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1d5f0 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  igbuflen) > *pul
1d600 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20  SignatureLen && 
1d610 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
1d620 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61  ../* Signed data
1d630 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
1d640 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
1d650 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
1d660 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  ......terminate_
1d670 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65  sign = 0;....} e
1d680 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e  lse {.....termin
1d690 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09  ate_sign = 0;...
1d6a0 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72  ...if (pSignatur
1d6b0 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
1d6c0 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67  (pSignature, sig
1d6d0 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b  buf, sigbuflen);
1d6e0 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65  .......terminate
1d6f0 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d  _sign = 1;.....}
1d700 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74  ......*pulSignat
1d710 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c  ureLen = sigbufl
1d720 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
1d730 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
1d740 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
1d750 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
1d760 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
1d770 6c 61 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31  late into a SHA1
1d780 20 68 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b   hash */....cack
1d790 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1d7a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1d7b0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d7c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d7d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1d7e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1d7f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1d800 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d810 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
1d820 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d830 55 50 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72  UPPORTED);....br
1d840 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
1d850 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
1d860 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
1d870 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1d880 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
1d890 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
1d8a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1d8b0 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
1d8c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1d8d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
1d8e0 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
1d8f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1d900 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1d910 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d920 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d930 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1d960 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1d970 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d980 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1d990 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1d9a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d9b0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
1d9c0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
1d9d0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
1d9e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1d9f0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
1da00 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
1da10 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1da20 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
1da30 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
1da40 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
1da50 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
1da60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1da70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1da80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1da90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1daa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dab0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1dac0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1dad0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1dae0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1daf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1db00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1db10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1db20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1db30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1db40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1db50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1db60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1db70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1db80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1db90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
1dba0 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
1dbb0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1dbc0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1dbd0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
1dbe0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
1dbf0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
1dc00 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
1dc10 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
1dc20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1dc30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1dc40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1dc50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1dc60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dc70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dc80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1dc90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1dca0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1dcb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1dcc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1dcd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1dce0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1dcf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1dd00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1dd10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1dd20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1dd30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1dd40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1dd50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1dd60 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
1dd70 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
1dd80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1dd90 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
1dda0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
1ddb0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
1ddc0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1ddd0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1dde0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ddf0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1de00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1de10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1de20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1de30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1de40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1de50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1de60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1de70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1de80 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1de90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1dea0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1deb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1dec0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1ded0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1dee0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1def0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1df00 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
1df10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1df20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1df30 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
1df40 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
1df50 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1df60 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
1df70 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
1df80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1df90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1dfa0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1dfb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1dfc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dfd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dfe0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1dff0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e000 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e010 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e020 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e030 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e040 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e050 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e060 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e070 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e080 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e0a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e0b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e0c0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
1e0d0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
1e0e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1e0f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
1e100 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
1e110 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
1e120 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e130 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e140 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1e150 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1e160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e170 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1e180 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1e190 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1e1a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1e1b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1e1c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e1d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1e1e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e1f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1e200 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e210 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1e220 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1e230 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1e240 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e250 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
1e260 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
1e270 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1e280 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1e290 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
1e2a0 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
1e2b0 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
1e2c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1e2d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1e2e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1e2f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1e300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e310 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1e320 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1e330 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1e340 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1e350 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1e360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1e370 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1e380 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1e390 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1e3a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e3b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1e3c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1e3d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1e3e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e3f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
1e400 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
1e410 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1e420 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1e430 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1e440 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
1e450 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
1e460 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e470 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e480 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e490 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e4a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e4b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e4c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e4d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e4e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e4f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1e500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e510 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e520 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e530 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1e540 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1e550 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1e560 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1e570 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e580 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1e590 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1e5a0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
1e5b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1e5c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1e5d0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
1e5e0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
1e5f0 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
1e600 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
1e610 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1e620 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
1e630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e640 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e650 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1e660 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1e670 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e680 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1e690 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1e6a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1e6b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1e6c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1e6d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e6e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1e6f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e700 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1e710 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e720 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1e730 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1e740 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1e750 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1e760 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
1e770 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
1e780 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1e790 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1e7a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
1e7b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
1e7c0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
1e7d0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
1e7e0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1e7f0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1e800 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1e810 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e820 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e830 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e840 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e850 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e860 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e870 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e880 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e890 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e8a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1e8b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e8c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1e8d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1e8e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1e8f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e900 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e910 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1e920 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1e930 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e940 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
1e950 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
1e960 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1e970 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1e980 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
1e990 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
1e9a0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1e9b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
1e9c0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
1e9d0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
1e9e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e9f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ea00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ea10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ea20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ea30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1ea40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1ea50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ea60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1ea70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1ea80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ea90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1eaa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1eab0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1eac0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ead0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1eae0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1eaf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1eb00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1eb10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1eb20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
1eb30 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
1eb40 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1eb50 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
1eb60 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
1eb70 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
1eb80 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
1eb90 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
1eba0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
1ebb0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
1ebc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1ebd0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1ebe0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1ebf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1ec00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ec10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1ec20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1ec30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ec40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1ec50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1ec60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ec70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ec80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ec90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1eca0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1ecb0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1ecc0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ecd0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1ece0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ecf0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
1ed00 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
1ed10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1ed20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1ed30 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
1ed40 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
1ed50 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1ed60 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1ed70 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
1ed80 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
1ed90 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1eda0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1edb0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1edc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1edd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ede0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1edf0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1ee00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ee10 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1ee20 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ee30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ee40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1ee50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ee60 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1ee70 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1ee80 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1ee90 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1eea0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1eeb0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1eec0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1eed0 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
1eee0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1eef0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1ef00 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1ef10 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
1ef20 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
1ef30 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
1ef40 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
1ef50 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
1ef60 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1ef70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ef80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ef90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1efa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1efb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1efc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1efd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1efe0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1eff0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f000 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f010 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f020 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f030 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f040 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f050 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f060 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f070 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f080 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f090 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f0a0 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
1f0b0 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
1f0c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1f0d0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
1f0e0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
1f0f0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
1f100 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
1f110 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1f120 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
1f130 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
1f140 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
1f150 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
1f160 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
1f170 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
1f180 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
1f190 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
1f1a0 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
1f1b0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
1f1c0 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
1f1d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f1e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f1f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f200 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f210 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f220 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f230 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f240 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f250 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f260 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1f270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f280 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1f290 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f2a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1f2b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f2c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1f2d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1f2e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f2f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1f300 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
1f310 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
1f320 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f330 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1f340 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1f350 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1f360 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
1f370 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1f380 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
1f390 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
1f3a0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1f3b0 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
1f3c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f3d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1f3e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1f3f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1f400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1f420 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1f430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f440 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1f450 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1f460 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f470 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f480 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1f490 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1f4a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1f4b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1f4c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1f4d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f4e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1f4f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1f500 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
1f510 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1f520 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
1f530 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
1f540 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
1f550 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
1f560 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
1f570 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
1f580 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
1f590 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
1f5a0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
1f5b0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
1f5c0 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
1f5d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
1f5e0 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
1f5f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f600 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1f610 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f620 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f640 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f650 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f660 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f670 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f680 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1f690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1f6b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1f6c0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1f6d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f6e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1f6f0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1f700 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f710 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f720 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f730 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
1f740 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1f750 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
1f760 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
1f770 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
1f780 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
1f790 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1f7a0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1f7b0 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
1f7c0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
1f7d0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
1f7e0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
1f7f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1f800 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1f810 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f820 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f830 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f840 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f850 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f860 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f870 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f880 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1f890 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f8a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1f8b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1f8c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1f8d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1f8e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f8f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f900 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1f910 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f920 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
1f930 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
1f940 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1f950 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
1f960 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
1f970 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
1f980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f990 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1f9a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1f9b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1f9c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f9d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1f9e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1f9f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1fa00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1fa10 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1fa20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fa30 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1fa40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1fa50 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1fa60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1fa70 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1fa80 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1fa90 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1faa0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1fab0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
1fac0 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
1fad0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1fae0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1faf0 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
1fb00 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
1fb10 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
1fb20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1fb30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1fb40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1fb50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1fb60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fb70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1fb80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1fb90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1fba0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1fbb0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1fbc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fbd0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1fbe0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1fbf0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1fc00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fc10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1fc20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1fc30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
1fc40 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
1fc50 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
1fc60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1fc70 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
1fc80 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
1fc90 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1fca0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1fcb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fcc0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
1fcd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fce0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1fcf0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
1fd00 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1fd10 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
1fd20 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
1fd30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
1fd40 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
1fd50 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
1fd60 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
1fd70 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
1fd80 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
1fd90 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
1fda0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
1fdb0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
1fdc0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
1fdd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1fde0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
1fdf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fe00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fe10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fe20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1fe30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1fe40 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
1fe50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fe60 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
1fe70 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1fe80 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
1fe90 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
1fea0 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
1feb0 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
1fec0 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
1fed0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1fee0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1fef0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
1ff00 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
1ff10 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
1ff20 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
1ff30 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
1ff40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
1ff50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1ff70 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
1ff80 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1ff90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ffa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
1ffb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
1ffc0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ffd0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ffe0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
1fff0 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
20000 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
20010 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
20020 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
20030 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
20040 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
20050 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
20060 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
20070 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
20080 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
20090 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
200a0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
200b0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
200c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
200d0 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
200e0 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
200f0 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
20100 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
20110 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
20120 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
20130 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
20140 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
20150 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
20160 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
20170 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
20180 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
20190 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
201a0 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
201b0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
201c0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
201d0 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
201e0 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
201f0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
20200 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
20210 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
20220 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
20230 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
20240 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
20250 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
20260 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
20270 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
20280 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
20290 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
202a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
202b0 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
202c0 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
202d0 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
202e0 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
202f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
20300 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
20310 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
20320 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
20330 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
20340 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
20350 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
20360 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
20370 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
20380 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
20390 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
203a0 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
203b0 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
203c0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
203d0 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
203e0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
203f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
20400 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
20410 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
20420 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
20430 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
20440 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
20450 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
20460 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
20470 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
20480 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
20490 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
204a0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
204b0 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
204c0 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
204d0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
204e0 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
204f0 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
20500 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
20510 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
20520 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
20530 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
20540 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
20550 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
20560 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
20570 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
20580 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
20590 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
205a0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
205b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
205c0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
205d0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
205e0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
205f0 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
20600 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
20610 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
20620 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
20630 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
20640 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
20650 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
20660 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
20670 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
20680 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
20690 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
206a0 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
206b0 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
206c0 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
206d0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
206e0 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
206f0 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
20700 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
20710 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
20720 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
20730 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
20740 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
20750 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
20760 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
20770 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
20780 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
20790 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
207a0 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
207b0 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
207c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
207d0 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
207e0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
207f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20800 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
20810 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
20820 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
20830 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
20840 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
20850 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
20860 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
20870 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
20880 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
20890 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
208a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
208b0 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
208c0 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
208d0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
208e0 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
208f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
20900 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
20910 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
20920 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
20930 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
20940 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
20950 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
20960 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
20970 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
20980 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
20990 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
209a0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
209b0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
209c0 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
209d0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
209e0 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
209f0 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
20a00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
20a10 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
20a20 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
20a30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
20a40 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
20a50 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
20a60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
20a70 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
20a80 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
20a90 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
20aa0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
20ab0 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
20ac0 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
20ad0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
20ae0 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
20af0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
20b00 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
20b10 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
20b20 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
20b30 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
20b40 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
20b50 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
20b60 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
20b70 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
20b80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
20b90 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
20ba0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
20bb0 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
20bc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20bd0 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
20be0 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
20bf0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
20c00 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
20c10 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
20c20 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
20c30 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
20c40 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
20c50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
20c60 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
20c70 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
20c80 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
20c90 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
20ca0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
20cb0 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
20cc0 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
20cd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20ce0 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
20cf0 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
20d00 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
20d10 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
20d20 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
20d30 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
20d40 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
20d50 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
20d60 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
20d70 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
20d80 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
20d90 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
20da0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
20db0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
20dc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
20dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20de0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20df0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
20e00 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
20e10 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..