Hex Artifact Content

Artifact b9a7131d32aacdc53651baafb150a90a8ef8ead5:


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 20 41 50 44 55 20 52 65 6c 61 74 65 64 20  /* APDU Related 
4cc0: 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a  Functions */./*.
4cd0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
4ce0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
4cf0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
4d00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
4d10: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
4d20: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
4d30: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
4d40: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
4d50: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
4d60: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
4d70: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
4d80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
4d90: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
4da0: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
4db0: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
4dc0: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
4dd0: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
4de0: 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20  ata_len);. *. * 
4df0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
4e00: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
4e10: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
4e20: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
4e30: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
4e40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
4e50: 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20  lass. *         
4e60: 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 43 49  APDU Class (GSCI
4e70: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
4e80: 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  or GSCIS_CLASS_G
4e90: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20  LOBAL_PLATFORM. 
4ea0: 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c  *         usuall
4eb0: 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20  y), (CLA). *. * 
4ec0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4ed0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a  r instruction. *
4ee0: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 49 6e           APDU In
4ef0: 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a  struction (INS).
4f00: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
4f10: 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20  ed char p1. *   
4f20: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
4f30: 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20  eter 1 (P1). *. 
4f40: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
4f50: 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20  har p2. *       
4f60: 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72    APDU Parameter
4f70: 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20   2 (P2). *. *   
4f80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4f90: 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  lc. *         AP
4fa0: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e  DU Length of Con
4fb0: 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69  tent (Lc) -- thi
4fc0: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
4fd0: 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20  of "data". *    
4fe0: 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20       parameter. 
4ff0: 20 49 66 20 22 64 61 74 61 22 20 69 73 20 73 70   If "data" is sp
5000: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
5010: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
5020: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
5030: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20  be ignored.. *. 
5040: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
5050: 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20  har *data. *    
5060: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
5070: 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20  buffer to send. 
5080: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c   It should be "L
5090: 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20  c" bytes long.  
50a0: 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  If. *         sp
50b0: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
50c0: 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62   "Lc" will not b
50d0: 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73  e sent, and this
50e0: 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a   buffer will be.
50f0: 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72   *         ignor
5100: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
5110: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20  signed char le. 
5120: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c  *         APDU L
5130: 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74 61  ength of Expecta
5140: 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69  tion (Le) -- thi
5150: 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  s is the length 
5160: 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  of the. *       
5170: 20 20 65 78 70 65 63 74 65 64 20 72 65 70 6c 79    expected reply
5180: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
5190: 65 63 69 66 69 65 64 20 61 73 20 30 20 74 68 65  ecified as 0 the
51a0: 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a  n it will not. *
51b0: 20 20 20 20 20 20 20 20 20 62 65 20 73 65 6e 74           be sent
51c0: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  .. *. *     uint
51d0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20  16_t *respcode. 
51e0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
51f0: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
5200: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
5210: 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68  nse code.  If th
5220: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
5230: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
5240: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
5250: 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69   code will be di
5260: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20  scarded.. *. *  
5270: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
5280: 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20   *respdata. *   
5290: 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e        [OUT] Poin
52a0: 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f  ter to storage o
52b0: 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20  f APDU response 
52c0: 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 20 69  data.  If this i
52d0: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65  s. *         spe
52e0: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
52f0: 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74  the response dat
5300: 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72  a will be discar
5310: 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20  ded.  If. *     
5320: 20 20 20 20 74 68 65 20 22 72 65 73 70 64 61 74      the "respdat
5330: 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72  a_len" parameter
5340: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
5350: 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66   NULL, this buff
5360: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69  er. *         wi
5370: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
5380: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  d.. *. *     siz
5390: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
53a0: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e  n. *         [IN
53b0: 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69  , OUT] Pointer i
53c0: 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69  nitialing contai
53d0: 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ning the size of
53e0: 20 74 68 65 20 22 72 65 73 70 64 61 74 61 22 0a   the "respdata".
53f0: 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 66 65   *         buffe
5400: 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75 72  r.  Before retur
5410: 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65  ning, the pointe
5420: 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70  d to value is up
5430: 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20  dated to the. * 
5440: 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f          number o
5450: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
5460: 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 20  to the buffer.  
5470: 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63 69  If this is speci
5480: 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20  fied as. *      
5490: 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c     NULL, it will
54a0: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c   not be updated,
54b0: 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 22 20   and "respdata" 
54c0: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
54d0: 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20  causing. *      
54e0: 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20     the response 
54f0: 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 63 61  data to be disca
5500: 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55  rded.. *. * RETU
5510: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
5520: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5530: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
5540: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
5550: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5560: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
5570: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
5580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  This function wi
5590: 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68  ll connect to th
55a0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
55b0: 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20  on Manager via. 
55c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73  *     cackey_pcs
55d0: 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e  c_connect() if n
55e0: 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  eeded.. *. *    
55f0: 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74   It will connect
5600: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20   to the card in 
5610: 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61 63  the reader attac
5620: 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a  hed to the slot.
5630: 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65 64   *     specified
5640: 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e  .  It will recon
5650: 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64  nect to the card
5660: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5670: 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61  on. *     goes a
5680: 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  way.. *. */.stat
5690: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
56a0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
56b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
56c0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
56d0: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
56e0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
56f0: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
5700: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
5710: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
5720: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
5730: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
5740: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
5750: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
5760: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
5770: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
5780: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
5790: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
57a0: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
57b0: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
57c0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
57d0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
57e0: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
57f0: 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65  ;..DWORD xmit_le
5800: 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f  n, recv_len;..LO
5810: 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  NG scard_conn_re
5820: 74 2c 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  t, scard_xmit_re
5830: 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  t, scard_reconn_
5840: 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f  ret;..BYTE xmit_
5850: 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f  buf[1024], recv_
5860: 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20  buf[1024];..int 
5870: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
5880: 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72  , pcsc_getresp_r
5890: 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09  et;..int idx;...
58a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
58b0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
58c0: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
58d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
58e0: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
58f0: 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29 3b  ot specified.");
5900: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5910: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5920: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
5930: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
5940: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
5950: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
5960: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
5970: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
5980: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5990: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
59a0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
59b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
59c0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
59d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
59e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
59f0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
5a00: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
5a10: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
5a20: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
5a30: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
5a40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
5a50: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
5a60: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
5a70: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
5a80: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
5a90: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
5aa0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
5ab0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
5ac0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
5ad0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
5ae0: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
5af0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
5b00: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
5b10: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
5b20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5b30: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
5b40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
5b50: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
5b60: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
5b70: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
5b80: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
5b90: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
5ba0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
5bb0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
5bc0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
5bd0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
5be0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
5bf0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
5c00: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
5c10: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5c20: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 7d 0a  nnected = 1;..}.
5c30: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
5c40: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
5c50: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
5c60: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
5c70: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
5c80: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
5c90: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
5ca0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
5cb0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
5cc0: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
5cd0: 28 64 61 74 61 29 20 7b 0a 09 09 78 6d 69 74 5f  (data) {...xmit_
5ce0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
5cf0: 3d 20 6c 63 3b 0a 09 09 66 6f 72 20 28 69 64 78  = lc;...for (idx
5d00: 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20   = 0; idx < lc; 
5d10: 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74  idx++) {....xmit
5d20: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
5d30: 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09   = data[idx];...
5d40: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d  }..}...if (le !=
5d50: 20 30 78 30 30 29 20 7b 0a 09 09 78 6d 69 74 5f   0x00) {...xmit_
5d60: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
5d70: 3d 20 6c 65 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  = le;..}...CACKE
5d80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
5d90: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 22  ("Sending APDU:"
5da0: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
5db0: 5f 6c 65 6e 29 3b 0a 0a 09 72 65 63 76 5f 6c 65  _len);...recv_le
5dc0: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
5dd0: 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69  buf);..scard_xmi
5de0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
5df0: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
5e00: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49  _card, SCARD_PCI
5e10: 5f 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  _T0, xmit_buf, x
5e20: 6d 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50  mit_len, SCARD_P
5e30: 43 49 5f 54 31 2c 20 72 65 63 76 5f 62 75 66 2c  CI_T1, recv_buf,
5e40: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 69 66   &recv_len);..if
5e50: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
5e60: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
5e70: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
5e80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
5e90: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
5ea0: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
5eb0: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
5ec0: 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %lx)", CACKEY_DE
5ed0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
5ee0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
5ef0: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
5f00: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
5f10: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66  xmit_ret);....if
5f20: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
5f30: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45   == SCARD_W_RESE
5f40: 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43  T_CARD) {....CAC
5f50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5f60: 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64  ("Reset required
5f70: 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e  , please hold...
5f80: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65  ");.....scard_re
5f90: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
5fa0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
5fb0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
5fc0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
5fd0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
5fe0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
5ff0: 52 44 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  RD, &protocol);.
6000: 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
6010: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
6020: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6030: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6040: 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63  RINTF("Reset suc
6050: 63 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73  cessful, retrans
6060: 6d 69 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 73  mitting");.....s
6070: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
6080: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
6090: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
60a0: 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69  CARD_PCI_T0, xmi
60b0: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
60c0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 72   SCARD_PCI_T0, r
60d0: 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c  ecv_buf, &recv_l
60e0: 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63  en);......if (sc
60f0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
6100: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6110: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
6120: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
6130: 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20  ransmit failed, 
6140: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
6150: 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f  lure after disco
6160: 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72  nnecting the car
6170: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
6180: 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43   = %s/%li)", CAC
6190: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
61a0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
61b0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
61c0: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69  (long) scard_xmi
61d0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43  t_ret);.......SC
61e0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
61f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
6200: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29  CARD_RESET_CARD)
6210: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  ;......slot->pcs
6220: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6230: 20 3d 20 30 3b 0a 0a 09 09 09 09 09 72 65 74 75   = 0;.......retu
6240: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6250: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09 09 7d  _GENERIC);.....}
6260: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
6270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6280: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
6290: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
62a0: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
62b0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
62c0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
62d0: 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70  RD);.....slot->p
62e0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
62f0: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 43 41 43  ed = 0;......CAC
6300: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6310: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  ("Returning in f
6320: 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65  ailure");.....re
6330: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6340: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 09  _E_GENERIC);....
6350: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
6360: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6370: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
6380: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
6390: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
63a0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
63b0: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
63c0: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
63d0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
63e0: 3d 20 30 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  = 0;.....CACKEY_
63f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
6400: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6410: 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  re");....return(
6420: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6430: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  NERIC);...}..}..
6440: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6450: 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64  INTBUF("Returned
6460: 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62   Value:", recv_b
6470: 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  uf, recv_len);..
6480: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20  .if (recv_len < 
6490: 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61  2) {.../* Minima
64a0: 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74  l response lengt
64b0: 68 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65  h is 2 bytes, re
64c0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
64d0: 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  re */...CACKEY_D
64e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
64f0: 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c  ponse too small,
6500: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6510: 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20  ilure (recv_len 
6520: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  = %lu)", (unsign
6530: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
6540: 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  n);....return(CA
6550: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6560: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  RIC);..}.../* De
6570: 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63  termine result c
6580: 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63  ode */..major_rc
6590: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
65a0: 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f  _len - 2];..mino
65b0: 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b  r_rc = recv_buf[
65c0: 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09  recv_len - 1];..
65d0: 69 66 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a  if (respcode) {.
65e0: 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d  ..*respcode = (m
65f0: 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20  ajor_rc << 8) | 
6600: 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f  minor_rc;..}.../
6610: 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65  * Adjust message
6620: 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76   buffer */..recv
6630: 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20  _len -= 2;.../* 
6640: 41 64 64 20 62 79 74 65 73 20 74 6f 20 72 65 74  Add bytes to ret
6650: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d  urn value */..tm
6660: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
6670: 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74   0;..if (respdat
6680: 61 20 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65  a && respdata_le
6690: 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64  n) {...tmp_respd
66a0: 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64  ata_len = *respd
66b0: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65  ata_len;....byte
66c0: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73  s_to_copy = *res
66d0: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66  pdata_len;....if
66e0: 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74   (recv_len < byt
66f0: 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
6700: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
6710: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a   recv_len;...}..
6720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6730: 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25  RINTF("Copying %
6740: 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68 65 20  lu bytes to the 
6750: 62 75 66 66 65 72 22 2c 20 28 75 6e 73 69 67 6e  buffer", (unsign
6760: 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74  ed long) bytes_t
6770: 6f 5f 63 6f 70 79 29 3b 0a 0a 09 09 6d 65 6d 63  o_copy);....memc
6780: 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63  py(respdata, rec
6790: 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f  v_buf, bytes_to_
67a0: 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74  copy);...respdat
67b0: 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  a += bytes_to_co
67c0: 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61  py;....*respdata
67d0: 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f  _len = bytes_to_
67e0: 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70  copy;...tmp_resp
67f0: 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65  data_len -= byte
6800: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c  s_to_copy;..} el
6810: 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f  se {...if (recv_
6820: 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  len != 0) {....C
6830: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6840: 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61  TF("Throwing awa
6850: 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77  y %lu bytes, now
6860: 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d  here to put them
6870: 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  !", (unsigned lo
6880: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  ng) recv_len);..
6890: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f  .}..}...if (majo
68a0: 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a  r_rc == 0x61) {.
68b0: 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20  ../* We need to 
68c0: 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59  READ */...CACKEY
68d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
68e0: 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69  uffer read requi
68f0: 72 65 64 22 29 3b 0a 0a 09 09 70 63 73 63 5f 67  red");....pcsc_g
6900: 65 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63  etresp_ret = cac
6910: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
6920: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
6930: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
6940: 4e 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53  NSTR_GET_RESPONS
6950: 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  E, 0x00, 0x00, 0
6960: 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63  , NULL, minor_rc
6970: 2c 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70  , respcode, resp
6980: 64 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64  data, &tmp_respd
6990: 61 74 61 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28  ata_len);...if (
69a0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
69b0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
69c0: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
69d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
69e0: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c  Buffer read fail
69f0: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69  ed!  Returning i
6a00: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
6a10: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6a20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6a30: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64  ..}....if (respd
6a40: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72  ata_len) {....*r
6a50: 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74  espdata_len += t
6a60: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
6a70: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
6a80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
6a90: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
6aa0: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
6ab0: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
6ac0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6ad0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  _S_OK);..}...if 
6ae0: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
6af0: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
6b00: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
6b10: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
6b20: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
6b30: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
6b40: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
6b50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6b60: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
6b70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
6b80: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
6b90: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
6ba0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
6bb0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6bc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
6bd0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6be0: 0a 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20  . *     ssize_t 
6bf0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
6c00: 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  er(struct cackey
6c10: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
6c20: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
6c30: 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  er, size_t count
6c40: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6c50: 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69  t_or_v, size_t i
6c60: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a  nitial_offset);.
6c70: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
6c80: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
6c90: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
6ca0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
6cb0: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
6cc0: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
6cd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
6ce0: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
6cf0: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
6d00: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75  *     size_t cou
6d10: 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75  nt. *         Nu
6d20: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
6d30: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
6d40: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
6d50: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a  ned char t_or_v.
6d60: 20 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63   *         Selec
6d70: 74 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28  t the T-buffer (
6d80: 30 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20  01) or V-buffer 
6d90: 28 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f  (02) to read fro
6da0: 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73  m.  . *. *     s
6db0: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
6dc0: 66 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20  fset. *         
6dd0: 53 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73  Specify the offs
6de0: 65 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  et to begin the 
6df0: 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a  read from. *. *.
6e00: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6e10: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6e20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6e30: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6e40: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
6e50: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
6e60: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6e70: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
6e80: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
6e90: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
6ea0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
6eb0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
6ec0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
6ed0: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
6ee0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
6ef0: 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69  or_v, size_t ini
6f00: 74 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09  tial_offset) {..
6f10: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20  size_t offset = 
6f20: 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d  0, max_offset, m
6f30: 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ax_count;..unsig
6f40: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b  ned char cmd[2];
6f50: 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63  ..uint16_t respc
6f60: 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ode;..int send_r
6f70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
6f80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6f90: 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73  d.");...max_offs
6fa0: 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78  et = count;..max
6fb0: 5f 63 6f 75 6e 74 20 3d 20 32 35 32 3b 0a 0a 09  _count = 252;...
6fc0: 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20  if (t_or_v != 1 
6fd0: 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20  && t_or_v != 2) 
6fe0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6ff0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
7000: 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65   T or V paramete
7010: 72 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  r specified, ret
7020: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7030: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
7040: 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20  1);..}...cmd[0] 
7050: 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c  = t_or_v;...whil
7060: 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66  e (1) {...if (of
7070: 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73  fset >= max_offs
7080: 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
7090: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
70a0: 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  ffer too small, 
70b0: 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77  returning what w
70c0: 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09  e got...");.....
70d0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f  break;...}....co
70e0: 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74  unt = max_offset
70f0: 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20   - offset;...if 
7100: 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75  (count > max_cou
7110: 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d  nt) {....count =
7120: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a   max_count;...}.
7130: 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e  ...cmd[1] = coun
7140: 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d  t;....send_ret =
7150: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
7160: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
7170: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
7180: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
7190: 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28  _READ_BUFFER, ((
71a0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
71b0: 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26   offset) >> 8) &
71c0: 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f   0xff, (initial_
71d0: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
71e0: 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28   & 0xff, sizeof(
71f0: 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c  cmd), cmd, 0x00,
7200: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
7210: 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f  er + offset, &co
7220: 75 6e 74 29 3b 0a 09 09 69 66 20 28 73 65 6e 64  unt);...if (send
7230: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
7240: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69  CSC_S_OK) {....i
7250: 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
7260: 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20  x6A86) {.....if 
7270: 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29  (max_count == 1)
7280: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
7290: 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f  ...}......max_co
72a0: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20  unt = max_count 
72b0: 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  / 2;......contin
72c0: 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ue;....}.....CAC
72d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
72e0: 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  ("cackey_send_ap
72f0: 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74  du() failed, ret
7300: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7310: 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  e");.....return(
7320: 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73  -1);...}....offs
7330: 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09  et += count;....
7340: 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f  if (count < max_
7350: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
7360: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7370: 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63  "Short read -- c
7380: 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31  ount = %i, cmd[1
7390: 5d 20 3d 20 25 69 22 2c 20 63 6f 75 6e 74 2c 20  ] = %i", count, 
73a0: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
73b0: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ak;...}..}...CAC
73c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
73d0: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
73e0: 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75  uccess, read %lu
73f0: 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e   bytes", (unsign
7400: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
7410: 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65  ;...return(offse
7420: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
7430: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7440: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
7450: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
7460: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7470: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
7480: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
7490: 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  t aid_len);. *. 
74a0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
74b0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
74c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
74d0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
74e0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
74f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
7500: 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20  ed char *aid. * 
7510: 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63          Buffer c
7520: 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74  ontaining Applet
7530: 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a   ID to select. *
7540: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61  . *     size_t a
7550: 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  id_len. *       
7560: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
7570: 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28  s in the "aid" (
7580: 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d  Applet ID) param
7590: 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52  eter. *. * RETUR
75a0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
75b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
75c0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
75d0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
75e0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
75f0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
7600: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
7610: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
7620: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
7630: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
7640: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
7650: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
7660: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
7670: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20  size_t aid_len) 
7680: 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  {..int send_ret;
7690: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
76a0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
76b0: 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
76c0: 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65  G_PRINTBUF("Sele
76d0: 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20  cting applet:", 
76e0: 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a  aid, aid_len);..
76f0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
7700: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
7710: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
7720: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
7730: 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49  STR_SELECT, GSCI
7740: 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41  S_PARAM_SELECT_A
7750: 50 50 4c 45 54 2c 20 30 78 30 43 2c 20 61 69 64  PPLET, 0x0C, aid
7760: 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c  _len, aid, 0x00,
7770: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
7780: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
7790: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
77a0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
77b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
77c0: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61  Failed to open a
77d0: 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67  pplet, returning
77e0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
77f0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7800: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7810: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
7820: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
7830: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
7840: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
7850: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
7860: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
7870: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
7880: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7890: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75  select_file(stru
78a0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
78b0: 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65  slot, uint16_t e
78c0: 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  f);. *. * ARGUME
78d0: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
78e0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
78f0: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
7900: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
7910: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
7920: 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a    uint16_t ef. *
7930: 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74           Element
7940: 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63  al File to selec
7950: 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  t. *. * RETURN V
7960: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
7970: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
7980: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
7990: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
79a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
79b0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
79c0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
79d0: 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d   selects an Elem
79e0: 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29  entary File (EF)
79f0: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65   under the curre
7a00: 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a  ntly selected. *
7a10: 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46       Dedicated F
7a20: 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20  ile (DF). *. *  
7a30: 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69     Typically thi
7a40: 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  s is called afte
7a50: 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20  r selecting the 
7a60: 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28  correct Applet (
7a70: 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63  using. *     cac
7a80: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
7a90: 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a  t) for VM cards.
7aa0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
7ab0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7ac0: 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75  select_file(stru
7ad0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7ae0: 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65  slot, uint16_t e
7af0: 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  f) {..unsigned c
7b00: 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a  har fid_buf[2];.
7b10: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
7b20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7b30: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
7b40: 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65  .../* Open the e
7b50: 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a  lementary file *
7b60: 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20  /..fid_buf[0] = 
7b70: 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66  (ef >> 8) & 0xff
7b80: 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20  ;..fid_buf[1] = 
7b90: 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  ef & 0xff;...CAC
7ba0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7bb0: 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65  ("Selecting file
7bc0: 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67  : %04lx", (unsig
7bd0: 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a  ned long) ef);..
7be0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
7bf0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
7c00: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
7c10: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
7c20: 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32  STR_SELECT, 0x02
7c30: 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66  , 0x0C, sizeof(f
7c40: 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66  id_buf), fid_buf
7c50: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
7c60: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  LL, NULL);..if (
7c70: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
7c80: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7c90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7ca0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
7cb0: 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75   open file, retu
7cc0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7cd0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
7ce0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7cf0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
7d00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7d10: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c  Successfully sel
7d20: 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09  ected file");...
7d30: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7d40: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7d50: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7d60: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66     void cackey_f
7d70: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
7d80: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
7d90: 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *root);. *. * A
7da0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
7db0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
7dc0: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20  v_entity *root. 
7dd0: 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f  *         Root o
7de0: 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74  f the TLV list t
7df0: 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a  o start freeing.
7e00: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
7e10: 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  UE. *     None. 
7e20: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
7e30: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
7e40: 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69  frees the TLV li
7e50: 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75  nked listed retu
7e60: 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20  rned from. *    
7e70: 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c   "cackey_read_tl
7e80: 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  v". *. */.static
7e90: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
7ea0: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
7eb0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
7ec0: 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20  root) {..struct 
7ed0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
7ee0: 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a  y *curr, *next;.
7ef0: 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55  ..if (root == NU
7f00: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  LL) {...return;.
7f10: 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d  .}...for (curr =
7f20: 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72   root; curr; cur
7f30: 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65  r = next) {...ne
7f40: 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74  xt = curr->_next
7f50: 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72  ;....switch (cur
7f60: 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73  r->tag) {....cas
7f70: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
7f80: 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47  TABLE:....case G
7f90: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
7fa0: 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75  CATE:.....if (cu
7fb0: 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09  rr->value) {....
7fc0: 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c  ..free(curr->val
7fd0: 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62  ue);.....}.....b
7fe0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
7ff0: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a  CIS_TAG_CARDURL:
8000: 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76  .....if (curr->v
8010: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a  alue_cardurl) {.
8020: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
8030: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a  value_cardurl);.
8040: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
8050: 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72  ...}....free(cur
8060: 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  r);..}...return;
8070: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
8080: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
8090: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
80a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
80b0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
80c0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
80d0: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
80e0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
80f0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
8100: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
8110: 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  d_tlv(struct cac
8120: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
8130: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
8140: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
8150: 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20  r_entity, *root 
8160: 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20  = NULL, *last = 
8170: 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  NULL;..unsigned 
8180: 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d  char tlen_buf[2]
8190: 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d  , tval_buf[1024]
81a0: 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e  , *tval;..unsign
81b0: 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66  ed char vlen_buf
81c0: 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31  [2], vval_buf[81
81d0: 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73  92], *vval;..uns
81e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62  igned char *tmpb
81f0: 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65  uf;..ssize_t tle
8200: 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  n, vlen;..ssize_
8210: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
8220: 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30  e_t offset_t = 0
8230: 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a  , offset_v = 0;.
8240: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
8250: 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67  ag;..size_t leng
8260: 74 68 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  th;...CACKEY_DEB
8270: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8280: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
8290: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
82a0: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
82b0: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
82c0: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
82d0: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
82e0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
82f0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
8300: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8310: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
8320: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8330: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
8340: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
8350: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
8360: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
8370: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
8380: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
8390: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
83a0: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
83b0: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
83c0: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
83d0: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
83e0: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
83f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8400: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
8410: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
8420: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
8430: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
8440: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
8450: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
8460: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
8470: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
8480: 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61   Length = %i, Va
8490: 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22  lue Length = %i"
84a0: 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a  , tlen, vlen);..
84b0: 09 74 6c 65 6e 20 2d 3d 20 32 3b 0a 09 6f 66 66  .tlen -= 2;..off
84c0: 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 0a 09 76 6c  set_t += 2;...vl
84d0: 65 6e 20 2d 3d 20 32 3b 0a 09 6f 66 66 73 65 74  en -= 2;..offset
84e0: 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74  _v += 2;...if (t
84f0: 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61  len > sizeof(tva
8500: 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  l_buf)) {...CACK
8510: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8520: 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74  "Tag length is t
8530: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
8540: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8550: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
8560: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e  );..}...if (vlen
8570: 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62   > sizeof(vval_b
8580: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
8590: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61  DEBUG_PRINTF("Va
85a0: 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  lue length is to
85b0: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
85c0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
85d0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
85e0: 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20  ;..}...read_ret 
85f0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
8600: 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f  ffer(slot, tval_
8610: 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66  buf, tlen, 1, of
8620: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
8630: 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20  ad_ret != tlen) 
8640: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8650: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
8660: 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54  to read entire T
8670: 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69  -buffer, returni
8680: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8690: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
86a0: 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20  ;..}...read_ret 
86b0: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
86c0: 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f  ffer(slot, vval_
86d0: 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66  buf, vlen, 2, of
86e0: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
86f0: 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20  ad_ret != vlen) 
8700: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8710: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
8720: 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56  to read entire V
8730: 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69  -buffer, returni
8740: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8750: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
8760: 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76  ;..}...tval = tv
8770: 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20  al_buf;..vval = 
8780: 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65  vval_buf;..while
8790: 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c   (tlen > 0 && vl
87a0: 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20  en > 0) {...tag 
87b0: 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b  = *tval;...tval+
87c0: 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09  +;...tlen--;....
87d0: 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66  if (*tval == 0xf
87e0: 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d  f) {....length =
87f0: 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20   (tval[2] << 8) 
8800: 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76  | tval[1];....tv
8810: 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e  al += 3;....tlen
8820: 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20   -= 3;...} else 
8830: 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74  {....length = *t
8840: 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a  val;....tval++;.
8850: 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a  ...tlen--;...}..
8860: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8870: 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28  RINTF("Tag: %s (
8880: 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
8890: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
88a0: 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69  _STR(tag), (unsi
88b0: 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a  gned int) tag);.
88c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
88d0: 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22  RINTBUF("Value:"
88e0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
88f0: 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74  ...vval += lengt
8900: 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e  h;...vlen -= len
8910: 67 74 68 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74  gth;....curr_ent
8920: 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77  ity = NULL;...sw
8930: 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09  itch (tag) {....
8940: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
8950: 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72  ARDURL:.....curr
8960: 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  _entity = malloc
8970: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
8980: 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72  tity));.....curr
8990: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
89a0: 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28  ardurl = malloc(
89b0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
89c0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
89d0: 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  rl));......memcp
89e0: 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  y(curr_entity->v
89f0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
8a00: 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09  d, vval, 5);....
8a10: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
8a20: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
8a30: 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a  type = vval[5];.
8a40: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
8a50: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
8a60: 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c  objectid = (vval
8a70: 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [6] << 8) | vval
8a80: 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [7];.....curr_en
8a90: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
8aa0: 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76  url->appid = (vv
8ab0: 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76  al[8] << 8) | vv
8ac0: 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72  al[9];......curr
8ad0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
8ae0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
8af0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
8b00: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
8b10: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
8b20: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09  _ACR_TABLE:.....
8b30: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
8b40: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
8b50: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
8b60: 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  tmpbuf = malloc(
8b70: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65  length);......me
8b80: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
8b90: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  l, length);.....
8ba0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
8bb0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
8bc0: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
8bd0: 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63   = length;.....c
8be0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
8bf0: 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
8c00: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
8c10: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
8c20: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
8c30: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
8c40: 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  CATE:.....curr_e
8c50: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
8c60: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
8c70: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
8c80: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
8c90: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
8ca0: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
8cb0: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
8cc0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
8cd0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
8ce0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
8cf0: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
8d00: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
8d10: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
8d20: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
8d30: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
8d40: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
8d50: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
8d60: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
8d70: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
8d80: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
8d90: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
8da0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
8db0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
8dc0: 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
8dd0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
8de0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
8df0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
8e00: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
8e10: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
8e20: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
8e30: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
8e40: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
8e50: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
8e60: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
8e70: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
8e80: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
8e90: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
8ea0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
8eb0: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
8ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
8ed0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
8ee0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
8ef0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
8f00: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
8f10: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
8f20: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
8f30: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
8f40: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
8f50: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
8f60: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
8f70: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
8f80: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
8f90: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
8fa0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
8fb0: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
8fc0: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
8fd0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
8fe0: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
8ff0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
9000: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
9010: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
9020: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
9030: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
9040: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
9050: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
9060: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
9070: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
9080: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
9090: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
90a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
90b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
90c0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
90d0: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
90e0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
90f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
9100: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
9110: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
9120: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
9130: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
9140: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
9150: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
9160: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
9170: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
9180: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
9190: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
91a0: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
91b0: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
91c0: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
91d0: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
91e0: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
91f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
9200: 74 69 64 78 20 3d 20 30 3b 0a 09 69 6e 74 20 63  tidx = 0;..int c
9210: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a  erts_resizable;.
9220: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73  .int send_ret, s
9230: 65 6c 65 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43  elect_ret;...CAC
9240: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9250: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
9260: 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  f (count == NULL
9270: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9280: 55 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74  UG_PRINTF("count
9290: 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e   is NULL, return
92a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
92b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
92c0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 63 6f 75  );..}...if (*cou
92d0: 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 69 66 20  nt == 0) {...if 
92e0: 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20  (certs != NULL) 
92f0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
9300: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
9310: 74 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 20  ted we return 0 
9320: 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63  objects, short-c
9330: 69 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65  ircuit");.....re
9340: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d  turn(certs);...}
9350: 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20  ..}...if (certs 
9360: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72  == NULL) {...cer
9370: 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
9380: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b  of(*certs) * 5);
9390: 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09  ...*count = 5;..
93a0: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
93b0: 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
93c0: 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  ..certs_resizabl
93d0: 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  e = 0;..}.../* S
93e0: 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70  elect the CCC Ap
93f0: 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  plet */..send_re
9400: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
9410: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
9420: 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  cc_aid, sizeof(c
9430: 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73  cc_aid));..if (s
9440: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
9450: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
9460: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9470: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
9480: 73 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65  select CCC Apple
9490: 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  t, returning in 
94a0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
94b0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
94c0: 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65  ./* Read all the
94d0: 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68   applets from th
94e0: 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09  e CCC's TLV */..
94f0: 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
9500: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
9510: 0a 0a 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43  .../* Look for C
9520: 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f  ARDURLs that coo
9530: 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61  respond to PKI a
9540: 70 70 6c 65 74 73 20 2a 2f 0a 09 66 6f 72 20 28  pplets */..for (
9550: 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74  ccc_curr = ccc_t
9560: 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63  lv; ccc_curr; cc
9570: 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72  c_curr = ccc_cur
9580: 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 43 41  r->_next) {...CA
9590: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
95a0: 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
95b0: 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44   ... ", CACKEY_D
95c0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
95d0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74  _STR(ccc_curr->t
95e0: 61 67 29 29 3b 0a 0a 09 09 69 66 20 28 63 63 63  ag));....if (ccc
95f0: 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
9600: 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
9610: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
9620: 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
9630: 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
9640: 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
9650: 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09   CARDURLs)");...
9660: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
9670: 0a 09 09 69 66 20 28 28 63 63 63 5f 63 75 72 72  ...if ((ccc_curr
9680: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
9690: 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b 45  >apptype & CACKE
96a0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 21  Y_TLV_APP_PKI) !
96b0: 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  = CACKEY_TLV_APP
96c0: 5f 50 4b 49 29 20 7b 0a 09 09 09 43 41 43 4b 45  _PKI) {....CACKE
96d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
96e0: 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
96f0: 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
9700: 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c 65 74  about PKI applet
9710: 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74 20 73  s, this applet s
9720: 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30 32 78  upports: %s/%02x
9730: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
9740: 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f  _FUNC_APPTYPE_TO
9750: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
9760: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
9770: 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65  ptype), (unsigne
9780: 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72 72 2d  d int) ccc_curr-
9790: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
97a0: 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09 63 6f  apptype);.....co
97b0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 43  ntinue;...}....C
97c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
97d0: 54 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63  TBUF("RID:", ccc
97e0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
97f0: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
9800: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
9810: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
9820: 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9830: 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d  _PRINTF("AppID =
9840: 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
9850: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
9860: 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
9870: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
9880: 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73  rl->appid), (uns
9890: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
98a0: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
98b0: 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 43  url->appid);...C
98c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
98d0: 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25  TF("ObjectID = %
98e0: 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
98f0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
9900: 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
9910: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
9920: 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e  ->objectid), (un
9930: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63  signed long) ccc
9940: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
9950: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
9960: 0a 0a 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
9970: 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  aid, ccc_curr->v
9980: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
9990: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
99a0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
99b0: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 63 75 72 72  l->rid));...curr
99c0: 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
99d0: 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
99e0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
99f0: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
9a00: 38 29 20 26 20 30 78 66 66 3b 0a 09 09 63 75 72  8) & 0xff;...cur
9a10: 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
9a20: 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63  r_aid) - 1] = cc
9a30: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
9a40: 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30  rdurl->appid & 0
9a50: 78 66 66 3b 0a 0a 09 09 2f 2a 20 53 65 6c 65 63  xff;..../* Selec
9a60: 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e  t found applet .
9a70: 2e 2e 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72  .. */...select_r
9a80: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
9a90: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
9aa0: 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66  curr_aid, sizeof
9ab0: 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 69  (curr_aid));...i
9ac0: 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
9ad0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
9ae0: 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
9af0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
9b00: 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70  led to select ap
9b10: 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70  plet, skipping p
9b20: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
9b30: 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
9b40: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
9b50: 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65  ./* ... and obje
9b60: 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09 73  ct (file) */...s
9b70: 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  elect_ret = cack
9b80: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
9b90: 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  lot, ccc_curr->v
9ba0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
9bb0: 6a 65 63 74 69 64 29 3b 0a 09 09 69 66 20 28 73  jectid);...if (s
9bc0: 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  elect_ret != CAC
9bd0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
9be0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9bf0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
9c00: 74 6f 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20  to select file, 
9c10: 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73  skipping process
9c20: 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  ing of this obje
9c30: 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  ct");.....contin
9c40: 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 50 72  ue;...}..../* Pr
9c50: 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27  ocess this file'
9c60: 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f  s TLV looking fo
9c70: 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a  r certificates *
9c80: 2f 0a 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61  /...app_tlv = ca
9c90: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
9ca0: 6f 74 29 3b 0a 0a 09 09 66 6f 72 20 28 61 70 70  ot);....for (app
9cb0: 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b  _curr = app_tlv;
9cc0: 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63   app_curr; app_c
9cd0: 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  urr = app_curr->
9ce0: 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b  _next) {....CACK
9cf0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9d00: 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c  "Found tag: %s",
9d10: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
9d20: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70  NC_TAG_TO_STR(ap
9d30: 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09  p_curr->tag));..
9d40: 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e  ..if (app_curr->
9d50: 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47  tag != GSCIS_TAG
9d60: 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
9d70: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9d80: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
9d90: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
9da0: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
9db0: 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
9dc0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
9dd0: 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20  ..}.....curr_id 
9de0: 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
9df0: 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  ;....outidx++;..
9e00: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
9e10: 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f  d->applet, curr_
9e20: 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
9e30: 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 09  _id->applet));..
9e40: 09 09 63 75 72 72 5f 69 64 2d 3e 66 69 6c 65 20  ..curr_id->file 
9e50: 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
9e60: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
9e70: 74 69 64 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  tid;....curr_id-
9e80: 3e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  >label = NULL;..
9e90: 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
9ea0: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
9eb0: 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
9ec0: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
9ed0: 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
9ee0: 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  c(curr_id->certi
9ef0: 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
9f00: 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
9f10: 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 70  certificate, app
9f20: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75  _curr->value, cu
9f30: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
9f40: 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  te_len);.....if 
9f50: 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e  (outidx >= *coun
9f60: 74 29 20 7b 0a 09 09 09 09 69 66 20 28 63 65 72  t) {.....if (cer
9f70: 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
9f80: 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32  .....*count *= 2
9f90: 3b 0a 09 09 09 09 09 63 65 72 74 73 20 3d 20 72  ;......certs = r
9fa0: 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69  ealloc(certs, si
9fb0: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28  zeof(*certs) * (
9fc0: 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 7d 20  *count));.....} 
9fd0: 65 6c 73 65 20 7b 0a 09 09 09 09 09 62 72 65 61  else {......brea
9fe0: 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  k;.....}....}...
9ff0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65  }....cackey_free
a000: 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a  _tlv(app_tlv);..
a010: 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
a020: 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 62 72 65  *count) {....bre
a030: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  ak;...}..}...cac
a040: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63 63  key_free_tlv(ccc
a050: 5f 74 6c 76 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20  _tlv);...*count 
a060: 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
a070: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
a080: 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61   {...certs = rea
a090: 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
a0a0: 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
a0b0: 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 72 65 74  ount));..}...ret
a0c0: 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f  urn(certs);.}../
a0d0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
a0e0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
a0f0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
a100: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
a110: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
a120: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
a130: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
a140: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
a150: 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
a160: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
a170: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
a180: 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
a190: 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
a1a0: 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
a1b0: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75  emaining_p) {..u
a1c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63  nsigned char cac
a1d0: 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c  _pin[8] = {0xFF,
a1e0: 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
a1f0: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
a200: 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e  xFF, 0xFF};..uin
a210: 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63  t16_t response_c
a220: 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  ode;..int tries_
a230: 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
a240: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 49  send_ret;.../* I
a250: 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
a260: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75  do not know abou
a270: 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73  t how many tries
a280: 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a   are remaining *
a290: 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  /..if (tries_rem
a2a0: 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74  aining_p) {...*t
a2b0: 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
a2c0: 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41   = -1;..}.../* A
a2d0: 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
a2e0: 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
a2f0: 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
a300: 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
a310: 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
a320: 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
a330: 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
a340: 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
a350: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
a360: 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
a370: 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
a380: 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72  /* Issue PIN Ver
a390: 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ify */..send_ret
a3a0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
a3b0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
a3c0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
a3d0: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
a3e0: 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 73  Y, 0x00, 0x00, s
a3f0: 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20  izeof(cac_pin), 
a400: 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26  cac_pin, 0x00, &
a410: 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e  response_code, N
a420: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
a430: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
a440: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
a450: 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65  ...if ((response
a460: 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20  _code & 0x63C0) 
a470: 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09  == 0x63C0) {....
a480: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
a490: 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  = (response_code
a4a0: 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43   & 0xF);.....CAC
a4b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a4c0: 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
a4d0: 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72  on failed, %i tr
a4e0: 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20  ies remaining", 
a4f0: 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
a500: 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
a510: 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
a520: 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
a530: 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65  ing_p = tries_re
a540: 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09  maining;....}...
a550: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a560: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
a570: 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f  ..}....if (respo
a580: 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39  nse_code == 0x69
a590: 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  83) {....CACKEY_
a5a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
a5b0: 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
a5c0: 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73  ailed, device is
a5d0: 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72   locked");.....r
a5e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a5f0: 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  C_E_LOCKED);...}
a600: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a610: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a620: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
a630: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
a640: 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   Verification su
a650: 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74  cceeded");...ret
a660: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a670: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
a680: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
a690: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
a6a0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
a6b0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
a6c0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
a6d0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
a6e0: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
a6f0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
a700: 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
a710: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
a720: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 75  slot *slot) {..u
a730: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63  nsigned char ccc
a740: 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f  _aid[] = {GSCIS_
a750: 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74 20 73  AID_CCC};..int s
a760: 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20 53 65  end_ret;.../* Se
a770: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
a780: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
a790: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
a7a0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
a7b0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
a7c0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
a7d0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
a7e0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
a7f0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a800: 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_S_TOKENABSENT
a810: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
a820: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
a830: 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f  ENPRESENT);.}../
a840: 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
a850: 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
a860: 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
a870: 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a  x_create(void **
a880: 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
a890: 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
a8a0: 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
a8b0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
a8c0: 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
a8d0: 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
a8e0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
a8f0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
a900: 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
a910: 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
a920: 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
a930: 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
a940: 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
a950: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74  alloc(sizeof(*pt
a960: 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09  hread_mutex));..
a970: 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75  .if (!pthread_mu
a980: 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  tex) {....CACKEY
a990: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
a9a0: 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
a9b0: 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09  e memory.");....
a9c0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
a9d0: 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
a9e0: 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
a9f0: 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f  ex_init(pthread_
aa00: 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
aa10: 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
aa20: 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
aa30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
aa40: 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
aa50: 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64  _init() returned
aa60: 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
aa70: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
aa80: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
aa90: 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20  ..}....*mutex = 
aaa0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
aab0: 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
aac0: 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
aad0: 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  eMutex) {....cus
aae0: 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
aaf0: 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
ab00: 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
ab10: 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
ab20: 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
ab30: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ab40: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
ab50: 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
ab60: 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
ab70: 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
ab80: 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
ab90: 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
aba0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
abb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
abc0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
abd0: 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
abe0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
abf0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
ac00: 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
ac10: 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
ac20: 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20  mutex_lock(void 
ac30: 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
ac40: 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
ac50: 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
ac60: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
ac70: 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
ac80: 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
ac90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
aca0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
acb0: 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
acc0: 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
acd0: 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
ace0: 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
acf0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
ad00: 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
ad10: 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
ad20: 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74  ad_mutex_lock(pt
ad30: 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09  hread_mutex);...
ad40: 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
ad50: 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
ad60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ad70: 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
ad80: 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  _lock() returned
ad90: 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
ada0: 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
adb0: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
adc0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
add0: 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
ade0: 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  LockMutex) {....
adf0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
ae00: 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
ae10: 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
ae20: 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
ae30: 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
ae40: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ae50: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
ae60: 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
ae70: 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
ae80: 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
ae90: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
aea0: 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
aeb0: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
aec0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
aed0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
aee0: 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
aef0: 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
af00: 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
af10: 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
af20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
af30: 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64  utex_unlock(void
af40: 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
af50: 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
af60: 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
af70: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
af80: 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
af90: 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
afa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
afb0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
afc0: 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
afd0: 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
afe0: 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
aff0: 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
b000: 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
b010: 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
b020: 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
b030: 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
b040: 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
b050: 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
b060: 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
b070: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b080: 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
b090: 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74  tex_unlock() ret
b0a0: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
b0b0: 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
b0c0: 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
b0d0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
b0e0: 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
b0f0: 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
b100: 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
b110: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
b120: 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d  gs.UnlockMutex(m
b130: 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
b140: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
b150: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
b160: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b170: 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  F("cackey_args.U
b180: 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  nlockMutex() ret
b190: 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
b1a0: 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
b1b0: 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
b1c0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
b1d0: 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
b1e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b1f0: 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
b200: 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
b210: 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
b220: 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45  tic CK_ATTRIBUTE
b230: 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f  _PTR cackey_get_
b240: 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42  attributes(CK_OB
b250: 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
b260: 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63  tclass, struct c
b270: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
b280: 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
b290: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
b2a0: 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c  ntity_num, CK_UL
b2b0: 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
b2c0: 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
b2d0: 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31  BOOL ck_true = 1
b2e0: 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  ;..static CK_BBO
b2f0: 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b  OL ck_false = 0;
b300: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
b310: 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
b320: 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
b330: 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
b340: 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
b350: 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
b360: 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
b370: 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
b380: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
b390: 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
b3a0: 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
b3b0: 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
b3c0: 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
b3d0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
b3e0: 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
b3f0: 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
b400: 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
b410: 75 66 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67  uf[1024];..unsig
b420: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
b430: 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
b440: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
b450: 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
b460: 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
b470: 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
b480: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
b490: 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
b4a0: 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
b4b0: 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
b4c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b4d0: 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
b4e0: 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66  ntity_num);...if
b4f0: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
b500: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
b510: 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
b520: 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
b530: 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
b540: 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
b550: 4b 45 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KEY) {...CACKEY_
b560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
b570: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
b580: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
b590: 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29  d object class")
b5a0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
b5b0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43  );..}.../* Get C
b5c0: 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ert */..if (iden
b5d0: 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
b5e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b5f0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
b600: 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
b610: 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74  ), invalid ident
b620: 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a  iy provided");..
b630: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
b640: 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  .}...certificate
b650: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
b660: 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
b670: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
b680: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
b690: 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
b6a0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d  rtificate_len ==
b6b0: 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61   -1 || certifica
b6c0: 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
b6d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b6e0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
b6f0: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
b700: 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64   this identity d
b710: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
b720: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
b730: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
b740: 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f  h it and will no
b750: 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74  t work");....ret
b760: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
b770: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63  /* Verify that c
b780: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53  ertificate is AS
b790: 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30  N.1 encoded X.50
b7a0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  9 certificate */
b7b0: 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65  ..if (x509_to_se
b7c0: 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
b7d0: 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
b7e0: 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a  n, NULL) < 0) {.
b7f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b800: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
b810: 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
b820: 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72  ), the X.509 cer
b830: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
b840: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64  ted with this id
b850: 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61  entity is not va
b860: 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lid");....return
b870: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74  (NULL);..}...ret
b880: 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a  val_count = 16;.
b890: 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
b8a0: 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20  (retval_count * 
b8b0: 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
b8c0: 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ;...for (curr_at
b8d0: 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72  tr_type = 0; cur
b8e0: 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78  r_attr_type < 0x
b8f0: 63 65 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61  ce53635f; curr_a
b900: 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  ttr_type++) {...
b910: 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  if (curr_attr_ty
b920: 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09  pe == 0x800) {..
b930: 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ..curr_attr_type
b940: 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09   = 0xce536300;..
b950: 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65  .}....pValue_fre
b960: 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20  e = 0;...pValue 
b970: 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
b980: 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
b990: 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28   -1;....switch (
b9a0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20  curr_attr_type) 
b9b0: 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c  {....case CKA_CL
b9c0: 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASS:.....CACKEY_
b9d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
b9e0: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
b9f0: 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78  te CKA_CLASS (0x
ba00: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
ba10: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
ba20: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
ba30: 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  ...ck_object_cla
ba40: 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73  ss = objectclass
ba50: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
ba60: 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  &ck_object_class
ba70: 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
ba80: 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a   = sizeof(ck_obj
ba90: 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09  ect_class);.....
baa0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bab0: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
bac0: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
bad0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
bae0: 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54  ng) *((CK_OBJECT
baf0: 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65  _CLASS *) pValue
bb00: 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
bb10: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
bb20: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
bb30: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
bb40: 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45  TOKEN:.....CACKE
bb50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bb60: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
bb70: 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28  bute CKA_TOKEN (
bb80: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
bb90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
bba0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
bbb0: 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
bbc0: 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
bbd0: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
bbe0: 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
bbf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
bc00: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
bc10: 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
bc20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
bc30: 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
bc40: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
bc50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
bc60: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
bc70: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
bc80: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
bc90: 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
bca0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
bcb0: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
bcc0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20   CKA_MODIFIABLE 
bcd0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
bce0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
bcf0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
bd00: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
bd10: 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
bd20: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
bd30: 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
bd40: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bd50: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
bd60: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
bd70: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
bd80: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
bd90: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
bda0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
bdb0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
bdc0: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
bdd0: 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
bde0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
bdf0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
be00: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
be10: 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c  KA_LABEL (0x%08l
be20: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
be30: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
be40: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f  tr_type);....../
be50: 2a 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65  * Determine name
be60: 20 2a 2f 0a 09 09 09 09 69 66 20 28 63 65 72 74   */.....if (cert
be70: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
be80: 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
be90: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
bea0: 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
beb0: 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
bec0: 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
bed0: 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
bee0: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
bef0: 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
bf00: 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
bf10: 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
bf20: 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
bf30: 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
bf40: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
bf50: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
bf60: 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
bf70: 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
bf80: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
bf90: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
bfa0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
bfb0: 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43  A_VALUE:.....CAC
bfc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bfd0: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
bfe0: 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45  ribute CKA_VALUE
bff0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
c000: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c010: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
c020: 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f  ;......switch (o
c030: 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09  bjectclass) {...
c040: 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56  ...case CKO_PRIV
c050: 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43  ATE_KEY:.......C
c060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c070: 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
c080: 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
c090: 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69  use we are a pri
c0a0: 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  vate key.");....
c0b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
c0c0: 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  case CKO_PUBLIC_
c0d0: 4b 45 59 3a 0a 09 09 09 09 09 09 2f 2a 20 58 58  KEY:......./* XX
c0e0: 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a 09 09 09 09  X: TODO */......
c0f0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
c100: 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  se CKO_CERTIFICA
c110: 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65  TE:.......pValue
c120: 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a   = certificate;.
c130: 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
c140: 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c   = certificate_l
c150: 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  en;........break
c160: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
c170: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c180: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
c190: 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
c1a0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c1b0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
c1c0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
c1d0: 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09  se CKA_ISSUER:..
c1e0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c1f0: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
c200: 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
c210: 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78  _ISSUER (0x%08lx
c220: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
c230: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
c240: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
c250: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
c260: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
c270: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
c280: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
c290: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
c2a0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
c2b0: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
c2c0: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
c2d0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
c2e0: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
c2f0: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
c300: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
c310: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75  t = x509_to_issu
c320: 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  er(certificate, 
c330: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
c340: 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
c350: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
c360: 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
c370: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
c380: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
c390: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
c3a0: 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
c3b0: 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
c3c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c3d0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
c3e0: 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
c3f0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
c400: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
c410: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
c420: 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
c430: 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43  _NUMBER:.....CAC
c440: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c450: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
c460: 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41  ribute CKA_SERIA
c470: 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c  L_NUMBER (0x%08l
c480: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
c490: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
c4a0: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
c4b0: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
c4c0: 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
c4d0: 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
c4e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
c4f0: 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
c500: 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
c510: 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
c520: 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
c530: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
c540: 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
c550: 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
c560: 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
c570: 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72  et = x509_to_ser
c580: 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
c590: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
c5a0: 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
c5b0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
c5c0: 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
c5d0: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
c5e0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
c5f0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
c600: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
c610: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
c620: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c630: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
c640: 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
c650: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
c660: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
c670: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
c680: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ....case CKA_SUB
c690: 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  JECT:.....CACKEY
c6a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
c6b0: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
c6c0: 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20  ute CKA_SUBJECT 
c6d0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
c6e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c6f0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
c700: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
c710: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
c720: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
c730: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c740: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
c750: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
c760: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
c770: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
c780: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
c790: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
c7a0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
c7b0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
c7c0: 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
c7d0: 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
c7e0: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
c7f0: 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
c800: 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
c810: 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
c820: 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
c830: 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
c840: 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
c850: 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
c860: 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
c870: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
c880: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
c890: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
c8a0: 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
c8b0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
c8c0: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
c8d0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
c8e0: 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45  KA_ID:.....CACKE
c8f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c900: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
c910: 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25  bute CKA_ID (0x%
c920: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
c930: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
c940: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
c950: 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20  ..ucTmpBuf[0] = 
c960: 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b  ((identity_num +
c970: 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66   1) >> 8) & 0xff
c980: 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31  ;.....ucTmpBuf[1
c990: 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e  ] =  (identity_n
c9a0: 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a  um + 1) & 0xff;.
c9b0: 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75  .....pValue = &u
c9c0: 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56  cTmpBuf;.....ulV
c9d0: 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09  alueLen = 2;....
c9e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c9f0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
ca00: 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
ca10: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
ca20: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
ca30: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
ca40: 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
ca50: 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09  IFICATE_TYPE:...
ca60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ca70: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
ca80: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
ca90: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
caa0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
cab0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cac0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
cad0: 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
cae0: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
caf0: 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
cb00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cb10: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
cb20: 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
cb30: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
cb40: 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
cb50: 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
cb60: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
cb70: 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
cb80: 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  ne certificate t
cb90: 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65  ype */.....ck_ce
cba0: 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d  rtificate_type =
cbb0: 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09   CKC_X_509;.....
cbc0: 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65  .pValue = &ck_ce
cbd0: 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
cbe0: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
cbf0: 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69   sizeof(ck_certi
cc00: 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09  ficate_type);...
cc10: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cc20: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
cc30: 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39  urning CKC_X_509
cc40: 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
cc50: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
cc60: 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
cc70: 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
cc80: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
cc90: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
cca0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
ccb0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
ccc0: 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09  A_KEY_TYPE:.....
ccd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
cce0: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
ccf0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45  attribute CKA_KE
cd00: 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  Y_TYPE (0x%08lx)
cd10: 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
cd20: 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
cd30: 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
cd40: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
cd50: 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
cd60: 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
cd70: 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
cd80: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
cd90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
cda0: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
cdb0: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
cdc0: 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22   are not a key."
cdd0: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
cde0: 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
cdf0: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
ce00: 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09  e key type */...
ce10: 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20  ..ck_key_type = 
ce20: 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56  CKK_RSA;......pV
ce30: 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74  alue = &ck_key_t
ce40: 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
ce50: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
ce60: 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  key_type);......
ce70: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ce80: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
ce90: 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75  ing CKK_RSA (%lu
cea0: 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
ceb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
cec0: 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
ced0: 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
cee0: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
cef0: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
cf00: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
cf10: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
cf20: 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
cf30: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
cf40: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
cf50: 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38   CKA_SIGN (0x%08
cf60: 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
cf70: 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
cf80: 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
cf90: 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
cfa0: 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
cfb0: 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
cfc0: 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
cfd0: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
cfe0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
cff0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
d000: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
d010: 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
d020: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
d030: 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
d040: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d050: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
d060: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
d070: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
d080: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
d090: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
d0a0: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
d0b0: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
d0c0: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
d0d0: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45  ;....case CKA_DE
d0e0: 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45  CRYPT:.....CACKE
d0f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d100: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
d110: 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54  bute CKA_DECRYPT
d120: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
d130: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d140: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
d150: 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
d160: 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
d170: 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a  IVATE_KEY || obj
d180: 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
d190: 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
d1a0: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
d1b0: 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
d1c0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
d1d0: 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
d1e0: 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
d1f0: 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
d200: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
d210: 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
d220: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
d230: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d240: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
d250: 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
d260: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d270: 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
d280: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
d290: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d2a0: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
d2b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
d2c0: 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56  e CKA_TRUST_SERV
d2d0: 45 52 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43  ER_AUTH:.....CAC
d2e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d2f0: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
d300: 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54  ribute CKA_TRUST
d310: 5f 53 45 52 56 45 52 5f 41 55 54 48 20 28 30 78  _SERVER_AUTH (0x
d320: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
d330: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
d340: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
d350: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
d360: 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
d370: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
d380: 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
d390: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d3a0: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
d3b0: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
d3c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d3d0: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
d3e0: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
d3f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d400: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
d410: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d420: 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e   CKA_TRUST_CLIEN
d430: 54 5f 41 55 54 48 3a 0a 09 09 09 09 43 41 43 4b  T_AUTH:.....CACK
d440: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d450: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
d460: 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
d470: 43 4c 49 45 4e 54 5f 41 55 54 48 20 28 30 78 25  CLIENT_AUTH (0x%
d480: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
d490: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
d4a0: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
d4b0: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
d4c0: 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
d4d0: 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
d4e0: 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
d4f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d500: 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
d510: 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
d520: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
d530: 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
d540: 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
d550: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
d560: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
d570: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
d580: 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53  CKA_TRUST_CODE_S
d590: 49 47 4e 49 4e 47 3a 0a 09 09 09 09 43 41 43 4b  IGNING:.....CACK
d5a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d5b0: 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
d5c0: 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
d5d0: 43 4f 44 45 5f 53 49 47 4e 49 4e 47 20 28 30 78  CODE_SIGNING (0x
d5e0: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
d5f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
d600: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
d610: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
d620: 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
d630: 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
d640: 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
d650: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d660: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
d670: 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
d680: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d690: 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
d6a0: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
d6b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d6c0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
d6d0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
d6e0: 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c   CKA_TRUST_EMAIL
d6f0: 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09  _PROTECTION:....
d700: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d710: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
d720: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
d730: 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45  RUST_EMAIL_PROTE
d740: 43 54 49 4f 4e 20 28 30 78 25 30 38 6c 78 29 20  CTION (0x%08lx) 
d750: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
d760: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
d770: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
d780: 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
d790: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
d7a0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
d7b0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
d7c0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
d7d0: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
d7e0: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
d7f0: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
d800: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
d810: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
d820: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
d830: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
d840: 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
d850: 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
d860: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
d870: 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
d880: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d890: 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29  ..if (((CK_LONG)
d8a0: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20   ulValueLen) != 
d8b0: 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20  ((CK_LONG) -1)) 
d8c0: 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72  {..../* Push cur
d8d0: 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20  r_attr onto the 
d8e0: 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72  stack */....curr
d8f0: 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72  _attr.type = cur
d900: 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09  r_attr_type;....
d910: 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
d920: 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
d930: 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  n;.....curr_attr
d940: 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
d950: 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  (curr_attr.ulVal
d960: 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70  ueLen);....memcp
d970: 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  y(curr_attr.pVal
d980: 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72  ue, pValue, curr
d990: 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
d9a0: 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75  );.....if (pValu
d9b0: 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65  e_free && pValue
d9c0: 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61  ) {.....free(pVa
d9d0: 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  lue);....}.....i
d9e0: 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72  f (numattrs >= r
d9f0: 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09  etval_count) {..
da00: 09 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
da10: 2a 3d 20 32 3b 0a 09 09 09 09 72 65 74 76 61 6c  *= 2;.....retval
da20: 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
da30: 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
da40: 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
da50: 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  ));....}.....mem
da60: 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61  cpy(&retval[numa
da70: 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74  ttrs], &curr_att
da80: 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  r, sizeof(curr_a
da90: 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74  ttr));....numatt
daa0: 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  rs++;...}..}...i
dab0: 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30  f (numattrs != 0
dac0: 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75  ) {...retval_cou
dad0: 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09  nt = numattrs;..
dae0: 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
daf0: 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
db00: 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
db10: 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c  *retval));..} el
db20: 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76  se {...free(retv
db30: 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d  al);....retval =
db40: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c   NULL;..}...*pul
db50: 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  Count = numattrs
db60: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
db70: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
db80: 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28  ng %lu objects (
db90: 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c  %p).", numattrs,
dba0: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
dbb0: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
dbc0: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
dbd0: 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69  N(CK_RV, C_Initi
dbe0: 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
dbf0: 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a  TR pInitArgs) {.
dc00: 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45  .CK_C_INITIALIZE
dc10: 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67  _ARGS CK_PTR arg
dc20: 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78  s;..uint32_t idx
dc30: 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
dc40: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
dc50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
dc60: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
dc70: 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c  InitArgs != NULL
dc80: 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e  ) {...args = pIn
dc90: 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79  itArgs;...memcpy
dca0: 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61  (&cackey_args, a
dcb0: 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b  rgs, sizeof(cack
dcc0: 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66  ey_args));....if
dcd0: 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
dce0: 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
dcf0: 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
dd00: 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
dd10: 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  s->LockMutex == 
dd20: 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
dd30: 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  lockMutex == NUL
dd40: 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73  L) {....if (args
dd50: 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d  ->CreateMutex !=
dd60: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44   NULL || args->D
dd70: 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e  estroyMutex != N
dd80: 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63  ULL || args->Loc
dd90: 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  kMutex != NULL |
dda0: 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75  | args->UnlockMu
ddb0: 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tex != NULL) {..
ddc0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ddd0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
dde0: 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c  ome, but not All
ddf0: 20 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69   threading primi
de00: 74 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22  tives provided."
de10: 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
de20: 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
de30: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
de40: 66 20 28 61 72 67 73 2d 3e 70 52 65 73 65 72 76  f (args->pReserv
de50: 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
de60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
de70: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
de80: 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
de90: 4c 4c 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  LL.");.....retur
dea0: 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
deb0: 42 41 44 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  BAD);...}..} els
dec0: 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  e {...cackey_arg
ded0: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20  s.CreateMutex = 
dee0: 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
def0: 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78  rgs.DestroyMutex
df00: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
df10: 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
df20: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
df30: 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
df40: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
df50: 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d  key_args.flags =
df60: 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
df70: 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
df80: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
df90: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
dfa0: 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61    Already initia
dfb0: 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
dfc0: 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
dfd0: 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c  _ALREADY_INITIAL
dfe0: 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
dff0: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
e000: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
e010: 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
e020: 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
e030: 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
e040: 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
e050: 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
e060: 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64   0;..}...for (id
e070: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
e080: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
e090: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
e0a0: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
e0b0: 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
e0c0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
e0d0: 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ve = 0;...cackey
e0e0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
e0f0: 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
e100: 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
e110: 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69  ialized = 1;...i
e120: 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f  f (!cackey_biglo
e130: 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74  ck_init) {...mut
e140: 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61  ex_init_ret = ca
e150: 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
e160: 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  e(&cackey_bigloc
e170: 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
e180: 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
e190: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
e1a0: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
e1b0: 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69    Mutex initiali
e1c0: 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29  zation failed.")
e1d0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
e1e0: 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d  _CANT_LOCK);...}
e1f0: 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ....cackey_biglo
e200: 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a  ck_init = 1;..}.
e210: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e220: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
e230: 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
e240: 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
e250: 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
e260: 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
e270: 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
e280: 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
e290: 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
e2a0: 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
e2b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e2c0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
e2d0: 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
e2e0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
e2f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
e300: 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
e310: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
e320: 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
e330: 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
e340: 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
e350: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
e360: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e370: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
e380: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
e390: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
e3a0: 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
e3b0: 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
e3c0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
e3d0: 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
e3e0: 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
e3f0: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
e400: 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
e410: 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
e420: 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
e430: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
e440: 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
e450: 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
e460: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
e470: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
e480: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
e490: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
e4a0: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
e4b0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
e4c0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
e4d0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
e4e0: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
e4f0: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
e500: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
e510: 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 09 7d 0a  reader);...}..}.
e520: 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
e530: 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
e540: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e550: 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
e560: 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
e570: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
e580: 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
e590: 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
e5a0: 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
e5b0: 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
e5c0: 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
e5d0: 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
e5e0: 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
e5f0: 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
e600: 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
e610: 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
e620: 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
e630: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e640: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
e650: 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
e660: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
e670: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e680: 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
e690: 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
e6a0: 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
e6b0: 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
e6c0: 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
e6d0: 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
e6e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
e6f0: 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
e700: 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
e710: 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
e720: 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
e730: 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
e740: 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
e750: 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
e760: 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
e770: 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
e780: 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
e790: 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
e7a0: 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
e7b0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
e7c0: 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
e7d0: 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
e7e0: 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
e7f0: 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
e800: 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
e810: 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
e820: 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
e830: 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
e840: 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
e850: 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
e860: 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
e870: 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
e880: 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
e890: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
e8a0: 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
e8b0: 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
e8c0: 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
e8d0: 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
e8e0: 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
e8f0: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
e900: 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
e910: 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
e920: 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
e930: 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
e940: 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
e950: 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
e960: 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
e970: 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
e980: 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
e990: 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
e9a0: 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
e9b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e9c0: 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
e9d0: 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
e9e0: 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
e9f0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
ea00: 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
ea10: 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
ea20: 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
ea30: 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
ea40: 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
ea50: 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
ea60: 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
ea70: 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
ea80: 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
ea90: 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
eaa0: 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
eab0: 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e   pulCount) {..in
eac0: 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
ead0: 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  .int pcsc_connec
eae0: 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  t_ret;..CK_ULONG
eaf0: 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75   count, slot_cou
eb00: 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74  nt = 0, currslot
eb10: 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
eb20: 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
eb30: 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
eb40: 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20  aders_e;..DWORD 
eb50: 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
eb60: 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69  ;..LONG scard_li
eb70: 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09  streaders_ret;..
eb80: 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64  size_t curr_read
eb90: 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  er_len;...CACKEY
eba0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
ebb0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
ebc0: 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
ebd0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ebe0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
ebf0: 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55  . pulCount is NU
ec00: 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
ec10: 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
ec20: 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
ec30: 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
ec40: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
ec50: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
ec60: 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
ec70: 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
ec80: 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
ec90: 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
eca0: 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
ecb0: 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
ecc0: 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
ecd0: 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
ece0: 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
ecf0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ed00: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
ed10: 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
ed20: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
ed30: 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
ed40: 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20  ;..}.../* Clear 
ed50: 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f  list of slots */
ed60: 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
ed70: 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64   {.../* Only upd
ed80: 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
ed90: 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
eda0: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73  actually being s
edb0: 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
edc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
edd0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
ede0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
edf0: 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
ee00: 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
ee10: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
ee20: 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
ee30: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
ee40: 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
ee50: 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
ee60: 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
ee70: 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
ee80: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
ee90: 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
eea0: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09  c_reader);......
eeb0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
eec0: 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
eed0: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a  er = NULL;....}.
eee0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
eef0: 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
ef00: 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  e = 0;...}..}...
ef10: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73  /* Determine lis
ef20: 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a  t of readers */.
ef30: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
ef40: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
ef50: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
ef60: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
ef70: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
ef80: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
ef90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
efa0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
efb0: 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
efc0: 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
efd0: 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
efe0: 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
eff0: 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
f000: 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
f010: 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
f020: 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
f030: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
f040: 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
f050: 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
f060: 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73 63 61 72  len);...if (scar
f070: 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
f080: 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
f090: 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
f0a0: 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
f0b0: 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
f0c0: 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
f0d0: 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
f0e0: 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
f0f0: 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
f100: 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
f110: 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
f120: 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
f130: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
f140: 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
f150: 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
f160: 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
f170: 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
f180: 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
f190: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
f1a0: 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
f1b0: 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
f1c0: 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
f1d0: 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  ;......currslot 
f1e0: 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 0;.....while (
f1f0: 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
f200: 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
f210: 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
f220: 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
f230: 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
f240: 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
f250: 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
f260: 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
f270: 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
f280: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
f290: 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
f2a0: 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
f2b0: 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
f2c0: 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
f2d0: 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
f2e0: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
f2f0: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
f300: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
f310: 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
f320: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
f330: 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
f340: 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
f350: 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
f360: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
f370: 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
f380: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
f390: 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70  d reader: %s", p
f3a0: 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
f3b0: 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
f3c0: 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
f3d0: 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
f3e0: 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75  ctually being su
f3f0: 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e  pply the slot in
f400: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09  formation */....
f410: 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
f420: 20 7b 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f   {.......cackey_
f430: 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
f440: 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
f450: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
f460: 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
f470: 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63  ader = strdup(pc
f480: 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09  sc_readers);....
f490: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
f4a0: 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63  currslot].pcsc_c
f4b0: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
f4c0: 30 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63  0;......}......c
f4d0: 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09  urrslot++;......
f4e0: 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d  .pcsc_readers +=
f4f0: 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
f500: 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   + 1;.....}.....
f510: 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 20  .if (currslot > 
f520: 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 5f 63  0) {......slot_c
f530: 6f 75 6e 74 20 3d 20 63 75 72 72 73 6c 6f 74 3b  ount = currslot;
f540: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
f550: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
f560: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f  BUG_PRINTF("Seco
f570: 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  nd call to SCard
f580: 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
f590: 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
f5a0: 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
f5b0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
f5c0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
f5d0: 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
f5e0: 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
f5f0: 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09  eaders_ret);....
f600: 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f  }.....free(pcsc_
f610: 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20  readers_s);...} 
f620: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
f630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
f640: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61  irst call to SCa
f650: 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61  rdListReaders fa
f660: 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f  iled, return %s/
f670: 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  %li", CACKEY_DEB
f680: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
f690: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69  _TO_STR(scard_li
f6a0: 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20  streaders_ret), 
f6b0: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73  (long) scard_lis
f6c0: 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09  treaders_ret);..
f6d0: 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
f6e0: 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
f6f0: 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
f700: 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
f710: 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
f720: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
f730: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
f740: 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
f750: 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
f760: 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
f770: 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
f780: 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
f790: 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
f7a0: 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a  t = slot_count;.
f7b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f7c0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
f7d0: 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
f7e0: 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
f7f0: 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
f800: 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75  .count = *pulCou
f810: 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c  nt;..if (count <
f820: 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09   slot_count) {..
f830: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f840: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
f850: 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
f860: 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
f870: 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73  have %lu entries
f880: 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  .", count, slot_
f890: 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
f8a0: 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  n(CKR_BUFFER_TOO
f8b0: 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 66  _SMALL);...}...f
f8c0: 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
f8d0: 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 73 6c 6f  ; currslot < slo
f8e0: 74 5f 63 6f 75 6e 74 3b 20 63 75 72 72 73 6c 6f  t_count; currslo
f8f0: 74 2b 2b 29 20 7b 0a 09 09 70 53 6c 6f 74 4c 69  t++) {...pSlotLi
f900: 73 74 5b 63 75 72 72 73 6c 6f 74 5d 20 3d 20 63  st[currslot] = c
f910: 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a 0a 09 2a 70  urrslot;..}...*p
f920: 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
f930: 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ount;...CACKEY_D
f940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
f950: 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
f960: 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
f970: 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
f980: 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d  ..tokenPresent =
f990: 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f   tokenPresent; /
f9a0: 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
f9b0: 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
f9c0: 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
f9d0: 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
f9e0: 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29  , C_GetSlotInfo)
f9f0: 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
fa00: 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f  ID, CK_SLOT_INFO
fa10: 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
fa20: 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
fa30: 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  R slotDescriptio
fa40: 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c  n[] = "CACKey Sl
fa50: 6f 74 22 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f  ot";..int bytes_
fa60: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45  to_copy;...CACKE
fa70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
fa80: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
fa90: 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
faa0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
fab0: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
fac0: 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
fad0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
fae0: 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
faf0: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
fb00: 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
fb10: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
fb20: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
fb30: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
fb40: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
fb50: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
fb60: 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
fb70: 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
fb80: 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
fb90: 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
fba0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
fbb0: 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
fbc0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
fbd0: 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
fbe0: 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
fbf0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fc00: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
fc10: 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
fc20: 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
fc30: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
fc40: 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
fc50: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
fc60: 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
fc70: 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
fc80: 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
fc90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fca0: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
fcb0: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
fcc0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
fcd0: 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
fce0: 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
fcf0: 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
fd00: 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
fd10: 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
fd20: 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
fd30: 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  ion));..memcpy(p
fd40: 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
fd50: 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72  ption, slotDescr
fd60: 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73  iption, sizeof(s
fd70: 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20  lotDescription) 
fd80: 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
fd90: 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
fda0: 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
fdb0: 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
fdc0: 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 62 79 74  turerID));...byt
fdd0: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72  es_to_copy = str
fde0: 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  len(cackey_slots
fdf0: 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
fe00: 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65  ader);..if (size
fe10: 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
fe20: 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65  cturerID) < byte
fe30: 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62  s_to_copy) {...b
fe40: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
fe50: 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
fe60: 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d  ufacturerID);..}
fe70: 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
fe80: 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
fe90: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
fea0: 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
feb0: 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
fec0: 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
fed0: 20 3d 20 30 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 0;...if (cack
fee0: 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
fef0: 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
ff00: 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45  lotID]) == CACKE
ff10: 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
ff20: 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f  ESENT) {...pInfo
ff30: 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54  ->flags |= CKF_T
ff40: 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d  OKEN_PRESENT;..}
ff50: 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ...pInfo->hardwa
ff60: 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
ff70: 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
ff80: 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20  sion() >> 16) & 
ff90: 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61  0xff;..pInfo->ha
ffa0: 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rdwareVersion.mi
ffb0: 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
ffc0: 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
ffd0: 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f   & 0xff;...pInfo
ffe0: 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
fff0: 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a  n.major = 0x00;.
10000 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
10010 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
10020 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0x00;...CACKEY_D
10030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
10040 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
10050 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
10060 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
10070 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
10080 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
10090 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f  etTokenInfo)(CK_
100a0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
100b0 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54  CK_TOKEN_INFO_PT
100c0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
100d0 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
100e0 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
100f0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
10100 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
10110 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74  UTF8CHAR default
10120 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f  Label[] = "Unkno
10130 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74  wn Token";..stat
10140 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
10150 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f  odel[] = "CAC To
10160 6b 65 6e 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ken";...CACKEY_D
10170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
10180 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
10190 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
101a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
101b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
101c0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
101d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
101e0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
101f0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
10200 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
10210 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
10220 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
10230 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
10240 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
10250 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
10260 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
10270 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
10280 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
10290 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
102a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
102b0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
102c0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
102d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
102e0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
102f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10300 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
10310 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
10320 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
10330 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
10340 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
10350 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
10360 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
10370 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
10380 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
10390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
103a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
103b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
103c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
103d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
103e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
103f0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
10400 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
10410 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
10420 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
10430 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
10440 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10450 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
10460 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
10470 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
10480 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
10490 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52  CKR_TOKEN_NOT_PR
104a0 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 65 6d  ESENT);..}...mem
104b0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
104c0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
104d0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 69  nfo->label));..i
104e0 66 20 28 31 29 20 7b 0a 09 09 6d 65 6d 63 70 79  f (1) {...memcpy
104f0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64  (pInfo->label, d
10500 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a  efaultLabel, siz
10510 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c  eof(defaultLabel
10520 29 20 2d 20 31 29 3b 0a 09 7d 20 65 6c 73 65 20  ) - 1);..} else 
10530 7b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  {..}...memset(pI
10540 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
10550 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
10560 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
10570 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
10580 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
10590 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
105a0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
105b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
105c0 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
105d0 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
105e0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
105f0 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
10600 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
10610 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
10620 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
10630 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
10640 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
10650 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
10660 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
10670 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
10680 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
10690 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
106a0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
106b0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
106c0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
106d0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
106e0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
106f0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
10700 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
10710 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
10720 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
10730 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
10740 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
10750 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
10760 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
10770 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
10780 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
10790 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
107a0 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
107b0 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
107c0 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
107d0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
107e0 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c  RED;...pInfo->ul
107f0 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  MaxSessionCount 
10800 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
10810 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
10820 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
10830 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70  ons[0])) - 1;..p
10840 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43  Info->ulSessionC
10850 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
10860 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
10870 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
10880 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
10890 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77   0;..pInfo->ulRw
108a0 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
108b0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
108c0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
108d0 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d  o->ulMaxPinLen =
108e0 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   128;..pInfo->ul
108f0 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09  MinPinLen = 0;..
10900 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75  pInfo->ulTotalPu
10910 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
10920 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
10930 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
10940 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d  >ulFreePublicMem
10950 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
10960 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
10970 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
10980 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  lPrivateMemory =
10990 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
109a0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
109b0 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61  nfo->ulFreePriva
109c0 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
109d0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
109e0 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ATION;...CACKEY_
109f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10a00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
10a10 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
10a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
10a30 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
10a40 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
10a50 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
10a60 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  )(CK_FLAGS flags
10a70 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
10a80 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49   pSlotID, CK_VOI
10a90 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
10aa0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
10ab0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
10ac0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
10ad0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
10ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10af0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
10b00 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
10b10 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
10b20 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
10b30 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
10b40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
10b50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
10b60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
10b70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
10b80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
10b90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
10ba0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
10bb0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
10bc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
10bd0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
10be0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
10bf0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
10c00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
10c10 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
10c20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
10c30 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
10c40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
10c50 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
10c60 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
10c70 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
10c80 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
10c90 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
10ca0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
10cb0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
10cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10cd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
10ce0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
10cf0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
10d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10d10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
10d20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
10d30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
10d40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
10d50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
10d60 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
10d70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10d80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
10d90 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
10da0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
10db0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
10dc0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
10dd0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
10de0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
10df0 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43  ount = 3;....CAC
10e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10e10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
10e20 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
10e30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
10e40 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
10e50 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a  pulCount < 3) {.
10e60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10e70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
10e80 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
10e90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
10ea0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
10eb0 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
10ec0 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
10ed0 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65  M_RSA_PKCS;..pMe
10ee0 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d  chanismList[1] =
10ef0 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
10f00 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  CS;..*pulCount =
10f10 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   2;...CACKEY_DEB
10f20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
10f30 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
10f40 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
10f50 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
10f60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
10f70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
10f80 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43  MechanismInfo)(C
10f90 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
10fa0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
10fb0 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43  YPE type, CK_MEC
10fc0 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20  HANISM_INFO_PTR 
10fd0 70 49 6e 66 6f 29 20 7b 0a 09 43 41 43 4b 45 59  pInfo) {..CACKEY
10fe0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
10ff0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
11000 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
11010 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
11020 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
11030 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
11040 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
11050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11060 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
11070 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
11080 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
11090 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
110a0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
110b0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
110c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
110d0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
110e0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
110f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
11100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11110 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
11120 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
11130 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
11140 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
11150 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
11160 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
11170 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
11180 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
11190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
111a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
111b0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
111c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
111d0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
111e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
111f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
11200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11210 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
11220 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
11230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
11240 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
11250 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
11260 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20 69 73  ./* XXX: This is
11270 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64 20 66   untested, and f
11280 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74 20 72  urther I'm not r
11290 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20 74 68  eally sure if th
112a0 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a  is is correct. *
112b0 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29  /..switch (type)
112c0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
112d0 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f  A_PKCS:....pInfo
112e0 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d  ->ulMinKeySize =
112f0 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e   512;....pInfo->
11300 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38  ulMaxKeySize = 8
11310 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66  192;....pInfo->f
11320 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20  lags = CKF_HW | 
11330 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b  CKF_ENCRYPT | CK
11340 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_DECRYPT | CKF_
11350 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
11360 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  Y;....break;...c
11370 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f 35 30  ase CKM_RSA_X_50
11380 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  9:....pInfo->ulM
11390 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
113a0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
113b0 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
113c0 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
113d0 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
113e0 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
113f0 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
11400 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
11410 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
11420 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
11430 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  :....pInfo->ulMi
11440 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a  nKeySize = 512;.
11450 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b  ...pInfo->ulMaxK
11460 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09  eySize = 8192;..
11470 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
11480 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 53 49   CKF_HW | CKF_SI
11490 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
114a0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
114b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
114c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
114d0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
114e0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
114f0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  KR_OK);.}../* We
11500 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
11510 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
11520 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
11530 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54  N(CK_RV, C_InitT
11540 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  oken)(CK_SLOT_ID
11550 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38   slotID, CK_UTF8
11560 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
11570 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
11580 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
11590 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43  R pLabel) {..CAC
115a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
115b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
115c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
115d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
115e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
115f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
11600 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
11610 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
11620 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
11630 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
11640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11650 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
11660 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
11670 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
11680 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
11690 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
116a0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
116b0 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
116c0 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
116d0 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
116e0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
116f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
11700 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  nitPIN)(CK_SESSI
11710 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
11720 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
11730 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
11740 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
11750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11760 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
11770 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
11780 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
11790 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
117a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
117b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
117c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
117d0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
117e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
117f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11800 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
11810 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
11820 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
11830 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
11840 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
11850 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
11860 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
11870 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
11880 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
11890 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
118a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
118b0 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53  C_SetPIN)(CK_SES
118c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
118d0 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
118e0 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43  R_PTR pOldPin, C
118f0 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e  K_ULONG ulOldPin
11900 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
11910 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b  _PTR pNewPin, CK
11920 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c  _ULONG ulNewPinL
11930 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
11940 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
11950 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
11960 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
11970 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11990 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
119a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
119b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
119c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
119d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
119e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
119f0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
11a00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
11a10 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
11a20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
11a30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
11a40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
11a50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
11a60 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
11a70 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73  K_RV, C_OpenSess
11a80 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ion)(CK_SLOT_ID 
11a90 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53  slotID, CK_FLAGS
11aa0 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f   flags, CK_VOID_
11ab0 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  PTR pApplication
11ac0 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69  , CK_NOTIFY noti
11ad0 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fy, CK_SESSION_H
11ae0 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73  ANDLE_PTR phSess
11af0 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ion) {..unsigned
11b00 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20   long idx;..int 
11b10 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
11b20 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  nt found_session
11b30 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
11b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
11b50 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
11b60 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
11b70 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
11b80 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
11b90 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
11ba0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
11bb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11bc0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
11bd0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
11be0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
11bf0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
11c00 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
11c10 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
11c20 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
11c30 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
11c40 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
11c50 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
11c60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11c70 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
11c80 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
11c90 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
11ca0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
11cb0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
11cc0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
11cd0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28  LID);..}...if ((
11ce0 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
11cf0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
11d00 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
11d10 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
11d20 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
11d30 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
11d40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
11d50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
11d60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11d70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11d80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
11d90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
11da0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
11db0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
11dc0 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
11dd0 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
11de0 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
11df0 6c 6f 74 2e 20 2a 2f 0a 09 69 66 20 28 63 61 63  lot. */..if (cac
11e00 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
11e10 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
11e20 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
11e30 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
11e40 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
11e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11e60 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
11e70 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
11e80 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
11e90 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 72  _REMOVED");....r
11ea0 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45  eturn(CKR_DEVICE
11eb0 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09  _REMOVED);..}...
11ec0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
11ed0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
11ee0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
11ef0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
11f00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
11f10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11f20 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
11f30 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
11f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
11f50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
11f60 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69  .for (idx = 1; i
11f70 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
11f80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
11f90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
11fa0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
11fb0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
11fc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
11fd0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66  ].active) {....f
11fe0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31  ound_session = 1
11ff0 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e  ;.....*phSession
12000 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b   = idx;.....cack
12010 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
12020 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
12030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
12040 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c  idx].slotID = sl
12050 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f  otID;....cackey_
12060 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74  sessions[idx].st
12070 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
12080 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09  LIC_SESSION;....
12090 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
120a0 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61  idx].flags = fla
120b0 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  gs;....cackey_se
120c0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65  ssions[idx].ulDe
120d0 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09  viceError = 0;..
120e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
120f0 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74  s[idx].pApplicat
12100 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69  ion = pApplicati
12110 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  on;....cackey_se
12120 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69  ssions[idx].Noti
12130 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09  fy = notify;....
12140 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
12150 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
12160 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
12170 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
12180 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
12190 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  t = 0;.....cacke
121a0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
121b0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
121c0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
121d0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e  ssions[idx].sign
121e0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
121f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
12200 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63  [idx].decrypt_ac
12210 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 62 72  tive = 0;.....br
12220 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
12230 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
12240 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
12250 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
12260 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
12270 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
12280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12290 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
122a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
122b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
122c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
122d0 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
122e0 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
122f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12300 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
12310 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
12320 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
12330 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
12340 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
12350 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
12360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12370 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
12380 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
12390 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
123a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
123b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
123c0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
123d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
123e0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
123f0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
12400 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _attr;..unsigned
12410 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74   long id_idx, at
12420 74 72 5f 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  tr_idx;..int mut
12430 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
12440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12450 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12460 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
12470 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
12480 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12490 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
124a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
124b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
124c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
124d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
124e0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
124f0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
12500 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
12510 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
12520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
12530 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
12540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12550 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
12560 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
12570 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
12580 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
12590 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
125a0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
125b0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
125c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
125d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
125e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
125f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12600 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
12610 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
12620 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
12630 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
12640 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
12650 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
12660 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
12670 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
12680 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
12690 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
126a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
126b0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
126c0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
126d0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
126e0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
126f0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
12700 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
12710 76 65 20 3d 20 30 3b 0a 09 69 66 20 28 63 61 63  ve = 0;..if (cac
12720 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
12730 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
12740 73 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 5f 69  s) {...for (id_i
12750 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
12760 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
12770 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
12780 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f  ities_count; id_
12790 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  idx++) {....if (
127a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
127b0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
127c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
127d0 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66  ributes) {.....f
127e0 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
127f0 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63  ; attr_idx < cac
12800 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
12810 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
12820 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
12830 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
12840 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 09 63  _idx++) {......c
12850 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b  urr_attr = &cack
12860 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
12870 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
12880 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
12890 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
128a0 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
128b0 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
128c0 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74  ....free(curr_at
128d0 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09  tr->pValue);....
128e0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66  ..}.....}......f
128f0 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
12900 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
12910 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
12920 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09  .attributes);...
12930 09 7d 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  .}...}....free(c
12940 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
12950 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
12960 69 65 73 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ies);..}...mutex
12970 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
12980 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
12990 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
129a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
129b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
129c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
129d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
129e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
129f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
12a00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
12a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12a20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
12a30 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
12a40 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
12a50 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
12a60 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
12a70 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  _RV, C_CloseAllS
12a80 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54  essions)(CK_SLOT
12a90 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75  _ID slotID) {..u
12aa0 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e  int32_t idx;..in
12ab0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
12ac0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12ad0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
12ae0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
12af0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
12b00 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
12b10 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
12b20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
12b30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12b40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12b50 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
12b60 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
12b70 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
12b80 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
12b90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
12ba0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
12bb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
12bc0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
12bd0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
12be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12bf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
12c00 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
12c10 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
12c20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
12c30 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
12c40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
12c50 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
12c60 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
12c70 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
12c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
12ca0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
12cb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
12cc0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
12cd0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
12ce0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
12cf0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
12d00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
12d10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
12d20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
12d30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12d40 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
12d50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
12d60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
12d70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
12d80 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
12d90 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
12da0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
12db0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
12dc0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
12dd0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
12de0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
12df0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
12e00 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
12e10 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
12e20 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
12e30 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
12e40 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
12e50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
12e60 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
12e70 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
12e80 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
12e90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
12ea0 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
12eb0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
12ec0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
12ed0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
12ee0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
12ef0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
12f00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12f10 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
12f20 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
12f30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
12f40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
12f50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
12f60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
12f70 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
12f80 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
12f90 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
12fa0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
12fb0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
12fc0 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
12fd0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
12fe0 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
12ff0 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
13000 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
13010 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
13020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
13030 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
13040 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
13050 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13060 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
13070 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
13080 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
13090 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
130a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
130b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
130c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
130d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
130e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
130f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
13100 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
13110 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
13120 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
13130 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
13140 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
13150 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
13160 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
13170 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
13180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13190 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
131a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
131b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
131c0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
131d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
131e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
131f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
13200 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13210 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13220 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13240 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
13250 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13260 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13270 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13280 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
13290 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
132a0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
132b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
132c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
132d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
132e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
132f0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
13300 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
13310 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
13320 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
13330 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
13340 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
13350 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
13360 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
13370 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
13380 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
13390 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
133a0 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
133b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
133c0 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
133d0 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
133e0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
133f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
13400 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
13410 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
13420 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
13430 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13440 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
13450 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
13460 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13470 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
13480 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
13490 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
134a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
134b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
134c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
134d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
134e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
134f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
13500 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
13510 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
13520 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
13530 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
13540 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
13550 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
13560 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
13570 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
13580 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
13590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
135a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
135b0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
135c0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
135d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
135e0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
135f0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
13600 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
13610 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
13620 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
13630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13640 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
13650 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
13660 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
13670 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
13680 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
13690 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
136a0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
136b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
136c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
136d0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
136e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
136f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
13700 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
13710 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
13720 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
13730 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
13740 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
13750 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
13760 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
13770 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
13780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13790 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
137a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
137b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
137c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
137d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
137e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
137f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
13800 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
13810 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
13820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13830 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
13840 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
13850 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
13860 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
13870 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
13880 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
13890 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
138a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
138b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
138c0 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
138d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
138e0 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
138f0 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
13900 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
13910 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
13920 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
13930 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 6c 6f 67  retval;..int log
13940 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
13950 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
13960 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
13970 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
13980 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
13990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
139a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
139b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
139c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
139d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
139e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
139f0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
13a00 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
13a10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
13a20 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
13a30 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
13a40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13a50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13a60 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
13a70 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
13a80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
13a90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
13aa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
13ab0 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
13ac0 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
13ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13ae0 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
13af0 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
13b00 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
13b10 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
13b20 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
13b30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
13b40 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
13b50 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
13b60 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
13b70 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
13b80 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
13b90 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
13ba0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13bb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13bc0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
13bd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
13be0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
13bf0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
13c00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
13c10 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
13c20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
13c30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
13c40 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
13c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13c60 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
13c70 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
13c80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
13c90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
13ca0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  ALID);..}...logi
13cb0 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
13cc0 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
13cd0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
13ce0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
13cf0 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69  tID], pPin, ulPi
13d00 6e 4c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  nLen, NULL);..if
13d10 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43   (login_ret != C
13d20 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
13d30 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
13d40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
13d50 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
13d60 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
13d70 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
13d80 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ED) {....CACKEY_
13d90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
13da0 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c  ror.  Token is l
13db0 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ocked.");.....re
13dc0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
13dd0 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  KED);...} else i
13de0 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
13df0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
13e00 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45  DPIN) {....CACKE
13e10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e20 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20  Error.  Invalid 
13e30 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  PIN.");.....retu
13e40 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
13e50 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
13e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13e70 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
13e80 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
13e90 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
13ea0 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
13eb0 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
13ec0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
13ed0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
13ee0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
13ef0 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
13f00 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49  S_RO_USER_FUNCTI
13f10 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ONS;...mutex_ret
13f20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
13f30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
13f40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
13f50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
13f60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
13f70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13f80 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
13f90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
13fa0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
13fb0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
13fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13fd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
13fe0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
13ff0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
14000 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
14010 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
14020 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45   C_Logout)(CK_SE
14030 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
14040 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
14050 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
14060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14070 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
14080 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
14090 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
140a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
140b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
140c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
140d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
140e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
140f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
14100 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
14110 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
14120 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
14130 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
14140 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
14150 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
14160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14170 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
14180 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
14190 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
141a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
141b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
141c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
141d0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
141e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
141f0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
14200 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
14210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14220 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
14230 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
14240 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
14250 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
14260 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
14270 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
14280 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
14290 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
142a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
142b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
142c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
142d0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
142e0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
142f0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
14300 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
14310 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
14320 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61  ns[hSession].sta
14330 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c  te = CKS_RO_PUBL
14340 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 6d 75  IC_SESSION;...mu
14350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
14360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
14370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
14380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
14390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
143a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
143b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
143c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
143d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
143e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
143f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14410 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
14420 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
14430 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
14440 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
14450 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65  (CK_RV, C_Create
14460 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
14470 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
14480 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
14490 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
144a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
144b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
144c0 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29  LE_PTR phObject)
144d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
144e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
144f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
14500 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
14510 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14520 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14530 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
14540 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
14550 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
14560 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
14570 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14580 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14590 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
145a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
145b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
145c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
145d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
145e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
145f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
14600 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
14610 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29  V, C_CopyObject)
14620 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
14630 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
14640 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
14650 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
14660 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
14670 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
14680 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
14690 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f  ANDLE_PTR phNewO
146a0 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
146b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
146c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
146d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
146e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
146f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
14700 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
14710 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
14720 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
14730 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
14740 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
14750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14760 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
14770 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
14780 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
14790 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
147a0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
147b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
147c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
147d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
147e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72  N(CK_RV, C_Destr
147f0 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  oyObject)(CK_SES
14800 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
14810 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
14820 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20  HANDLE hObject) 
14830 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
14840 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14850 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
14860 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
14870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14880 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
14890 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
148a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
148b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
148c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
148d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
148e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
148f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
14900 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
14910 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
14920 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
14930 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
14940 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
14950 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
14960 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
14970 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  , C_GetObjectSiz
14980 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
14990 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
149a0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
149b0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
149c0 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b  G_PTR pulSize) {
149d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
149e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
149f0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
14a00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
14a10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14a20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
14a30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
14a40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14a50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
14a60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
14a70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14a80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
14a90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
14aa0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
14ab0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
14ac0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
14ad0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
14ae0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
14af0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
14b00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
14b10 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
14b20 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
14b30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
14b40 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
14b50 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
14b60 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
14b70 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
14b80 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
14b90 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
14ba0 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61  attr;..struct ca
14bb0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
14bc0 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e  dentity;..unsign
14bd0 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
14be0 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20  _idx, attr_idx, 
14bf0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e  sess_attr_idx, n
14c00 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74  um_ids;..int mut
14c10 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ex_retval;..CK_R
14c20 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  V retval = CKR_O
14c30 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  K;..CK_VOID_PTR 
14c40 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
14c50 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  G ulValueLen;...
14c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14c70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
14c80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
14c90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
14ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14cb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
14cc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
14cd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
14ce0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
14cf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
14d00 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
14d10 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
14d20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
14d30 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
14d40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
14d50 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
14d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14d70 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
14d80 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
14d90 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
14da0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
14db0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
14dc0 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29  f (hObject == 0)
14dd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14de0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14df0 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
14e00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
14e10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
14e20 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
14e30 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
14e40 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20   (ulCount == 0) 
14e50 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
14e60 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
14e70 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
14e80 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
14e90 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
14ea0 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ly */...CACKEY_D
14eb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
14ec0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
14ed0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
14ee0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
14ef0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
14f00 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
14f10 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
14f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54  INTF("Error.  pT
14f40 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e  emplate is NULL.
14f50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
14f60 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
14f70 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f  ;..}...identity_
14f80 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20  idx = hObject - 
14f90 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  1;...mutex_retva
14fa0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
14fb0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
14fc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
14fd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
14fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14ff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15000 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
15010 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15020 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
15030 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
15040 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
15050 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
15060 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15070 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15080 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
15090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
150a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
150b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
150c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
150d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
150e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69  LID);..}...num_i
150f0 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ds = cackey_sess
15100 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
15110 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
15120 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f  ...if (identity_
15130 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20  idx >= num_ids) 
15140 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
15150 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
15160 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
15170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15180 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
15190 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
151a0 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69  nge.  identity_i
151b0 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64  dx = %lu, num_id
151c0 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69  s = %lu.", (unsi
151d0 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
151e0 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e  ity_idx, (unsign
151f0 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73  ed long) num_ids
15200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15210 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
15220 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64  NVALID);..}...id
15230 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
15240 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
15250 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69  on].identities[i
15260 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09  dentity_idx];...
15270 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
15280 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c  0; attr_idx < ul
15290 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  Count; attr_idx+
152a0 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72  +) {...curr_attr
152b0 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74   = &pTemplate[at
152c0 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c  tr_idx];....pVal
152d0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
152e0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
152f0 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45  NG) -1;....CACKE
15300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15310 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  Looking for attr
15320 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69  ibute 0x%08lx (i
15330 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e  dentity:%lu) ...
15340 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15350 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
15360 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  pe, (unsigned lo
15370 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
15380 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f  );....for (sess_
15390 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
153a0 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64  ss_attr_idx < id
153b0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
153c0 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
153d0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
153e0 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74  if (identity->at
153f0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
15400 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20  tr_idx].type == 
15410 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
15420 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
15430 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15440 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75   found it, pValu
15450 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c  e = %p, ulValueL
15460 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74  en = %lu", ident
15470 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
15480 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
15490 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d  Value, identity-
154a0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
154b0 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
154c0 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09  ueLen);.........
154d0 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
154e0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
154f0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
15500 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alue;.....ulValu
15510 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  eLen = identity-
15520 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
15530 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
15540 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ueLen;....}...}.
15550 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
15560 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c  ->pValue && pVal
15570 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72  ue) {....if (cur
15580 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
15590 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  en >= ulValueLen
155a0 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  ) {.....memcpy(c
155b0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
155c0 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75  , pValue, ulValu
155d0 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  eLen);....} else
155e0 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65   {.....ulValueLe
155f0 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
15600 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
15610 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
15620 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  MALL;....}...}..
15630 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  ..curr_attr->ulV
15640 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
15650 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  eLen;..}...mutex
15660 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15670 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
15680 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
15690 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
156a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
156b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
156c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
156d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
156e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
156f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
15700 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
15710 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
15720 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41  _INVALID) {...CA
15730 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15740 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
15750 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
15760 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28  INVALID (%i)", (
15770 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
15780 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
15790 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
157a0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41  OO_SMALL) {...CA
157b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
157c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
157d0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
157e0 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  L (%i)", (int) r
157f0 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
15800 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
15810 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
15820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15830 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
15840 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
15850 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  val);..} else {.
15860 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15870 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15880 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
15890 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  al);..}...return
158a0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
158b0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
158c0 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72  CK_RV, C_SetAttr
158d0 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
158e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
158f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
15900 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
15910 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
15920 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
15930 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
15940 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
15950 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15960 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
15970 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
15980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15990 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
159a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
159b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
159c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
159d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
159e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
159f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15a00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
15a10 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
15a20 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
15a30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
15a40 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
15a50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
15a60 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
15a70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
15a80 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  , C_FindObjectsI
15a90 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
15aa0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
15ab0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
15ac0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
15ad0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
15ae0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
15af0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
15b00 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
15b10 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
15b20 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
15b30 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
15b40 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
15b50 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
15b60 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
15b70 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72  g num_certs, cer
15b80 74 5f 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t_idx;..int mute
15b90 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
15ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15bb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15bc0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15bd0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15bf0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
15c00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
15c10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
15c20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
15c30 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
15c40 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
15c50 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
15c60 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
15c70 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
15c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
15c90 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
15ca0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15cb0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
15cc0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
15cd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
15ce0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
15cf0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
15d00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15d10 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
15d20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
15d30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
15d40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
15d50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15d60 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
15d70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
15d80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
15d90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
15da0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
15db0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
15dc0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
15dd0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
15de0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
15df0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15e00 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
15e10 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
15e20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
15e30 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
15e40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
15e50 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
15e60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
15e70 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
15e80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
15e90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
15ea0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
15eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
15ec0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
15ed0 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
15ee0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
15ef0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
15f00 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  E);..}...if (cac
15f10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
15f20 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
15f30 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70  s == NULL) {...p
15f40 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d  csc_identities =
15f50 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72   cackey_read_cer
15f60 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ts(&cackey_slots
15f70 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
15f80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
15f90 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
15fa0 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
15fb0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
15fc0 4e 55 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 43 6f  NULL) {..../* Co
15fd0 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20  nvert number of 
15fe0 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20  Certs to number 
15ff0 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
16000 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f  .num_ids = (CKO_
16010 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b  PRIVATE_KEY - CK
16020 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20  O_CERTIFICATE + 
16030 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  1) * num_certs;.
16040 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
16050 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
16060 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
16070 74 69 65 73 29 29 3b 0a 0a 09 09 09 69 64 5f 69  ties));.....id_i
16080 64 78 20 3d 20 30 3b 0a 09 09 09 66 6f 72 20 28  dx = 0;....for (
16090 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
160a0 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72  rt_idx < num_cer
160b0 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
160c0 7b 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 5f  {.....for (curr_
160d0 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45  id_type = CKO_CE
160e0 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f  RTIFICATE; curr_
160f0 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50  id_type <= CKO_P
16100 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72  RIVATE_KEY; curr
16110 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  _id_type++) {...
16120 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
16130 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
16140 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
16150 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 64  tributes(curr_id
16160 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65  _type, &pcsc_ide
16170 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
16180 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64  ], cert_idx, &id
16190 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
161a0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
161b0 74 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 69 64  t);.......if (id
161c0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
161d0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 3d 20 4e  .attributes == N
161e0 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 64 65  ULL) {.......ide
161f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
16200 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
16210 20 3d 20 30 3b 0a 09 09 09 09 09 7d 0a 0a 09 09   = 0;......}....
16220 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09  ...id_idx++;....
16230 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
16240 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
16250 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
16260 20 3d 20 69 64 65 6e 74 69 74 69 65 73 3b 0a 09   = identities;..
16270 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
16280 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
16290 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 6e  tities_count = n
162a0 75 6d 5f 69 64 73 3b 0a 0a 09 09 09 63 61 63 6b  um_ids;.....cack
162b0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
162c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
162d0 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
162e0 7d 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70  }..}...if (pTemp
162f0 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  late != NULL) {.
16300 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
16310 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
16320 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
16330 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
16340 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b  count = ulCount;
16350 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
16360 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
16370 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c  arch_query = mal
16380 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69  loc(ulCount * si
16390 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
163a0 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61  );.....memcpy(ca
163b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
163c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
163d0 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c  uery, pTemplate,
163e0 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f   ulCount * sizeo
163f0 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
16400 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61  ..} else {....ca
16410 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16420 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
16430 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  uery_count = 0;.
16440 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
16450 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
16460 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
16470 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
16480 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
16490 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
164a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
164b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
164c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
164d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
164e0 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63  earch query spec
164f0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62  ified as NULL, b
16500 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65  ut number of que
16510 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65  ry terms not spe
16520 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a  cified as 0.");.
16530 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
16540 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
16550 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
16560 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
16570 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
16580 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  nt = 0;...cackey
16590 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
165a0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
165b0 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61   = NULL;..}...ca
165c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
165d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
165e0 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b  ctive = 1;..cack
165f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
16600 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
16610 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65  r_id = 0;...mute
16620 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
16630 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16640 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16650 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
16660 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
16670 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16680 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
16690 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
166a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
166b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
166c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
166d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
166e0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
166f0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
16700 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
16710 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
16720 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65  K_RV, C_FindObje
16730 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  cts)(CK_SESSION_
16740 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
16750 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
16760 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20  E_PTR phObject, 
16770 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62  CK_ULONG ulMaxOb
16780 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c  jectCount, CK_UL
16790 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63  ONG_PTR pulObjec
167a0 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  tCount) {..struc
167b0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
167c0 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f  y *curr_id;..CK_
167d0 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
167e0 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  attr;..CK_ULONG 
167f0 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72  curr_id_idx, cur
16800 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75  r_out_id_idx, cu
16810 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73  rr_attr_idx, ses
16820 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f  s_attr_idx;..CK_
16830 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f  ULONG matched_co
16840 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65  unt, prev_matche
16850 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75  d_count;..int mu
16860 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
16870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16880 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
16890 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
168a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
168b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
168c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
168d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
168e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
168f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
16900 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
16910 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
16920 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
16930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16940 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65  "Error.  pulObje
16950 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ctCount is NULL.
16960 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
16970 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
16980 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
16990 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  ect == NULL && u
169a0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
169b0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
169c0 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
169d0 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
169e0 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
169f0 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
16a00 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70  ediately */...*p
16a10 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20  ulObjectCount = 
16a20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  0;....CACKEY_DEB
16a30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
16a40 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
16a50 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
16a60 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
16a70 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
16a80 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74  }...if (phObject
16a90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
16aa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ab0 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a  F("Error.  phObj
16ac0 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ect is NULL.");.
16ad0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
16ae0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
16af0 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65  ...if (ulMaxObje
16b00 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
16b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
16b30 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
16b40 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 69   objects specifi
16b50 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a  ed as zero.");..
16b60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
16b70 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
16b80 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
16b90 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
16ba0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
16bb0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
16bc0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
16bd0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
16be0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16bf0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
16c00 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
16c10 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
16c20 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
16c30 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
16c40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
16c50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
16c60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
16c70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
16c80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
16c90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16ca0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
16cb0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
16cc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
16cd0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
16ce0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
16cf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
16d00 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
16d10 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
16d20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
16d30 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
16d40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16d50 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
16d60 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
16d70 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
16d80 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
16d90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
16da0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
16db0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
16dc0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
16dd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16de0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16df0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16e00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16e10 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
16e20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
16e30 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
16e40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
16e50 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 69 64 5f 69  ;..}...curr_id_i
16e60 64 78 20 3d 20 30 3b 0a 09 63 75 72 72 5f 6f 75  dx = 0;..curr_ou
16e70 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
16e80 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
16e90 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
16ea0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
16eb0 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
16ec0 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
16ed0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
16ee0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
16ef0 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
16f00 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
16f10 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
16f20 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
16f30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
16f40 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
16f50 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
16f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16f70 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
16f80 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
16f90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16fa0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
16fb0 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
16fc0 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
16fd0 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
16fe0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
16ff0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
17000 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
17010 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
17020 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
17030 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
17040 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
17050 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
17060 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
17070 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
17080 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
17090 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
170a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
170b0 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
170c0 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78  for attribute 0x
170d0 25 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 74  %08lx in identit
170e0 79 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  y:%i...", (unsig
170f0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
17100 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29  ttr->type, (int)
17110 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09   curr_id_idx);..
17120 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17130 52 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c  RINTBUF("    Val
17140 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22  ue looking for:"
17150 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  , curr_attr->pVa
17160 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  lue, curr_attr->
17170 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17180 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
17190 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
171a0 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64  tr_idx < curr_id
171b0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
171c0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
171d0 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  x++) {.....if (c
171e0 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
171f0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
17200 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
17210 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
17220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17230 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66  RINTF("    ... f
17240 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79  ound matching ty
17250 70 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43  pe ...");......C
17260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17270 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
17280 72 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f  r value:", curr_
17290 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
172a0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
172b0 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
172c0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
172d0 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ttr_idx].ulValue
172e0 4c 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  Len);.......if (
172f0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
17300 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
17310 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17320 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
17330 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
17340 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  d match");......
17350 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
17360 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
17370 0a 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 69  ......}.. .....i
17380 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
17390 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72  ValueLen == curr
173a0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  _id->attributes[
173b0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75  sess_attr_idx].u
173c0 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d  lValueLen && mem
173d0 63 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  cmp(curr_attr->p
173e0 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e  Value, curr_id->
173f0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
17400 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
17410 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
17420 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
17430 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
17440 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 43   == 0) {.......C
17450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17460 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
17470 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68  ound exact match
17480 22 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68  ");........match
17490 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
174a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
174b0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
174c0 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62  /* If the attrib
174d0 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ute could not be
174e0 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74   matched, do not
174f0 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64   try to match ad
17500 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75  ditional attribu
17510 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72  tes */....if (pr
17520 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ev_matched_count
17530 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e   == matched_coun
17540 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  t) {.....break;.
17550 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
17560 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d  matched_count ==
17570 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
17580 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
17590 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b  h_query_count) {
175a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
175b0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41  _PRINTF("  ... A
175c0 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73  ll %i attributes
175d0 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
175e0 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74  nd, adding ident
175f0 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e  ity:%i to return
17600 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20  ed list", (int) 
17610 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
17620 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
17630 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69  _query_count, (i
17640 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
17650 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63  ;.....phObject[c
17660 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20  urr_out_id_idx] 
17670 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20  = curr_id_idx + 
17680 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65  1;.....ulMaxObje
17690 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63  ctCount--;.....c
176a0 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b  urr_out_id_idx++
176b0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
176c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
176d0 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61  NTF("  ... Not a
176e0 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e  ll %i (only foun
176f0 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73  d %i) attributes
17700 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75   checked for fou
17710 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69  nd, not adding i
17720 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e  dentity:%i", (in
17730 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  t) cackey_sessio
17740 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
17750 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c  rch_query_count,
17760 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63   (int) matched_c
17770 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
17780 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  _id_idx);...}..}
17790 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
177a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
177b0 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72  ch_curr_id = cur
177c0 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f  r_id_idx;..*pulO
177d0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72  bjectCount = cur
177e0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09  r_out_id_idx;...
177f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
17800 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
17810 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
17820 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
17830 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
17840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17850 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
17860 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
17870 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17880 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
17890 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
178a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
178b0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c  ing CKR_OK (%i),
178c0 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25   num objects = %
178d0 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75  lu", CKR_OK, *pu
178e0 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a  lObjectCount);..
178f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
17900 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
17910 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
17920 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c  FindObjectsFinal
17930 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
17940 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
17950 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
17960 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
17970 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17980 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
17990 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
179a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
179b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
179c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
179d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
179e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
179f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
17a00 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
17a10 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
17a20 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
17a30 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
17a40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
17a50 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
17a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17a70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
17a80 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
17a90 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
17aa0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
17ab0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
17ac0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
17ad0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
17ae0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
17af0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
17b00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
17b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
17b30 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
17b40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
17b50 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
17b60 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
17b70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17b80 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
17b90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
17ba0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
17bb0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
17bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
17bd0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
17be0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
17bf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
17c00 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
17c10 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
17c20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
17c30 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
17c40 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
17c50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
17c60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
17c70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17c80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17c90 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
17ca0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
17cb0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
17cc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
17cd0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
17ce0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17cf0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
17d00 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79  = 0;..if (cackey
17d10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
17d20 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
17d30 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
17d40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
17d50 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
17d60 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  y);..}...mutex_r
17d70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17d80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
17d90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
17da0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
17db0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
17dc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17dd0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
17de0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17df0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17e00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
17e10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17e20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
17e30 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
17e40 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
17e50 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
17e60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
17e70 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  V, C_EncryptInit
17e80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
17e90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
17ea0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
17eb0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
17ec0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
17ed0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
17ee0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
17ef0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
17f00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
17f10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17f20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17f30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
17f40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
17f50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
17f60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
17f70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17f80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
17f90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
17fa0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
17fb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
17fc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
17fd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
17fe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
17ff0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
18000 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18010 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43  RV, C_Encrypt)(C
18020 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
18030 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
18040 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
18050 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
18060 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
18070 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
18080 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
18090 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20  cryptedDataLen) 
180a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
180b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
180c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
180d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
180e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
180f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
18100 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18110 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18120 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18130 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18150 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18160 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18170 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
18180 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
18190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
181a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
181b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
181c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
181d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
181e0 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  , C_EncryptUpdat
181f0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
18200 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18210 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
18220 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
18230 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
18240 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
18250 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
18260 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
18270 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
18280 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18290 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
182a0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
182b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
182c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
182d0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
182e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
182f0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18300 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18310 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
18320 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18330 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
18340 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
18350 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
18360 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
18370 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
18380 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
18390 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
183a0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
183b0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46  K_RV, C_EncryptF
183c0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
183d0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
183e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
183f0 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
18400 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
18410 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50  ulLastEncryptedP
18420 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
18430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18440 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
18450 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
18460 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
18470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18480 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
18490 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
184a0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
184b0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
184c0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
184d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
184e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
184f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
18500 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
18510 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
18520 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
18530 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18540 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
18550 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
18560 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
18570 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
18580 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
18590 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
185a0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
185b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
185c0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
185d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
185e0 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
185f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
18600 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
18610 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
18620 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
18630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18640 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
18650 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
18660 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
18670 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
18680 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
18690 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
186a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
186b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
186c0 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
186d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
186e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
186f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
18700 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
18710 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
18720 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
18730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
18740 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
18750 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
18760 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
18770 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
18780 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
18790 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
187a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
187b0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
187c0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
187d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
187e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
187f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
18800 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18810 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18820 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
18830 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
18840 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
18850 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
18860 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
18870 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
18880 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
18890 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
188a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
188b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
188c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
188d0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
188e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
188f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
18900 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
18910 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
18920 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
18930 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
18940 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18950 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
18960 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18970 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
18980 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
18990 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
189a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
189b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
189c0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
189d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
189e0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
189f0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
18a00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
18a10 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
18a20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
18a30 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61  rror.  Decrypt a
18a40 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
18a50 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
18a60 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
18a70 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
18a80 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
18a90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
18aa0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
18ab0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
18ac0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
18ad0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
18ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18af0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18b00 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
18b10 66 20 72 61 6e 67 65 2e 22 29 3b 0a 0a 09 09 72  f range.");....r
18b20 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41  eturn(CKR_KEY_HA
18b30 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
18b40 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
18b50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
18b60 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31  crypt_active = 1
18b70 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
18b80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
18b90 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20  crypt_mechanism 
18ba0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
18bb0 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79  chanism;..cackey
18bc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
18bd0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
18be0 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69  _parm = pMechani
18bf0 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a  sm->pParameter;.
18c00 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
18c10 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
18c20 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20  pt_mech_parmlen 
18c30 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c  = pMechanism->ul
18c40 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 0a 09  ParameterLen;...
18c50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
18c60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
18c70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
18c80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
18c90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
18ca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18cb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
18cc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
18cd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18ce0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
18cf0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
18d00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
18d10 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
18d20 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
18d30 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
18d40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
18d50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
18d60 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
18d70 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
18d80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
18d90 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
18da0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
18db0 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  dDataLen, CK_BYT
18dc0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
18dd0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
18de0 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  aLen) {..CK_ULON
18df0 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  G datalen_update
18e00 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  , datalen_final;
18e10 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f  ..CK_RV decrypt_
18e20 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
18e30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
18e40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
18e50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
18e60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
18e70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
18e80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
18e90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18ea0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
18eb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
18ec0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61  .}...if (pulData
18ed0 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
18ee0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ef0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
18f00 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  DataLen is NULL.
18f10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
18f20 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
18f30 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75  ;..}...datalen_u
18f40 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61  pdate = *pulData
18f50 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  Len;...decrypt_r
18f60 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  et = C_DecryptUp
18f70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
18f80 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75  EncryptedData, u
18f90 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
18fa0 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c  n, pData, &datal
18fb0 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20  en_update);..if 
18fc0 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
18fd0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
18fe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18ff0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
19000 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
19010 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
19020 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
19030 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f  d long) decrypt_
19040 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
19050 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d  decrypt_ret);..}
19060 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a  ...if (pData) {.
19070 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c  ..pData += datal
19080 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64  en_update;..}..d
19090 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a  atalen_final = *
190a0 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74  pulDataLen - dat
190b0 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64  alen_update;...d
190c0 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44  ecrypt_ret = C_D
190d0 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73  ecryptFinal(hSes
190e0 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61  sion, pData, &da
190f0 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69  talen_final);..i
19100 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
19110 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
19120 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19130 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
19140 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  ptFinal() return
19150 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
19160 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
19170 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74  ed long) decrypt
19180 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
19190 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
191a0 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20  }...*pulDataLen 
191b0 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
191c0 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c   + datalen_final
191d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
191e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
191f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
19200 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
19210 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
19220 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
19230 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
19240 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
19250 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
19260 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
19270 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
19280 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
19290 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
192a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
192b0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
192c0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74  ulPartLen) {..st
192d0 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66  atic CK_BYTE buf
192e0 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f  [16384];..ssize_
192f0 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 52 56  t buflen;..CK_RV
19300 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
19310 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
19320 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
19330 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19340 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
19350 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
19360 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
19370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19380 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
19390 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
193a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
193b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
193c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
193d0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
193e0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
193f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
19400 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
19410 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
19420 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
19430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19440 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
19450 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
19460 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
19470 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
19480 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
19490 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
194a0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
194b0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
194c0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
194d0 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
194e0 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
194f0 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
19500 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
19510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19520 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
19530 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
19540 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
19550 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
19560 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
19570 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
19580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
195a0 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
195b0 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
195c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
195d0 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
195e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
195f0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
19600 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
19610 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
19620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19630 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
19640 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
19650 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
19660 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
19670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
19680 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
19690 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
196a0 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
196b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
196c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
196d0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
196e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
196f0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
19700 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
19710 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
19720 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
19730 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
19740 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
19750 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19760 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19770 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
19780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19790 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
197a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
197b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
197c0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
197d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
197e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
197f0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
19800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
19810 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
19820 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
19830 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
19840 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
19850 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
19860 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
19870 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
19880 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
19890 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
198a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
198b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
198c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
198d0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
198e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
198f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
19900 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
19910 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  IZED);..}...swit
19920 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
19930 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
19940 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29  crypt_mechanism)
19950 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
19960 41 5f 50 4b 43 53 3a 0a 09 09 09 62 75 66 6c 65  A_PKCS:....bufle
19970 6e 20 3d 20 2d 31 3b 0a 0a 09 09 09 2f 2a 20 58  n = -1;...../* X
19980 58 58 3a 20 41 73 6b 20 63 61 72 64 20 74 6f 20  XX: Ask card to 
19990 64 65 63 72 79 70 74 20 2a 2f 0a 0a 09 09 09 69  decrypt */.....i
199a0 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
199b0 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
199c0 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
199d0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
199e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
199f0 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e  .} else if (((un
19a00 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
19a10 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c  len) > *pulPartL
19a20 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09  en && pPart) {..
19a30 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20  .../* Decrypted 
19a40 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
19a50 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
19a60 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
19a70 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ALL;....} else {
19a80 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20  .....if (pPart) 
19a90 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50  {......memcpy(pP
19aa0 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  art, buf, buflen
19ab0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  );.....}......*p
19ac0 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c  ulPartLen = bufl
19ad0 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
19ae0 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
19af0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
19b00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
19b10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
19b20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19b30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
19b40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
19b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19b60 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
19b70 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
19b80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
19b90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
19ba0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
19bb0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
19bc0 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
19bd0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
19be0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
19bf0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
19c00 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46  K_RV, C_DecryptF
19c10 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
19c20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
19c30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
19c40 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  astPart, CK_ULON
19c50 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72  G_PTR pulLastPar
19c60 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
19c70 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
19c80 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
19c90 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
19ca0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19cb0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
19cc0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
19cd0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
19ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19cf0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
19d00 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
19d10 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
19d20 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
19d30 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
19d40 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
19d50 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
19d60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
19d70 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
19d80 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
19d90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19da0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19db0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
19dc0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
19dd0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
19de0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
19df0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c  );..}...if (pulL
19e00 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  astPartLen == NU
19e10 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
19e20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19e30 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  or. pulLastPartL
19e40 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
19e50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
19e60 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
19e70 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
19e80 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
19e90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
19ea0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
19eb0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
19ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19ed0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
19ee0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
19ef0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
19f00 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
19f10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
19f20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19f30 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
19f40 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
19f50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
19f60 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
19f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19f80 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
19f90 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
19fa0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
19fb0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
19fc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
19fd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19fe0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
19ff0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1a000 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1a010 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1a020 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a040 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
1a050 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1a060 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1a070 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1a080 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74  );..}...*pulLast
1a090 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69  PartLen = 0;...i
1a0a0 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20  f (pLastPart == 
1a0b0 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e  NULL) {...termin
1a0c0 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b  ate_decrypt = 0;
1a0d0 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
1a0e0 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09  ate_decrypt) {..
1a0f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1a100 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
1a110 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  pt_active = 0;..
1a120 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1a130 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1a140 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1a150 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1a160 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1a170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a190 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1a1a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1a1b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1a1c0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
1a1d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a1e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1a1f0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1a200 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1a210 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1a220 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1a230 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53  DigestInit)(CK_S
1a240 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1a250 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1a260 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1a270 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ism) {..CACKEY_D
1a280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a290 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1a2a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1a2b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1a2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a2d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1a2e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1a2f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1a300 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1a310 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1a320 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1a330 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1a340 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1a350 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1a360 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1a370 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1a380 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1a390 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1a3a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1a3b0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29  CK_RV, C_Digest)
1a3c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a3d0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1a3e0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
1a3f0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
1a400 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1a410 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
1a420 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
1a430 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1a440 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a450 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1a460 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a490 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1a4a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1a4b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1a4c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1a4d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1a4e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1a4f0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1a500 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1a510 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1a520 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1a530 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1a540 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a550 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1a560 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1a570 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70  K_RV, C_DigestUp
1a580 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
1a590 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1a5a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
1a5b0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
1a5c0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
1a5d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a5e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1a5f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1a600 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1a610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a620 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1a630 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1a640 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1a650 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1a660 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1a670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1a690 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1a6a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1a6b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1a6c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1a6d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1a6e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1a6f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1a700 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
1a710 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  estKey)(CK_SESSI
1a720 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1a730 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
1a740 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
1a750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a760 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1a770 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1a780 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1a790 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a7a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1a7b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a7c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a7d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1a7e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1a7f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a800 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1a810 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1a820 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1a830 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1a840 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1a850 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1a860 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1a870 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1a880 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1a890 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53  igestFinal)(CK_S
1a8a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1a8b0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1a8c0 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
1a8d0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
1a8e0 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
1a8f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a900 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a910 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a920 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a940 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a950 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a960 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a970 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a980 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1a990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a9a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1a9b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1a9c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1a9d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a9e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1a9f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1aa00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1aa10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1aa20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
1aa30 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
1aa40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1aa50 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
1aa60 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
1aa70 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1aa80 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
1aa90 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
1aaa0 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
1aab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1aac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1aad0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1aae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1aaf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ab00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1ab10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ab20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1ab30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ab40 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
1ab50 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
1ab60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ab70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
1ab80 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
1ab90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1aba0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1abb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
1abc0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
1abd0 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
1abe0 20 26 26 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e   && pMechanism->
1abf0 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
1ac00 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 29 20  _SHA1_RSA_PKCS) 
1ac10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ac20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ac30 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
1ac40 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66  anism not specif
1ac50 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50  ied as CKM_RSA_P
1ac60 4b 43 53 20 6f 72 20 43 4b 4d 5f 53 48 41 31 5f  KCS or CKM_SHA1_
1ac70 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
1ac80 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
1ac90 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
1aca0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1acb0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1acc0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1acd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1ace0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1acf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1ad00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ad10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ad20 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1ad30 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1ad40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1ad50 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1ad60 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1ad70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ad80 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1ad90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ada0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1adb0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1adc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1add0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1ade0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1adf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ae00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
1ae10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ae20 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
1ae30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
1ae40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ae50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
1ae60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ae70 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
1ae80 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
1ae90 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1aea0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1aeb0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1aec0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1aed0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1aee0 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
1aef0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1af00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1af10 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1af20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1af30 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79  r.  Sign already
1af40 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
1af50 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1af60 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
1af70 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
1af80 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
1af90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
1afa0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
1afb0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1afc0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1afd0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1afe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1aff0 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
1b000 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
1b010 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  e.");....return(
1b020 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
1b030 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
1b040 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b050 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
1b060 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
1b070 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1b080 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
1b090 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
1b0a0 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63  ->mechanism;...c
1b0b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b0c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1b0d0 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63  flen = 128;..cac
1b0e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1b0f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
1b100 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  sed = 0;..cackey
1b110 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b120 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d  on].sign_buf = m
1b130 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
1b140 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1b150 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1b160 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
1b170 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1b180 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 6d 75  gn_buflen);...mu
1b190 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1b1a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1b1b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1b1c0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1b1d0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1b1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b1f0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1b200 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b220 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1b230 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b240 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b250 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1b260 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1b270 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1b280 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1b290 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28  (CK_RV, C_Sign)(
1b2a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1b2b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
1b2c0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
1b2d0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
1b2e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1b2f0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
1b300 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
1b310 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 4b 5f 52  tureLen) {..CK_R
1b320 56 20 73 69 67 6e 5f 72 65 74 3b 0a 0a 09 43 41  V sign_ret;...CA
1b330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b340 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b350 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b360 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b370 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b380 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1b390 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b3a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b3b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1b3c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e  IZED);..}...sign
1b3d0 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64  _ret = C_SignUpd
1b3e0 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  ate(hSession, pD
1b3f0 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b  ata, ulDataLen);
1b400 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
1b410 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
1b420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b430 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55  F("Error.  SignU
1b440 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
1b450 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
1b460 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
1b470 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
1b480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
1b490 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e  _ret);..}...sign
1b4a0 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e  _ret = C_SignFin
1b4b0 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69  al(hSession, pSi
1b4c0 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e  gnature, pulSign
1b4d0 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28  atureLen);..if (
1b4e0 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
1b4f0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1b500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b510 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29  or.  SignFinal()
1b520 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1b530 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1b540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b550 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
1b560 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
1b570 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b580 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b590 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b5a0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b5b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b5c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b5d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
1b5e0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
1b5f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1b600 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1b610 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
1b620 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  ulPartLen) {..in
1b630 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1b640 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b650 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1b660 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1b670 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1b680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b690 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1b6a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1b6b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b6c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1b6d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1b6e0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1b6f0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1b700 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1b710 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1b720 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1b730 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1b740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b750 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1b760 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1b770 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1b780 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1b790 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1b7a0 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55  .if (pPart == NU
1b7b0 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20  LL && ulPartLen 
1b7c0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
1b7d0 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65  rt circuit if we
1b7e0 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69   are asked to si
1b7f0 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f  gn nothing... */
1b800 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b810 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b820 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
1b830 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
1b840 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
1b850 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
1b860 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55  .if (pPart == NU
1b870 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1b880 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b890 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c  or. pPart is NUL
1b8a0 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e  L, but ulPartLen
1b8b0 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
1b8c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1b8d0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1b8e0 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d  .if (ulPartLen =
1b8f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1b900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b910 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69  ror. ulPartLen i
1b920 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69  s 0, but pPart i
1b930 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
1b940 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1b950 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1b960 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1b970 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1b980 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1b990 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1b9a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1b9b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b9c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1b9d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1b9e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1b9f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ba00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1ba10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ba20 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
1ba30 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1ba40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ba50 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1ba60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ba70 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
1ba80 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1ba90 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1baa0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1bab0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1bac0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bad0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
1bae0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
1baf0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1bb00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1bb10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bb20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
1bb30 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1bb40 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1bb50 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
1bb60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1bb70 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79  ..switch (cackey
1bb80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1bb90 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69  on].sign_mechani
1bba0 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
1bbb0 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
1bbc0 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65   Accumulate dire
1bbd0 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28  ctly */....if ((
1bbe0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1bbf0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1bc00 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c  ufused + ulPartL
1bc10 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73  en) > cackey_ses
1bc20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1bc30 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09  sign_buflen) {..
1bc40 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1bc50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1bc60 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a  n_buflen *= 2;..
1bc70 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1bc80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1bc90 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63  gn_buf = realloc
1bca0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1bcb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
1bcc0 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63  buf, sizeof(*cac
1bcd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1bce0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
1bcf0 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   * cackey_sessio
1bd00 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1bd10 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a  n_buflen);....}.
1bd20 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
1bd30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1bd40 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20  ion].sign_buf + 
1bd50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1bd60 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1bd70 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75  ufused, pPart, u
1bd80 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63  lPartLen);.....c
1bd90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1bda0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1bdb0 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c  fused += ulPartL
1bdc0 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  en;.....break;..
1bdd0 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52  .case CKM_SHA1_R
1bde0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
1bdf0 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f 20 61  ccumulate into a
1be00 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a 09 09   SHA1 hash */...
1be10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1be20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1be30 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ock);.....CACKEY
1be40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1be50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1be60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1be70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1be80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1be90 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65 74 75  ORTED);.....retu
1bea0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1beb0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1bec0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
1bed0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1bee0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1bef0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1bf00 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1bf10 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1bf20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bf30 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1bf40 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1bf50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1bf60 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1bf70 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1bf80 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1bf90 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1bfa0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1bfb0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1bfc0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1bfd0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46  N(CK_RV, C_SignF
1bfe0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
1bff0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1c000 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
1c010 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
1c020 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
1c030 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  ureLen) {..stati
1c040 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66  c CK_BYTE sigbuf
1c050 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  [1024];..ssize_t
1c060 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f   sigbuflen;..CK_
1c070 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
1c080 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
1c090 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
1c0a0 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
1c0b0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
1c0c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c0d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1c0e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1c0f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1c100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c110 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1c120 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1c130 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1c140 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1c150 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1c160 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
1c170 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1c180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c190 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
1c1a0 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
1c1b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c1c0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1c1d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
1c1e0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
1c1f0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
1c200 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1c210 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1c220 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
1c230 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c240 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c250 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
1c260 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
1c270 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
1c280 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
1c290 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1c2a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1c2b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1c2c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1c2d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1c2e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c2f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c300 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1c310 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1c320 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1c330 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
1c340 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1c350 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
1c360 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
1c370 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1c380 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
1c390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c3a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1c3b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1c3c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1c3d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
1c3e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
1c3f0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
1c400 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1c410 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
1c420 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c430 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c440 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1c450 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c460 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
1c470 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
1c480 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
1c490 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1c4a0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
1c4b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c4c0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
1c4d0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
1c4e0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
1c4f0 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
1c500 2d 31 3b 0a 0a 09 09 09 2f 2a 20 58 58 58 3a 20  -1;...../* XXX: 
1c510 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
1c520 20 2a 2f 0a 0a 09 09 09 69 66 20 28 73 69 67 62   */.....if (sigb
1c530 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
1c540 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
1c550 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  ed. */.....retva
1c560 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1c570 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65  ERROR;....} else
1c580 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
1c590 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
1c5a0 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
1c5b0 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
1c5c0 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
1c5d0 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
1c5e0 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
1c5f0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
1c600 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
1c610 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
1c620 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1c630 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
1c640 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
1c650 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
1c660 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
1c670 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
1c680 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
1c690 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
1c6a0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
1c6b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
1c6c0 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
1c6d0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
1c6e0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
1c6f0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
1c700 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
1c710 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f   Accumulate into
1c720 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a   a SHA1 hash */.
1c730 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1c740 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1c750 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
1c760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c770 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1c780 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1c790 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1c7a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c7b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65  PPORTED);.....re
1c7c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1c7d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1c7e0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
1c7f0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73  .if (terminate_s
1c800 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63  ign) {...if (cac
1c810 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1c820 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
1c830 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
1c840 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1c850 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a  ion].sign_buf);.
1c860 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ..}....cackey_se
1c870 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1c880 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
1c890 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1c8a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1c8b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1c8c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1c8d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1c8e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1c8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c900 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1c910 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1c920 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1c930 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1c940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c950 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
1c960 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
1c970 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1c980 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c990 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c9a0 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29  SignRecoverInit)
1c9b0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1c9c0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1c9d0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1c9e0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1c9f0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1ca00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1ca10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1ca20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ca30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ca40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ca50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ca60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ca70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ca80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ca90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1caa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cab0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1cac0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1cad0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1cae0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1caf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1cb00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1cb10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1cb20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1cb30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1cb40 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
1cb50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1cb60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1cb70 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
1cb80 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
1cb90 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1cba0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
1cbb0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
1cbc0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
1cbd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cbe0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cbf0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cc00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cc10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cc20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1cc30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cc40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1cc50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1cc60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1cc70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cc80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1cc90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1cca0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1ccb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ccc0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1ccd0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1cce0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ccf0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1cd00 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
1cd10 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45  erifyInit)(CK_SE
1cd20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1cd30 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1cd40 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1cd50 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1cd60 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
1cd70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cd80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cd90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cda0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cdb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cdc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1cdd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cde0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1cdf0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ce00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1ce10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ce20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1ce30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ce40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1ce50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ce60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1ce70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1ce80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ce90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1cea0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
1ceb0 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f  erify)(CK_SESSIO
1cec0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1ced0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1cee0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
1cef0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
1cf00 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
1cf10 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
1cf20 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
1cf30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cf40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cf50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cf60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cf70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cf80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1cf90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cfa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1cfb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1cfc0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1cfd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cfe0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1cff0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1d000 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1d010 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1d020 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1d030 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1d040 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1d050 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1d060 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
1d070 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
1d080 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1d090 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1d0a0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1d0b0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
1d0c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1d0d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d0e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d0f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d110 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d120 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d130 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d140 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d150 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d170 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d180 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d190 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1d1a0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1d1b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1d1c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1d1d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1d1e0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1d1f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d200 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29  , C_VerifyFinal)
1d210 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1d220 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1d230 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
1d240 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
1d250 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
1d260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d270 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1d280 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1d290 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1d2a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d2b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1d2c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1d2d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1d2e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1d2f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1d300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d310 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1d320 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1d330 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1d340 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d350 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1d360 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1d370 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d380 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d390 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d3a0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
1d3b0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
1d3c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1d3d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
1d3e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
1d3f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1d400 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
1d410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d420 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1d430 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d440 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d460 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d470 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d480 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d490 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d4a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d4b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d4c0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1d4d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1d4e0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1d4f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1d500 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1d510 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1d520 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1d530 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1d540 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
1d550 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
1d560 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1d570 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1d580 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
1d590 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
1d5a0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1d5b0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1d5c0 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29  _PTR pulDataLen)
1d5d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1d5e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1d5f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1d600 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1d610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d630 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1d640 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d650 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1d660 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1d670 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d680 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d690 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1d6a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1d6b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1d6c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1d6d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1d6e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1d6f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1d700 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d710 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79  V, C_DigestEncry
1d720 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
1d730 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1d740 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
1d750 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
1d760 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
1d770 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
1d780 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
1d790 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
1d7a0 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
1d7b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d7c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1d7d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1d7e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1d7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d800 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1d810 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1d820 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1d830 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1d840 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1d850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d860 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1d870 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1d880 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1d890 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1d8a0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1d8b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1d8c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1d8d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1d8e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
1d8f0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
1d900 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1d910 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1d920 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1d930 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
1d940 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
1d950 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
1d960 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
1d970 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
1d980 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1d990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d9a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1d9b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d9c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d9d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d9e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d9f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1da00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1da10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1da20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1da30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1da40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1da50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1da60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1da70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1da80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1da90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1daa0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1dab0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1dac0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63  CK_RV, C_SignEnc
1dad0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
1dae0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1daf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
1db00 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
1db10 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
1db20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
1db30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
1db40 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
1db50 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
1db60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1db70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1db80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1db90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1dba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dbb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1dbc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1dbd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1dbe0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1dbf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1dc00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dc10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1dc20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1dc30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1dc40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1dc50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1dc60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1dc70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1dc80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1dc90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1dca0 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
1dcb0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
1dcc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1dcd0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
1dce0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
1dcf0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
1dd00 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
1dd10 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
1dd20 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
1dd30 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
1dd40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1dd50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1dd60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1dd70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1dd80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1dd90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1dda0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ddb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ddc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ddd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1dde0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1ddf0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1de00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1de10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1de20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1de30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1de40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1de50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1de60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1de70 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
1de80 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  ateKey)(CK_SESSI
1de90 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1dea0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1deb0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1dec0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
1ded0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
1dee0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
1def0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1df00 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
1df10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1df20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1df30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1df40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1df50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1df60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1df70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1df80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1df90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1dfa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1dfb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dfc0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1dfd0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1dfe0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1dff0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e000 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1e010 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1e020 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1e030 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1e040 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1e050 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28  enerateKeyPair)(
1e060 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1e070 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
1e080 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
1e090 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
1e0a0 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69  IBUTE_PTR pPubli
1e0b0 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  cKeyTemplate, CK
1e0c0 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b  _ULONG ulPublicK
1e0d0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
1e0e0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
1e0f0 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65  TR pPrivateKeyTe
1e100 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
1e110 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74   ulPrivateKeyAtt
1e120 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
1e130 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
1e140 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43  R phPublicKey, C
1e150 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1e160 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79  PTR phPrivateKey
1e170 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1e180 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1e190 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1e1a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1e1b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e1c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e1d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1e1e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e1f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1e200 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1e210 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e220 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1e230 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1e240 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1e250 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1e260 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1e270 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1e280 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1e290 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1e2a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1e2b0 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43  RV, C_WrapKey)(C
1e2c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1e2d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1e2e0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1e2f0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
1e300 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69  T_HANDLE hWrappi
1e310 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  ngKey, CK_OBJECT
1e320 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b  _HANDLE hKey, CK
1e330 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
1e340 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  edKey, CK_ULONG_
1e350 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65  PTR pulWrappedKe
1e360 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  yLen) {..CACKEY_
1e370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1e380 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1e390 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1e3a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1e3b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e3c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1e3d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1e3e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1e3f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e400 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1e410 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1e420 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1e430 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1e440 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
1e450 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1e460 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1e470 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e480 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
1e490 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1e4a0 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70  (CK_RV, C_Unwrap
1e4b0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
1e4c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1e4d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
1e4e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
1e4f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1e500 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43  UnwrappingKey, C
1e510 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
1e520 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
1e530 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e   ulWrappedKeyLen
1e540 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
1e550 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
1e560 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
1e570 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
1e580 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
1e590 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
1e5a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1e5b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1e5c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1e5d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1e5e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e5f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1e600 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1e610 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1e620 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1e630 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1e640 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1e650 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1e660 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1e670 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1e680 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1e690 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1e6a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e6b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1e6c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e6d0 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b  CK_RV, C_DeriveK
1e6e0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
1e6f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1e700 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
1e710 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
1e720 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42  OBJECT_HANDLE hB
1e730 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49  aseKey, CK_ATTRI
1e740 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
1e750 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
1e760 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
1e770 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
1e780 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
1e790 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e7a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1e7b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e7c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e7d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e7e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e7f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e800 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e810 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e820 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1e830 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e840 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1e850 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e860 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1e870 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1e880 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1e890 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1e8a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1e8b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1e8c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
1e8d0 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  eedRandom)(CK_SE
1e8e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1e8f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1e900 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f  TR pSeed, CK_ULO
1e910 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a  NG ulSeedLen) {.
1e920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e930 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e940 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1e950 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1e960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e970 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1e980 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1e990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1e9a0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1e9b0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1e9c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e9d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e9e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1e9f0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1ea00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ea10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1ea20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1ea30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ea40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ea50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ea60 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
1ea70 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1ea80 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1ea90 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f  _BYTE_PTR pRando
1eaa0 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  mData, CK_ULONG 
1eab0 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09  ulRandomLen) {..
1eac0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ead0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1eae0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1eaf0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1eb00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb10 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1eb20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1eb30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1eb40 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1eb50 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1eb60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1eb80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1eb90 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1eba0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ebb0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1ebc0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1ebd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1ebe0 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  ;.}../* Deprecat
1ebf0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
1ec00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1ec10 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
1ec20 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b  nctionStatus)(CK
1ec30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1ec40 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
1ec50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
1ec70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ec80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ec90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
1eca0 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
1ecb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ecc0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
1ecd0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1ece0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
1ecf0 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
1ed00 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
1ed10 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
1ed20 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
1ed30 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
1ed40 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
1ed50 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ed60 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  RV, C_CancelFunc
1ed70 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tion)(CK_SESSION
1ed80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1ed90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1eda0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1edb0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
1edc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1edd0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
1ede0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
1edf0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1ee00 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
1ee10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1ee20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
1ee30 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
1ee40 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
1ee50 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
1ee60 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
1ee70 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
1ee80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1ee90 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  , C_GetFunctionL
1eea0 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e  ist)(CK_FUNCTION
1eeb0 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70  _LIST_PTR_PTR pp
1eec0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a  FunctionList) {.
1eed0 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  .CK_FUNCTION_LIS
1eee0 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c  T_PTR pFunctionL
1eef0 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
1ef00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ef10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46  ed.");...if (ppF
1ef20 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e  unctionList == N
1ef30 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1ef40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ef50 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c  ror. ppFunctionL
1ef60 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ist is NULL.");.
1ef70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1ef80 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1ef90 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
1efa0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
1efb0 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  (*pFunctionList)
1efc0 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  );...pFunctionLi
1efd0 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f  st->version.majo
1efe0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
1eff0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
1f000 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
1f010 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f;..pFunctionLis
1f020 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  t->version.minor
1f030 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
1f040 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
1f050 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
1f060 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
1f070 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d  ->C_Initialize =
1f080 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09   C_Initialize;..
1f090 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f0a0 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69  _Finalize = C_Fi
1f0b0 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  nalize;..pFuncti
1f0c0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66  onList->C_GetInf
1f0d0 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09  o = C_GetInfo;..
1f0e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f0f0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43  _GetSlotList = C
1f100 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70  _GetSlotList;..p
1f110 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f120 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f  GetSlotInfo = C_
1f130 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46  GetSlotInfo;..pF
1f140 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
1f150 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f  etTokenInfo = C_
1f160 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70  GetTokenInfo;..p
1f170 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f180 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
1f190 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74   = C_WaitForSlot
1f1a0 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f  Event;..pFunctio
1f1b0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
1f1c0 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65  anismList = C_Ge
1f1d0 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a  tMechanismList;.
1f1e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f1f0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
1f200 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  fo = C_GetMechan
1f210 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ismInfo;..pFunct
1f220 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54  ionList->C_InitT
1f230 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b  oken = C_InitTok
1f240 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  en;..pFunctionLi
1f250 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20  st->C_InitPIN = 
1f260 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e  C_InitPIN;..pFun
1f270 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
1f280 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a  PIN = C_SetPIN;.
1f290 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f2a0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20  C_OpenSession = 
1f2b0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09  C_OpenSession;..
1f2c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f2d0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20  _CloseSession = 
1f2e0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a  C_CloseSession;.
1f2f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f300 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
1f310 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  ns = C_CloseAllS
1f320 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74  essions;..pFunct
1f330 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65  ionList->C_GetSe
1f340 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  ssionInfo = C_Ge
1f350 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70  tSessionInfo;..p
1f360 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f370 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
1f380 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69  e = C_GetOperati
1f390 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
1f3a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70  ionList->C_SetOp
1f3b0 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
1f3c0 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
1f3d0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
1f3e0 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f  st->C_Login = C_
1f3f0 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  Login;..pFunctio
1f400 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20  nList->C_Logout 
1f410 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75  = C_Logout;..pFu
1f420 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72  nctionList->C_Cr
1f430 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43  eateObject = C_C
1f440 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46  reateObject;..pF
1f450 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
1f460 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f  opyObject = C_Co
1f470 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  pyObject;..pFunc
1f480 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74  tionList->C_Dest
1f490 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65  royObject = C_De
1f4a0 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46  stroyObject;..pF
1f4b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
1f4c0 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43  etObjectSize = C
1f4d0 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a  _GetObjectSize;.
1f4e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f4f0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
1f500 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69  lue = C_GetAttri
1f510 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
1f520 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
1f530 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
1f540 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
1f550 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
1f560 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
1f570 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64  ctsInit = C_Find
1f580 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46  ObjectsInit;..pF
1f590 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
1f5a0 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46  indObjects = C_F
1f5b0 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75  indObjects;..pFu
1f5c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
1f5d0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d  ndObjectsFinal =
1f5e0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
1f5f0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
1f600 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e  ist->C_EncryptIn
1f610 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e  it = C_EncryptIn
1f620 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
1f630 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20  st->C_Encrypt = 
1f640 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e  C_Encrypt;..pFun
1f650 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
1f660 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45  ryptUpdate = C_E
1f670 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
1f680 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f690 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43  EncryptFinal = C
1f6a0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09  _EncryptFinal;..
1f6b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f6c0 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _DecryptInit = C
1f6d0 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _DecryptInit;..p
1f6e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f6f0 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72  Decrypt = C_Decr
1f700 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
1f710 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70  ist->C_DecryptUp
1f720 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
1f730 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
1f740 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
1f750 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79  tFinal = C_Decry
1f760 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
1f770 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
1f780 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74  tInit = C_Digest
1f790 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
1f7a0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d  List->C_Digest =
1f7b0 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e   C_Digest;..pFun
1f7c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
1f7d0 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69  estUpdate = C_Di
1f7e0 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
1f7f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
1f800 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65  gestKey = C_Dige
1f810 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  stKey;..pFunctio
1f820 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46  nList->C_DigestF
1f830 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46  inal = C_DigestF
1f840 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
1f850 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74  List->C_SignInit
1f860 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09   = C_SignInit;..
1f870 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f880 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a  _Sign = C_Sign;.
1f890 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f8a0 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43  C_SignUpdate = C
1f8b0 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46  _SignUpdate;..pF
1f8c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
1f8d0 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67  ignFinal = C_Sig
1f8e0 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  nFinal;..pFuncti
1f8f0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
1f900 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69  coverInit = C_Si
1f910 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  gnRecoverInit;..
1f920 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1f930 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43  _SignRecover = C
1f940 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70  _SignRecover;..p
1f950 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1f960 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56  VerifyInit = C_V
1f970 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e  erifyInit;..pFun
1f980 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
1f990 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a  ify = C_Verify;.
1f9a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1f9b0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  C_VerifyUpdate =
1f9c0 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b   C_VerifyUpdate;
1f9d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
1f9e0 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d  >C_VerifyFinal =
1f9f0 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a   C_VerifyFinal;.
1fa00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1fa10 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
1fa20 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65  nit = C_VerifyRe
1fa30 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
1fa40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
1fa50 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56  ifyRecover = C_V
1fa60 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70  erifyRecover;..p
1fa70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1fa80 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
1fa90 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e  ate = C_DigestEn
1faa0 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
1fab0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
1fac0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
1fad0 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69  te = C_DecryptDi
1fae0 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
1faf0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
1fb00 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  gnEncryptUpdate 
1fb10 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  = C_SignEncryptU
1fb20 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
1fb30 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
1fb40 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
1fb50 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
1fb60 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
1fb70 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
1fb80 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  Key = C_Generate
1fb90 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
1fba0 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
1fbb0 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72  eyPair = C_Gener
1fbc0 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75  ateKeyPair;..pFu
1fbd0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72  nctionList->C_Wr
1fbe0 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65  apKey = C_WrapKe
1fbf0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
1fc00 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d  t->C_UnwrapKey =
1fc10 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70   C_UnwrapKey;..p
1fc20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1fc30 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65  DeriveKey = C_De
1fc40 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  riveKey;..pFunct
1fc50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52  ionList->C_SeedR
1fc60 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61  andom = C_SeedRa
1fc70 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
1fc80 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
1fc90 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72  Random = C_Gener
1fca0 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  ateRandom;..pFun
1fcb0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
1fcc0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d  FunctionStatus =
1fcd0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
1fce0 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  atus;..pFunction
1fcf0 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75  List->C_CancelFu
1fd00 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65  nction = C_Cance
1fd10 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e  lFunction;..pFun
1fd20 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
1fd30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43  FunctionList = C
1fd40 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
1fd50 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c  ;...*ppFunctionL
1fd60 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  ist = pFunctionL
1fd70 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
1fd80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fd90 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1fda0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1fdb0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1fdc0 0a 0a                                            ..