Hex Artifact Content

Artifact 80414011fe51ef9431e89287547ae7d1dc447056:


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 62 75 66  signed char *buf
12a0: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
12b0: 69 64 78 3b 20 62 75 66 20 3d 20 28 75 6e 73 69  idx; buf = (unsi
12c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 28 78 29  gned char *) (x)
12d0: 3b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ; fprintf(stderr
12e0: 2c 20 22 25 73 28 29 3a 20 25 73 20 20 28 25 73  , "%s(): %s  (%s
12f0: 2f 25 6c 75 20 3d 20 7b 25 30 32 78 22 2c 20 5f  /%lu = {%02x", _
1300: 5f 66 75 6e 63 5f 5f 2c 20 66 2c 20 23 78 2c 20  _func__, f, #x, 
1310: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1320: 28 79 29 2c 20 62 75 66 5b 30 5d 29 3b 20 66 6f  (y), buf[0]); fo
1330: 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
1340: 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20  < (y); idx++) { 
1350: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1360: 22 2c 20 25 30 32 78 22 2c 20 62 75 66 5b 69 64  ", %02x", buf[id
1370: 78 5d 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28  x]); }; fprintf(
1380: 73 74 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b  stderr, "})\n");
1390: 20 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43   }.#  define CAC
13a0: 4b 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52  KEY_DEBUG_PERROR
13b0: 28 78 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74  (x) { fprintf(st
13c0: 64 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20  derr, "%s(): ", 
13d0: 5f 5f 66 75 6e 63 5f 5f 29 3b 20 70 65 72 72 6f  __func__); perro
13e0: 72 28 78 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e  r(x); }.#  defin
13f0: 65 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b  e free(x) { CACK
1400: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1410: 22 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c  "FREE(%p) (%s)",
1420: 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29   x, #x); free(x)
1430: 3b 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ; }..static void
1440: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
1450: 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f  UNC_MALLOC(size_
1460: 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68  t size, const ch
1470: 61 72 20 2a 66 75 6e 63 29 20 7b 0a 09 76 6f 69  ar *func) {..voi
1480: 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74  d *retval;...ret
1490: 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  val = malloc(siz
14a0: 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 73 74  e);...fprintf(st
14b0: 64 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20  derr, "%s(): ", 
14c0: 66 75 6e 63 29 3b 0a 09 66 70 72 69 6e 74 66 28  func);..fprintf(
14d0: 73 74 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28  stderr, "MALLOC(
14e0: 29 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29  ) = %p", retval)
14f0: 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
1500: 72 2c 20 22 5c 6e 22 29 3b 0a 0a 09 72 65 74 75  r, "\n");...retu
1510: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
1520: 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b  tatic void *CACK
1530: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45  EY_DEBUG_FUNC_RE
1540: 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c  ALLOC(void *ptr,
1550: 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f   size_t size, co
1560: 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 29 20  nst char *func) 
1570: 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b  {..void *retval;
1580: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
1590: 6c 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a  loc(ptr, size);.
15a0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
15b0: 70 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66  ptr) {...fprintf
15c0: 28 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 20  (stderr, "%s(): 
15d0: 22 2c 20 66 75 6e 63 29 3b 0a 09 09 66 70 72 69  ", func);...fpri
15e0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 52 45 41  ntf(stderr, "REA
15f0: 4c 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20  LLOC(%p) = %p", 
1600: 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09  ptr, retval);...
1610: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
1620: 22 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  "\n");..}...retu
1630: 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
1640: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1650: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
1660: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75  UNC_TAG_TO_STR(u
1670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
1680: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67  ) {..switch (tag
1690: 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ) {...case GSCIS
16a0: 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09  _TAG_CARDID:....
16b0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
16c0: 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61  G_CARDID");...ca
16d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43  se GSCIS_TAG_CCC
16e0: 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  _VER:....return(
16f0: 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56  "GSCIS_TAG_CCC_V
1700: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ER");...case GSC
1710: 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a  IS_TAG_CCG_VER:.
1720: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1730: 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a  _TAG_CCG_VER");.
1740: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1750: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74  _CARDURL:....ret
1760: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
1770: 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65  ARDURL");...case
1780: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
1790: 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  5:....return("GS
17a0: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29  CIS_TAG_PKCS15")
17b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
17c0: 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45  AG_REG_DATA_MODE
17d0: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  L:....return("GS
17e0: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
17f0: 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65  _MODEL");...case
1800: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
1810: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
1820: 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54  "GSCIS_TAG_ACR_T
1830: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ABLE");...case G
1840: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50  SCIS_TAG_CARD_AP
1850: 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  DU:....return("G
1860: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50  SCIS_TAG_CARD_AP
1870: 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DU");...case GSC
1880: 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49  IS_TAG_REDIRECTI
1890: 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ON:....return("G
18a0: 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43  SCIS_TAG_REDIREC
18b0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  TION");...case G
18c0: 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09  SCIS_TAG_CT:....
18d0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
18e0: 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47  G_CT");...case G
18f0: 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09  SCIS_TAG_ST:....
1900: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1910: 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47  G_ST");...case G
1920: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43  SCIS_TAG_NEXTCCC
1930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1940: 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29  IS_TAG_NEXTCCC")
1950: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1960: 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_FNAME:....ret
1970: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46  urn("GSCIS_TAG_F
1980: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
1990: 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a  SCIS_TAG_MNAME:.
19a0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
19b0: 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09  _TAG_MNAME");...
19c0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c  case GSCIS_TAG_L
19d0: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
19e0: 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45  "GSCIS_TAG_LNAME
19f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1a00: 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09  _TAG_SUFFIX:....
1a10: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1a20: 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61  G_SUFFIX");...ca
1a30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56  se GSCIS_TAG_GOV
1a40: 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74  T_AGENCY:....ret
1a50: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47  urn("GSCIS_TAG_G
1a60: 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09  OVT_AGENCY");...
1a70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42  case GSCIS_TAG_B
1a80: 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e  UREAU:....return
1a90: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  ("GSCIS_TAG_BURE
1aa0: 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  AU");...case GSC
1ab0: 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f  IS_TAG_BUREAU_CO
1ac0: 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  DE:....return("G
1ad0: 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f  SCIS_TAG_BUREAU_
1ae0: 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CODE");...case G
1af0: 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f  SCIS_TAG_DEPT_CO
1b00: 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  DE:....return("G
1b10: 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f  SCIS_TAG_DEPT_CO
1b20: 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DE");...case GSC
1b30: 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09  IS_TAG_TITLE:...
1b40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
1b50: 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61  AG_TITLE");...ca
1b60: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49  se GSCIS_TAG_BUI
1b70: 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e  LDING:....return
1b80: 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  ("GSCIS_TAG_BUIL
1b90: 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47  DING");...case G
1ba0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1bb0: 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR1:....return
1bc0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1bd0: 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61  CE_ADDR1");...ca
1be0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
1bf0: 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65  ICE_ADDR2:....re
1c00: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1c10: 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a  OFFICE_ADDR2");.
1c20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
1c30: 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09  _OFFICE_CITY:...
1c40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
1c50: 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29  AG_OFFICE_CITY")
1c60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1c70: 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a  AG_OFFICE_STATE:
1c80: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
1c90: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41  S_TAG_OFFICE_STA
1ca0: 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TE");...case GSC
1cb0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
1cc0: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  P:....return("GS
1cd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
1ce0: 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IP");...case GSC
1cf0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f  IS_TAG_OFFICE_CO
1d00: 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  UNTRY:....return
1d10: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
1d20: 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09  CE_COUNTRY");...
1d30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1d40: 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09  FFICE_PHONE:....
1d50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1d60: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29  G_OFFICE_PHONE")
1d70: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1d80: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f  AG_OFFICE_PHONE_
1d90: 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  EXT:....return("
1da0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
1db0: 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09  _PHONE_EXT");...
1dc0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1dd0: 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65  FFICE_FAX:....re
1de0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1df0: 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09  OFFICE_FAX");...
1e00: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
1e10: 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09  FFICE_EMAIL:....
1e20: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1e30: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29  G_OFFICE_EMAIL")
1e40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1e50: 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a  AG_OFFICE_ROOM:.
1e60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1e70: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d  _TAG_OFFICE_ROOM
1e80: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1e90: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
1ea0: 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  CY:....return("G
1eb0: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
1ec0: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
1ed0: 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44   GSCIS_TAG_SSN_D
1ee0: 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65  ESIGNATOR:....re
1ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
1f00: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29  SSN_DESIGNATOR")
1f10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
1f20: 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72  AG_SSN:....retur
1f30: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e  n("GSCIS_TAG_SSN
1f40: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
1f50: 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74  _TAG_DOB:....ret
1f60: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44  urn("GSCIS_TAG_D
1f70: 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  OB");...case GSC
1f80: 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09  IS_TAG_GENDER:..
1f90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1fa0: 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09  TAG_GENDER");...
1fb0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55  case GSCIS_TAG_U
1fc0: 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  SERID:....return
1fd0: 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52  ("GSCIS_TAG_USER
1fe0: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
1ff0: 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09  IS_TAG_DOMAIN:..
2000: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2010: 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09  TAG_DOMAIN");...
2020: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50  case GSCIS_TAG_P
2030: 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75  ASSWORD:....retu
2040: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41  rn("GSCIS_TAG_PA
2050: 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65  SSWORD");...case
2060: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
2070: 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RID:....return("
2080: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2090: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
20a0: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09  IS_TAG_SERNO:...
20b0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
20c0: 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61  AG_SERNO");...ca
20d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53  se GSCIS_TAG_ISS
20e0: 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  UE_DATE:....retu
20f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53  rn("GSCIS_TAG_IS
2100: 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61  SUE_DATE");...ca
2110: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50  se GSCIS_TAG_EXP
2120: 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  IRE_DATE:....ret
2130: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45  urn("GSCIS_TAG_E
2140: 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09  XPIRE_DATE");...
2150: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2160: 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  ARD_TYPE:....ret
2170: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2180: 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  ARD_TYPE");...ca
2190: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43  se GSCIS_TAG_SEC
21a0: 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72  URITY_CODE:....r
21b0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
21c0: 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29  _SECURITY_CODE")
21d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
21e0: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09  AG_CARDID_AID:..
21f0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2200: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29  TAG_CARDID_AID")
2210: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2220: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
2230: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2240: 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
2250: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2260: 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f  _TAG_CERT_ISSUE_
2270: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2280: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
2290: 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09  ISSUE_DATE");...
22a0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
22b0: 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a  ERT_EXPIRE_DATE:
22c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
22d0: 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52  S_TAG_CERT_EXPIR
22e0: 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72  E_DATE");..}...r
22f0: 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29  eturn("UNKNOWN")
2300: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
2310: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
2320: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
2330: 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72  RR_TO_STR(LONG r
2340: 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63  etcode) {..switc
2350: 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09  h (retcode) {...
2360: 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43  case SCARD_S_SUC
2370: 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  CESS:....return(
2380: 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53  "SCARD_S_SUCCESS
2390: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
23a0: 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09  _E_CANCELLED:...
23b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
23c0: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
23d0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e  case SCARD_E_CAN
23e0: 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65  T_DISPOSE:....re
23f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41  turn("SCARD_E_CA
2400: 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09  NT_DISPOSE");...
2410: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53  case SCARD_E_INS
2420: 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52  UFFICIENT_BUFFER
2430: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2440: 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
2450: 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61  T_BUFFER");...ca
2460: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
2470: 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72  ID_ATR:....retur
2480: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2490: 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65  ID_ATR");...case
24a0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
24b0: 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75  _HANDLE:....retu
24c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
24d0: 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09  LID_HANDLE");...
24e0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
24f0: 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a  ALID_PARAMETER:.
2500: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2510: 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d  _E_INVALID_PARAM
2520: 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ETER");...case S
2530: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54  CARD_E_INVALID_T
2540: 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e  ARGET:....return
2550: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2560: 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61  D_TARGET");...ca
2570: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
2580: 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  ID_VALUE:....ret
2590: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
25a0: 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09  ALID_VALUE");...
25b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
25c0: 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72  MEMORY:....retur
25d0: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45  n("SCARD_E_NO_ME
25e0: 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53  MORY");...case S
25f0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52  CARD_E_UNKNOWN_R
2600: 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  EADER:....return
2610: 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  ("SCARD_E_UNKNOW
2620: 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61  N_READER");...ca
2630: 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f  se SCARD_E_TIMEO
2640: 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  UT:....return("S
2650: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29  CARD_E_TIMEOUT")
2660: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2670: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
2680: 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ON:....return("S
2690: 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56  CARD_E_SHARING_V
26a0: 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61  IOLATION");...ca
26b0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  se SCARD_E_NO_SM
26c0: 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ARTCARD:....retu
26d0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
26e0: 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61  MARTCARD");...ca
26f0: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  se SCARD_E_UNKNO
2700: 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  WN_CARD:....retu
2710: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  rn("SCARD_E_UNKN
2720: 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  OWN_CARD");...ca
2730: 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  se SCARD_E_PROTO
2740: 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65  _MISMATCH:....re
2750: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52  turn("SCARD_E_PR
2760: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a  OTO_MISMATCH");.
2770: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
2780: 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74  OT_READY:....ret
2790: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54  urn("SCARD_E_NOT
27a0: 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65  _READY");...case
27b0: 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f   SCARD_E_SYSTEM_
27c0: 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65  CANCELLED:....re
27d0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59  turn("SCARD_E_SY
27e0: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29  STEM_CANCELLED")
27f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2800: 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a  _NOT_TRANSACTED:
2810: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2820: 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54  D_E_NOT_TRANSACT
2830: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
2840: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56  RD_E_READER_UNAV
2850: 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  AILABLE:....retu
2860: 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44  rn("SCARD_E_READ
2870: 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29  ER_UNAVAILABLE")
2880: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
2890: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52  _UNSUPPORTED_CAR
28a0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
28b0: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
28c0: 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  D_CARD");...case
28d0: 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f   SCARD_W_UNRESPO
28e0: 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72  NSIVE_CARD:....r
28f0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55  eturn("SCARD_W_U
2900: 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44  NRESPONSIVE_CARD
2910: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2920: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
2930: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2940: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
2950: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
2960: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
2970: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
2980: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
2990: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
29a0: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a  _W_REMOVED_CARD:
29b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
29c0: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
29d0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
29e0: 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c  _E_PCI_TOO_SMALL
29f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2a00: 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41  RD_E_PCI_TOO_SMA
2a10: 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LL");...case SCA
2a20: 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55  RD_E_READER_UNSU
2a30: 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75  PPORTED:....retu
2a40: 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44  rn("SCARD_E_READ
2a50: 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29  ER_UNSUPPORTED")
2a60: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2a70: 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45  _DUPLICATE_READE
2a80: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
2a90: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
2aa0: 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65  READER");...case
2ab0: 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e   SCARD_E_CARD_UN
2ac0: 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65  SUPPORTED:....re
2ad0: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41  turn("SCARD_E_CA
2ae0: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29  RD_UNSUPPORTED")
2af0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
2b00: 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09  _NO_SERVICE:....
2b10: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2b20: 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09  NO_SERVICE");...
2b30: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52  case SCARD_E_SER
2b40: 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09  VICE_STOPPED:...
2b50: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
2b60: 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44  _SERVICE_STOPPED
2b70: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
2b80: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
2b90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2ba0: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
2bb0: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
2bc0: 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_E_UNSUPPORTED
2bd0: 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74  _FEATURE:....ret
2be0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53  urn("SCARD_E_UNS
2bf0: 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45  UPPORTED_FEATURE
2c00: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
2c10: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
2c20: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2c30: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
2c40: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
2c50: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
2c60: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
2c70: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
2c80: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
2c90: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
2ca0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
2cb0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
2cc0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
2cd0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
2ce0: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
2cf0: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
2d00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2d10: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
2d20: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
2d30: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
2d40: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2d50: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
2d60: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
2d70: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2d80: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
2d90: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
2da0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2db0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
2dc0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
2dd0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
2de0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2df0: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
2e00: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
2e10: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
2e20: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2e30: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
2e40: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
2e50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
2e60: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
2e70: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
2e80: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
2e90: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2ea0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
2eb0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
2ec0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
2ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2ee0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
2ef0: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
2f00: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
2f10: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
2f20: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
2f30: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
2f40: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
2f50: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2f60: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
2f70: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
2f80: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
2f90: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
2fa0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
2fb0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
2fc0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
2fd0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
2fe0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
2ff0: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3000: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3010: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3020: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3030: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3040: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3050: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3060: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3070: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3080: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3090: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
30a0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
30b0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
30c0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
30d0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
30e0: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
30f0: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3100: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3110: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3120: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3130: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3140: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3150: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3160: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3170: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3180: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3190: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
31a0: 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f  .#  define mallo
31b0: 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55  c(x) CACKEY_DEBU
31c0: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c  G_FUNC_MALLOC(x,
31d0: 20 5f 5f 66 75 6e 63 5f 5f 29 0a 23 20 20 64 65   __func__).#  de
31e0: 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20  fine realloc(x, 
31f0: 79 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  y) CACKEY_DEBUG_
3200: 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20  FUNC_REALLOC(x, 
3210: 79 2c 20 5f 5f 66 75 6e 63 5f 5f 29 0a 23 65 6c  y, __func__).#el
3220: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  se.#  define CAC
3230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
3240: 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64  (x...) /**/.#  d
3250: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
3260: 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78  UG_PRINTBUF(f, x
3270: 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  , y) /**/.#  def
3280: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
3290: 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a  _PERROR(x) /**/.
32a0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
32b0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
32c0: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
32d0: 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65  _DISABLED".#  de
32e0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
32f0: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
3300: 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47  TO_STR(x) "DEBUG
3310: 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65  _DISABLED".#  de
3320: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
3330: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
3340: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
3350: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
3360: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
3370: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
3380: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
3390: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73  ABLED".#endif..s
33a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
33b0: 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e  c_identity {..un
33c0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c  signed char appl
33d0: 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74  et[7];..uint16_t
33e0: 20 66 69 6c 65 3b 0a 0a 09 75 6e 73 69 67 6e 65   file;...unsigne
33f0: 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a  d char *label;..
3400: 09 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  .size_t certific
3410: 61 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e  ate_len;..unsign
3420: 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69  ed char *certifi
3430: 63 61 74 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  cate;.};..struct
3440: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3450: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
3460: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
3470: 2a 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f  *identity;...CK_
3480: 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69  ATTRIBUTE *attri
3490: 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  butes;..CK_ULONG
34a0: 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e   attributes_coun
34b0: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  t;.};..struct ca
34c0: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09  ckey_session {..
34d0: 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b  int active;...CK
34e0: 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
34f0: 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74  ...CK_STATE stat
3500: 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61  e;..CK_FLAGS fla
3510: 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  gs;..CK_ULONG ul
3520: 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b  DeviceError;..CK
3530: 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
3540: 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49  cation;..CK_NOTI
3550: 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72  FY Notify;...str
3560: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
3570: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b  ity *identities;
3580: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3590: 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
35a0: 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61  ;...int search_a
35b0: 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49  ctive;..CK_ATTRI
35c0: 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f  BUTE_PTR search_
35d0: 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  query;..CK_ULONG
35e0: 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f   search_query_co
35f0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  unt;..unsigned l
3600: 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f  ong search_curr_
3610: 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61  id;...int sign_a
3620: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
3630: 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d  NISM_TYPE sign_m
3640: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59  echanism;..CK_BY
3650: 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b  TE_PTR sign_buf;
3660: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
3670: 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e  sign_buflen;..un
3680: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
3690: 5f 62 75 66 75 73 65 64 3b 0a 0a 09 69 6e 74 20  _bufused;...int 
36a0: 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 3b 0a  decrypt_active;.
36b0: 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59  .CK_MECHANISM_TY
36c0: 50 45 20 64 65 63 72 79 70 74 5f 6d 65 63 68 61  PE decrypt_mecha
36d0: 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  nism;..CK_VOID_P
36e0: 54 52 20 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  TR decrypt_mech_
36f0: 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  parm;..CK_ULONG 
3700: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
3710: 6d 6c 65 6e 3b 0a 0a 7d 3b 0a 0a 73 74 72 75 63  mlen;..};..struc
3720: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a  t cackey_slot {.
3730: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 63  .int active;...c
3740: 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
3750: 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61 72  ;...int pcsc_car
3760: 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43  d_connected;..SC
3770: 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f 63  ARDHANDLE pcsc_c
3780: 61 72 64 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  ard;.};..typedef
3790: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
37a0: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
37b0: 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f  = 0x01,..CACKEY_
37c0: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20  TLV_APP_SKI     
37d0: 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f  = 0x02,..CACKEY_
37e0: 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20  TLV_APP_PKI     
37f0: 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f  = 0x04.} cackey_
3800: 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79  tlv_apptype;..ty
3810: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
3820: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
3830: 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20  ENERALINFO      
3840: 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b   = 0x2000,..CACK
3850: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
3860: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d  PERSONALINFO   =
3870: 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59   0x2100,..CACKEY
3880: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
3890: 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30  SCONTROL     = 0
38a0: 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x3000,..CACKEY_T
38b0: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20  LV_OBJID_LOGIN  
38c0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34             = 0x4
38d0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
38e0: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20  _OBJID_CARDINFO 
38f0: 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30           = 0x500
3900: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
3910: 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20  BJID_BIOMETRICS 
3920: 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c         = 0x6000,
3930: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
3940: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
3950: 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09  T    = 0x7000,..
3960: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3970: 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20  _CAC_PERSON     
3980: 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41     = 0x0200,..CA
3990: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
39a0: 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20  AC_BENEFITS     
39b0: 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b   = 0x0202,..CACK
39c0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
39d0: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d  _OTHERBENEFITS =
39e0: 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59   0x0203,..CACKEY
39f0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
3a00: 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30  ERSONNEL     = 0
3a10: 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54  x0201,..CACKEY_T
3a20: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3a30: 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30  CERT       = 0x0
3a40: 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  2FE.} cackey_tlv
3a50: 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 73 74 72 75  _objectid;..stru
3a60: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
3a70: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65  rdurl {..unsigne
3a80: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69  d char        ri
3a90: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  d[5];..cackey_tl
3aa0: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74  v_apptype   appt
3ab0: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  ype;..cackey_tlv
3ac0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63  _objectid  objec
3ad0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  tid;..cackey_tlv
3ae0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64  _objectid  appid
3af0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
3b00: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d          pinid;.}
3b10: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
3b20: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72  _tlv_entity;.str
3b30: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
3b40: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74  ntity {..uint8_t
3b50: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
3b60: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  ngth;...union {.
3b70: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09  ..void *value;..
3b80: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
3b90: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75  lv_cardurl *valu
3ba0: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e  e_cardurl;...uin
3bb0: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b  t8_t value_byte;
3bc0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ..};...struct ca
3bd0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
3be0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43  *_next;.};../* C
3bf0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e  ACKEY Global Han
3c00: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  dles */.static v
3c10: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c  oid *cackey_bigl
3c20: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ock = NULL;.stat
3c30: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
3c40: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f  _session cackey_
3c50: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73  sessions[128];.s
3c60: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
3c70: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f  key_slot cackey_
3c80: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74  slots[128];.stat
3c90: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e  ic int cackey_in
3ca0: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73  itialized = 0;.s
3cb0: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
3cc0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
3cd0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  0;.CK_C_INITIALI
3ce0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61  ZE_ARGS cackey_a
3cf0: 72 67 73 3b 0a 0a 2f 2a 20 50 43 53 43 20 47 6c  rgs;../* PCSC Gl
3d00: 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a  obal Handles */.
3d10: 73 74 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f  static LPSCARDCO
3d20: 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73  NTEXT cackey_pcs
3d30: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
3d40: 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
3d50: 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65  d long cackey_ge
3d60: 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b  tversion(void) {
3d70: 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
3d80: 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20  d long retval = 
3d90: 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  255;..unsigned l
3da0: 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09  ong major = 0;..
3db0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69  unsigned long mi
3dc0: 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a  nor = 0;..char *
3dd0: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c  major_str = NULL
3de0: 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73  ;..char *minor_s
3df0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43  tr = NULL;...CAC
3e00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
3e10: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
3e20: 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35  f (retval != 255
3e30: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
3e40: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
3e50: 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68  ning 0x%lx (cach
3e60: 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a  ed).", retval);.
3e70: 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
3e80: 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  );..}...retval =
3e90: 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b   0;..#ifdef PACK
3ea0: 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20  AGE_VERSION.    
3eb0: 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20      major_str = 
3ec0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b  PACKAGE_VERSION;
3ed0: 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29  ..if (major_str)
3ee0: 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f   {..        majo
3ef0: 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f  r = strtoul(majo
3f00: 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74  r_str, &minor_st
3f10: 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d  r, 10);....if (m
3f20: 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d  inor_str) {....m
3f30: 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  inor = strtoul(m
3f40: 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55  inor_str + 1, NU
3f50: 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a  LL, 10);...}..}.
3f60: 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f  ..retval = (majo
3f70: 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f  r << 16) | (mino
3f80: 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a  r << 8);.#endif.
3f90: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
3fa0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
3fb0: 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29   0x%lx", retval)
3fc0: 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
3fd0: 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20  l);.}../* PC/SC 
3fe0: 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  Related Function
3ff0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
4000: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
4010: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
4020: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
4030: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
4040: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
4050: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
4060: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
4070: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
4080: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
4090: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
40a0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
40b0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
40c0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
40d0: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
40e0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
40f0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
4100: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
4110: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
4120: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
4130: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
4140: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
4150: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
4160: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  ARD);...}....cac
4170: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
4180: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
4190: 65 64 20 3d 20 30 3b 0a 09 7d 0a 0a 09 43 41 43  ed = 0;..}...CAC
41a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
41b0: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
41c0: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
41d0: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 63  ic int cackey_pc
41e0: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
41f0: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65   {..LONG scard_e
4200: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  st_context_ret;.
4210: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
4220: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
4230: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61  .LONG scard_isva
4240: 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  lid_ret;.#endif.
4250: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4260: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
4270: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
4280: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
4290: 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
42a0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c  csc_handle = mal
42b0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
42c0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29  ey_pcsc_handle))
42d0: 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
42e0: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
42f0: 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
4300: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
4310: 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ll to malloc() f
4320: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
4330: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
4340: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
4350: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
4360: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
4370: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
4380: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
4390: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
43a0: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
43b0: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
43c0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
43d0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
43e0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
43f0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
4400: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
4410: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
4420: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4430: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
4440: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
4450: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
4460: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
4470: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
4480: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
4490: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
44a0: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
44b0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
44c0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
44d0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
44e0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
44f0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4500: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
4510: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
4520: 6c 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
4530: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
4540: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
4550: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  rn(-1);...}..}..
4560: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
4570: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
4580: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4590: 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c  INTF("SCardIsVal
45a0: 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  idContext() call
45b0: 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76  ed");..scard_isv
45c0: 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64  alid_ret = SCard
45d0: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a  IsValidContext(*
45e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
45f0: 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  le);..if (scard_
4600: 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53  isvalid_ret != S
4610: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
4620: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
4630: 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20  _PRINTF("Handle 
4640: 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  has become inval
4650: 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64  id (SCardIsValid
4660: 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69  Context = %s/%li
4670: 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  ), trying to re-
4680: 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43  establish...", C
4690: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
46a0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
46b0: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
46c0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
46d0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a  d_isvalid_ret);.
46e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
46f0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
4700: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
4710: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
4720: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4730: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
4740: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
4750: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
4760: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
4770: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
4780: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
4790: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
47a0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
47b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
47c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
47d0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
47e0: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
47f0: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
4800: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
4810: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
4820: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
4830: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
4840: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
4850: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
4860: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
4870: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
4880: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a  _pcsc_handle);..
4890: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
48a0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
48b0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
48c0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
48d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
48e0: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  ndle has been re
48f0: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a  -established");.
4900: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  .}.#endif...CACK
4910: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
4920: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  "Sucessfully con
4930: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c  nected to PC/SC,
4940: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75   returning in su
4950: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
4960: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55  n(0);.}../* APDU
4970: 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f   Related Functio
4980: 6e 73 20 2a 2f 0a 2f 2a 2a 20 4c 65 20 3d 20 30  ns */./** Le = 0
4990: 78 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  x00 to indicate 
49a0: 6e 6f 74 20 74 6f 20 73 65 6e 64 20 4c 65 20 2a  not to send Le *
49b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
49c0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
49d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
49e0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
49f0: 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e  d char class, un
4a00: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74  signed char inst
4a10: 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65  ruction, unsigne
4a20: 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67  d char p1, unsig
4a30: 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73  ned char p2, uns
4a40: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75  igned char lc, u
4a50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
4a60: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ta, unsigned cha
4a70: 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  r le, uint16_t *
4a80: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
4a90: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
4aa0: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
4ab0: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
4ac0: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
4ad0: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
4ae0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
4af0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
4b00: 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c  ..DWORD protocol
4b10: 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65  ;..DWORD xmit_le
4b20: 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f  n, recv_len;..LO
4b30: 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  NG scard_conn_re
4b40: 74 2c 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  t, scard_xmit_re
4b50: 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  t, scard_reconn_
4b60: 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f  ret;..BYTE xmit_
4b70: 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f  buf[1024], recv_
4b80: 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20  buf[1024];..int 
4b90: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
4ba0: 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72  , pcsc_getresp_r
4bb0: 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09  et;..int idx;...
4bc0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
4bd0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
4be0: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
4bf0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
4c00: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
4c10: 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29 3b  ot specified.");
4c20: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
4c30: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
4c40: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
4c50: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
4c60: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
4c70: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 43 41  _ret < 0) {...CA
4c80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4c90: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
4ca0: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 72   PC/SC failed, r
4cb0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
4cc0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
4cd0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f  (-1);..}.../* Co
4ce0: 6e 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c  nnect to reader,
4cf0: 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69   if needed */..i
4d00: 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  f (!slot->pcsc_c
4d10: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
4d20: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
4d30: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
4d40: 6e 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22  nect(%s) called"
4d50: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
4d60: 64 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f  der);...scard_co
4d70: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
4d80: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
4d90: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
4da0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
4db0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
4dc0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
4dd0: 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T0, &slot->pcsc
4de0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
4df0: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
4e00: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52  conn_ret != SCAR
4e10: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
4e20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4e30: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
4e40: 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64  n to card failed
4e50: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
4e60: 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e  ailure (SCardCon
4e70: 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29  nect() = %s/%li)
4e80: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
4e90: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
4ea0: 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  _STR(scard_conn_
4eb0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
4ec0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09  rd_conn_ret);...
4ed0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
4ee0: 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  }....slot->pcsc_
4ef0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
4f00: 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e   1;..}.../* Tran
4f10: 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65  smit */..xmit_le
4f20: 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66  n = 0;..xmit_buf
4f30: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63  [xmit_len++] = c
4f40: 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  lass;..xmit_buf[
4f50: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e  xmit_len++] = in
4f60: 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74  struction;..xmit
4f70: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
4f80: 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66   = p1;..xmit_buf
4f90: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70  [xmit_len++] = p
4fa0: 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a  2;..if (data) {.
4fb0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
4fc0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 66  len++] = lc;...f
4fd0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
4fe0: 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a   < lc; idx++) {.
4ff0: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
5000: 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69  _len++] = data[i
5010: 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  dx];...}..}...if
5020: 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a   (le != 0x00) {.
5030: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
5040: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 7d 0a  len++] = le;..}.
5050: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5060: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
5070: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
5080: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 0a 09  f, xmit_len);...
5090: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
50a0: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63  f(recv_buf);..sc
50b0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
50c0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
50d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
50e0: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
50f0: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
5100: 53 43 41 52 44 5f 50 43 49 5f 54 31 2c 20 72 65  SCARD_PCI_T1, re
5110: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
5120: 6e 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 78  n);..if (scard_x
5130: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
5140: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
5150: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5160: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
5170: 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64  end APDU to card
5180: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28   (SCardTransmit(
5190: 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41  ) = %s/%lx)", CA
51a0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
51b0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
51c0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
51d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
51e0: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
51f0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78  ;....if (scard_x
5200: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
5210: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
5220: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
5230: 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
5240: 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
5250: 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
5260: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
5270: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
5280: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
5290: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
52a0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
52b0: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
52c0: 45 53 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74  ESET_CARD, &prot
52d0: 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63  ocol);....if (sc
52e0: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
52f0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
5300: 53 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  S) {.....CACKEY_
5310: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
5320: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
5330: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
5340: 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74  ;.....scard_xmit
5350: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
5360: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
5370: 63 61 72 64 2c 20 53 43 41 52 44 5f 50 43 49 5f  card, SCARD_PCI_
5380: 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  T0, xmit_buf, xm
5390: 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44 5f 50 43  it_len, SCARD_PC
53a0: 49 5f 54 30 2c 20 72 65 63 76 5f 62 75 66 2c 20  I_T0, recv_buf, 
53b0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
53c0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
53d0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
53e0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
53f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5400: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
5410: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
5420: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
5430: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
5440: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
5450: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
5460: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
5470: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
5480: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
5490: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
54a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
54b0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
54c0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
54d0: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
54e0: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  T_CARD);......sl
54f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
5500: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
5510: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
5520: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
5530: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
5540: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
5550: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
5560: 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
5570: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
5580: 63 61 72 64 2c 20 53 43 41 52 44 5f 52 45 53 45  card, SCARD_RESE
5590: 54 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f  T_CARD);.....slo
55a0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
55b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
55c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
55d0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
55e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09  in failure");...
55f0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
5600: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
5610: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5620: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
5630: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
5640: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
5650: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
5660: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
5670: 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73  D);....slot->pcs
5680: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5690: 20 3d 20 30 3b 0a 0a 09 09 09 43 41 43 4b 45 59   = 0;.....CACKEY
56a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
56b0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
56c0: 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e  ure");....return
56d0: 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  (-1);...}..}...C
56e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
56f0: 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20 56  TBUF("Returned V
5700: 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75 66  alue:", recv_buf
5710: 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69  , recv_len);...i
5720: 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29  f (recv_len < 2)
5730: 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20   {.../* Minimal 
5740: 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20  response length 
5750: 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74 75  is 2 bytes, retu
5760: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
5770: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
5780: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
5790: 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72  nse too small, r
57a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
57b0: 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20  ure (recv_len = 
57c0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
57d0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29   long) recv_len)
57e0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
57f0: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
5800: 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a  ne result code *
5810: 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65  /..major_rc = re
5820: 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20  cv_buf[recv_len 
5830: 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20  - 2];..minor_rc 
5840: 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f  = recv_buf[recv_
5850: 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72  len - 1];..if (r
5860: 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65  espcode) {...*re
5870: 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f  spcode = (major_
5880: 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72  rc << 8) | minor
5890: 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a  _rc;..}.../* Adj
58a0: 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66 66  ust message buff
58b0: 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20  er */..recv_len 
58c0: 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62  -= 2;.../* Add b
58d0: 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76  ytes to return v
58e0: 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73  alue */..tmp_res
58f0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09  pdata_len = 0;..
5900: 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26 20  if (respdata && 
5910: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a  respdata_len) {.
5920: 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
5930: 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c  en = *respdata_l
5940: 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f  en;....bytes_to_
5950: 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61  copy = *respdata
5960: 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63  _len;....if (rec
5970: 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f  v_len < bytes_to
5980: 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65  _copy) {....byte
5990: 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76  s_to_copy = recv
59a0: 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  _len;...}....CAC
59b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
59c0: 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79  ("Copying %lu by
59d0: 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66 65  tes to the buffe
59e0: 72 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  r", (unsigned lo
59f0: 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ng) bytes_to_cop
5a00: 79 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65  y);....memcpy(re
5a10: 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66  spdata, recv_buf
5a20: 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
5a30: 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20  ;...respdata += 
5a40: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
5a50: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
5a60: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
5a70: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
5a80: 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
5a90: 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  copy;..} else {.
5aa0: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21  ..if (recv_len !
5ab0: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
5ac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
5ad0: 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75  hrowing away %lu
5ae0: 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20   bytes, nowhere 
5af0: 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28  to put them!", (
5b00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
5b10: 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d  ecv_len);...}..}
5b20: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
5b30: 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20  == 0x61) {.../* 
5b40: 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20  We need to READ 
5b50: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
5b60: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
5b70: 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29   read required")
5b80: 3b 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73  ;....pcsc_getres
5b90: 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  p_ret = cackey_s
5ba0: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
5bb0: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
5bc0: 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
5bd0: 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78  GET_RESPONSE, 0x
5be0: 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c  00, 0x00, 0, NUL
5bf0: 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73  L, minor_rc, res
5c00: 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c  pcode, respdata,
5c10: 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c   &tmp_respdata_l
5c20: 65 6e 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  en);...if (pcsc_
5c30: 67 65 74 72 65 73 70 5f 72 65 74 20 3c 20 30 29  getresp_ret < 0)
5c40: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
5c50: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
5c60: 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20  r read failed!  
5c70: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
5c80: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
5c90: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 69  rn(-1);...}....i
5ca0: 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  f (respdata_len)
5cb0: 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f   {....*respdata_
5cc0: 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64  len += tmp_respd
5cd0: 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ata_len;...}....
5ce0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5cf0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
5d00: 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65  n success (buffe
5d10: 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29  r read complete)
5d20: 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
5d30: 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ..}...if (major_
5d40: 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09  rc == 0x90) {...
5d50: 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09  /* Success */...
5d60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5d70: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
5d80: 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72  n success (major
5d90: 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a  _rc = 0x90)");..
5da0: 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
5db0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5dc0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74  PRINTF("APDU Ret
5dd0: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20  urned an error, 
5de0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
5df0: 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  lure");...return
5e00: 28 2d 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  (-1);.}..static 
5e10: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
5e20: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
5e30: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
5e40: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
5e50: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
5e60: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
5e70: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
5e80: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
5e90: 66 66 73 65 74 29 20 7b 0a 09 73 69 7a 65 5f 74  ffset) {..size_t
5ea0: 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78   offset = 0, max
5eb0: 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75  _offset, max_cou
5ec0: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  nt;..unsigned ch
5ed0: 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74  ar cmd[2];..uint
5ee0: 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
5ef0: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
5f00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5f10: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5f20: 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63  ..max_offset = c
5f30: 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74  ount;..max_count
5f40: 20 3d 20 32 35 32 3b 0a 0a 09 63 6d 64 5b 30 5d   = 252;...cmd[0]
5f50: 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69   = t_or_v;...whi
5f60: 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28 6f  le (1) {...if (o
5f70: 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66  ffset >= max_off
5f80: 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  set) {....CACKEY
5f90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
5fa0: 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c  uffer too small,
5fb0: 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74 20   returning what 
5fc0: 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09  we got...");....
5fd0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63  .break;...}....c
5fe0: 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65  ount = max_offse
5ff0: 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69 66  t - offset;...if
6000: 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f   (count > max_co
6010: 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20  unt) {....count 
6020: 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d  = max_count;...}
6030: 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75  ....cmd[1] = cou
6040: 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  nt;....send_ret 
6050: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
6060: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
6070: 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
6080: 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
6090: 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20 28  R_READ_BUFFER, (
60a0: 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20  (initial_offset 
60b0: 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29 20  + offset) >> 8) 
60c0: 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61 6c  & 0xff, (initial
60d0: 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74  _offset + offset
60e0: 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f 66  ) & 0xff, sizeof
60f0: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30 30  (cmd), cmd, 0x00
6100: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
6110: 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26 63  fer + offset, &c
6120: 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 73 65 6e  ount);...if (sen
6130: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
6140: 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
6150: 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69 66  0x6A86) {.....if
6160: 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31   (max_count == 1
6170: 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
6180: 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63  ....}......max_c
6190: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
61a0: 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69   / 2;......conti
61b0: 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
61c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
61d0: 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  F("cackey_send_a
61e0: 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72 65  pdu() failed, re
61f0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
6200: 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  re");.....return
6210: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66  (-1);...}....off
6220: 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09  set += count;...
6230: 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78  .if (count < max
6240: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
6250: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6260: 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d 20  ("Short read -- 
6270: 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b  count = %i, cmd[
6280: 31 5d 20 3d 20 25 69 22 2c 20 63 6f 75 6e 74 2c  1] = %i", count,
6290: 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72   cmd[1]);.....br
62a0: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  eak;...}..}...CA
62b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
62c0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
62d0: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
62e0: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
62f0: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
6300: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73  );...return(offs
6310: 65 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  et);.}..static i
6320: 6e 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  nt cackey_select
6330: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
6340: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
6350: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
6360: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
6370: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
6380: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
6390: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
63a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
63b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
63c0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
63d0: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
63e0: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
63f0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
6400: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
6410: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
6420: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
6430: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
6440: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
6450: 43 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  C, aid_len, aid,
6460: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
6470: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
6480: 65 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  end_ret < 0) {..
6490: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
64a0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
64b0: 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74  open applet, ret
64c0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
64d0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  e");....return(-
64e0: 31 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  1);..}...CACKEY_
64f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
6500: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
6510: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
6520: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
6530: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 73 65  ic int cackey_se
6540: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
6550: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
6560: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
6570: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
6580: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
6590: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
65a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
65b0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
65c0: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
65d0: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
65e0: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
65f0: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
6600: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
6610: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
6620: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6630: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
6640: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
6650: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
6660: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
6670: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
6680: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
6690: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
66a0: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
66b0: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
66c0: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
66d0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
66e0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
66f0: 6e 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  nd_ret < 0) {...
6700: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6710: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
6720: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
6730: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
6740: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
6750: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
6760: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
6770: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
6780: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
6790: 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
67a0: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
67b0: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
67c0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
67d0: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  oot) {..struct c
67e0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
67f0: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a   *curr, *next;..
6800: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c  .if (root == NUL
6810: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
6820: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20  }...for (curr = 
6830: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72  root; curr; curr
6840: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78   = next) {...nex
6850: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b  t = curr->_next;
6860: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
6870: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65  ->tag) {....case
6880: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
6890: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53  ABLE:....case GS
68a0: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
68b0: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72  ATE:.....if (cur
68c0: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09  r->value) {.....
68d0: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75  .free(curr->valu
68e0: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  e);.....}.....br
68f0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
6900: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
6910: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
6920: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09  lue_cardurl) {..
6930: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
6940: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09  alue_cardurl);..
6950: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
6960: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72  ..}....free(curr
6970: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
6980: 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
6990: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
69a0: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
69b0: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
69c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
69d0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
69e0: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
69f0: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
6a00: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
6a10: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
6a20: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
6a30: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
6a40: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
6a50: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
6a60: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
6a70: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
6a80: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
6a90: 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c  ;..ssize_t tlen,
6aa0: 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20   vlen;..ssize_t 
6ab0: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
6ac0: 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20  t offset_t = 0, 
6ad0: 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75  offset_v = 0;..u
6ae0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67  nsigned char tag
6af0: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
6b00: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
6b10: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6b20: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
6b30: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
6b40: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
6b50: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
6b60: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
6b70: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
6b80: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
6b90: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
6ba0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6bb0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
6bc0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6bd0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
6be0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
6bf0: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
6c00: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
6c10: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
6c20: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
6c30: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
6c40: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
6c50: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
6c60: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
6c70: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
6c80: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
6c90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6ca0: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
6cb0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6cc0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
6cd0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
6ce0: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
6cf0: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
6d00: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
6d10: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
6d20: 65 6e 67 74 68 20 3d 20 25 69 2c 20 56 61 6c 75  ength = %i, Valu
6d30: 65 20 4c 65 6e 67 74 68 20 3d 20 25 69 22 2c 20  e Length = %i", 
6d40: 74 6c 65 6e 2c 20 76 6c 65 6e 29 3b 0a 0a 09 74  tlen, vlen);...t
6d50: 6c 65 6e 20 2d 3d 20 32 3b 0a 09 6f 66 66 73 65  len -= 2;..offse
6d60: 74 5f 74 20 2b 3d 20 32 3b 0a 0a 09 76 6c 65 6e  t_t += 2;...vlen
6d70: 20 2d 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   -= 2;..offset_v
6d80: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
6d90: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
6da0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
6db0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
6dc0: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
6dd0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
6de0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
6df0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
6e00: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
6e10: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
6e20: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
6e30: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
6e40: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
6e50: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
6e60: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
6e70: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
6e80: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
6e90: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
6ea0: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
6eb0: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
6ec0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
6ed0: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
6ee0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6ef0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
6f00: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
6f10: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
6f20: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
6f30: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
6f40: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
6f50: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
6f60: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
6f70: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
6f80: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
6f90: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
6fa0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6fb0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
6fc0: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
6fd0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
6fe0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
6ff0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
7000: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
7010: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
7020: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
7030: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
7040: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
7050: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
7060: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
7070: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
7080: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
7090: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
70a0: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
70b0: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
70c0: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
70d0: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
70e0: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
70f0: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
7100: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7110: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
7120: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
7130: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
7140: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
7150: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
7160: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7170: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
7180: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
7190: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
71a0: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
71b0: 68 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  h;....curr_entit
71c0: 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
71d0: 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
71e0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
71f0: 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
7200: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
7210: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
7220: 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
7230: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
7240: 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
7250: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
7260: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
7270: 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
7280: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
7290: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
72a0: 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
72b0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
72c0: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
72d0: 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
72e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
72f0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
7300: 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
7310: 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
7320: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
7330: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
7340: 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
7350: 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
7360: 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
7370: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
7380: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
7390: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
73a0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
73b0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
73c0: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
73d0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
73e0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
73f0: 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
7400: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
7410: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
7420: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
7430: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
7440: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
7450: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
7460: 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
7470: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
7480: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
7490: 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
74a0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
74b0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
74c0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
74d0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
74e0: 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
74f0: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
7500: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
7510: 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ));.....tmpbuf =
7520: 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b   malloc(length);
7530: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ......memcpy(tmp
7540: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
7550: 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  h);......curr_en
7560: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
7570: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
7580: 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74  ->length = lengt
7590: 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  h;.....curr_enti
75a0: 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62  ty->value = tmpb
75b0: 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  uf;.....curr_ent
75c0: 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c  ity->_next = NUL
75d0: 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  L;......break;..
75e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
75f0: 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75 72  _PKCS15:.....cur
7600: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
7610: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
7620: 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63 75  ntity));......cu
7630: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
7640: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
7650: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74  ntity->value_byt
7660: 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09  e = vval[0];....
7670: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
7680: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
7690: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69  .break;...}....i
76a0: 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21  f (curr_entity !
76b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
76c0: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
76d0: 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72  .....root = curr
76e0: 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09  _entity;....}...
76f0: 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55  ..if (last != NU
7700: 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e  LL) {.....last->
7710: 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74  _next = curr_ent
7720: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61  ity;....}.....la
7730: 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  st = curr_entity
7740: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
7750: 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 73 74 61 74  n(root);.}..stat
7760: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
7770: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
7780: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
7790: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
77a0: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
77b0: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
77c0: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 66 6f 72  ize_t idx;...for
77d0: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
77e0: 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b   count; idx++) {
77f0: 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78  ...if (start[idx
7800: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b  ].certificate) {
7810: 0a 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69  ....free(start[i
7820: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
7830: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66  ;...}..}...if (f
7840: 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66  ree_start) {...f
7850: 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a  ree(start);..}..
7860: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74  .return;.}..stat
7870: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
7880: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
7890: 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
78a0: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
78b0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75  slot *slot, stru
78c0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
78d0: 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20  dentity *certs, 
78e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63  unsigned long *c
78f0: 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
7900: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
7910: 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09  tity *curr_id;..
7920: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
7930: 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c  v_entity *ccc_tl
7940: 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61  v, *ccc_curr, *a
7950: 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72  pp_tlv, *app_cur
7960: 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  r;..unsigned cha
7970: 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47  r ccc_aid[] = {G
7980: 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09  SCIS_AID_CCC};..
7990: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
79a0: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
79b0: 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78  gned long outidx
79c0: 20 3d 20 30 3b 0a 09 69 6e 74 20 63 65 72 74 73   = 0;..int certs
79d0: 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74  _resizable;..int
79e0: 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63   send_ret, selec
79f0: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
7a00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
7a10: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
7a20: 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
7a50: 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
7a60: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
7a70: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
7a80: 7d 0a 0a 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d  }...if (*count =
7a90: 3d 20 30 29 20 7b 0a 09 09 69 66 20 28 63 65 72  = 0) {...if (cer
7aa0: 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts != NULL) {...
7ab0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7ac0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
7ad0: 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
7ae0: 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
7af0: 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
7b00: 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
7b10: 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
7b20: 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ULL) {...certs =
7b30: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
7b40: 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a  certs) * 5);...*
7b50: 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72  count = 5;...cer
7b60: 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31  ts_resizable = 1
7b70: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65  ;..} else {...ce
7b80: 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20  rts_resizable = 
7b90: 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63  0;..}.../* Selec
7ba0: 74 20 74 68 65 20 43 43 43 20 41 70 70 6c 65 74  t the CCC Applet
7bb0: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
7bc0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
7bd0: 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61  plet(slot, ccc_a
7be0: 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61  id, sizeof(ccc_a
7bf0: 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  id));..if (send_
7c00: 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 43 41 43  ret < 0) {...CAC
7c10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7c20: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
7c30: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
7c40: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
7c50: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
7c60: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
7c70: 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70  Read all the app
7c80: 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43  lets from the CC
7c90: 43 27 73 20 54 4c 56 20 2a 2f 0a 09 63 63 63 5f  C's TLV */..ccc_
7ca0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
7cb0: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f  d_tlv(slot);.../
7cc0: 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
7cd0: 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
7ce0: 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
7cf0: 74 73 20 2a 2f 0a 09 66 6f 72 20 28 63 63 63 5f  ts */..for (ccc_
7d00: 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20  curr = ccc_tlv; 
7d10: 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75  ccc_curr; ccc_cu
7d20: 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f  rr = ccc_curr->_
7d30: 6e 65 78 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  next) {...CACKEY
7d40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
7d50: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
7d60: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
7d70: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
7d80: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
7d90: 3b 0a 0a 09 09 69 66 20 28 63 63 63 5f 63 75 72  ;....if (ccc_cur
7da0: 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
7db0: 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a 09  TAG_CARDURL) {..
7dc0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7dd0: 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
7de0: 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
7df0: 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 41 52  y care about CAR
7e00: 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09 63 6f  DURLs)");.....co
7e10: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
7e20: 66 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  f ((ccc_curr->va
7e30: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
7e40: 74 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c  type & CACKEY_TL
7e50: 56 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41  V_APP_PKI) != CA
7e60: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
7e70: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
7e80: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
7e90: 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
7ea0: 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
7eb0: 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
7ec0: 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
7ed0: 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
7ee0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
7ef0: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
7f00: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
7f10: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
7f20: 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
7f30: 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
7f40: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
7f50: 79 70 65 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  ype);.....contin
7f60: 75 65 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  ue;...}....CACKE
7f70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
7f80: 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
7f90: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
7fa0: 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
7fb0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
7fc0: 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
7fd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7fe0: 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f  NTF("AppID = %s/
7ff0: 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
8000: 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
8010: 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
8020: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
8030: 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65  appid), (unsigne
8040: 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72  d long) ccc_curr
8050: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
8060: 3e 61 70 70 69 64 29 3b 0a 09 09 43 41 43 4b 45  >appid);...CACKE
8070: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8080: 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30  ObjectID = %s/%0
8090: 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  4lx", CACKEY_DEB
80a0: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
80b0: 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
80c0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
80d0: 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e  jectid), (unsign
80e0: 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
80f0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
8100: 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09  ->objectid);....
8110: 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c  memcpy(curr_aid,
8120: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
8130: 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73  _cardurl->rid, s
8140: 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e  izeof(ccc_curr->
8150: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
8160: 69 64 29 29 3b 0a 09 09 63 75 72 72 5f 61 69 64  id));...curr_aid
8170: 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
8180: 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
8190: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
81a0: 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
81b0: 20 30 78 66 66 3b 0a 09 09 63 75 72 72 5f 61 69   0xff;...curr_ai
81c0: 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
81d0: 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
81e0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
81f0: 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
8200: 0a 0a 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f  ..../* Select fo
8210: 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a  und applet ... *
8220: 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  /...select_ret =
8230: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
8240: 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
8250: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
8260: 72 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73  r_aid));...if (s
8270: 65 6c 65 63 74 5f 72 65 74 20 3c 20 30 29 20 7b  elect_ret < 0) {
8280: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8290: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
82a0: 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  to select applet
82b0: 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f 63 65  , skipping proce
82c0: 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 62  ssing of this ob
82d0: 6a 65 63 74 22 29 3b 0a 0a 09 09 09 63 6f 6e 74  ject");.....cont
82e0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  inue;...}..../* 
82f0: 2e 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28  ... and object (
8300: 66 69 6c 65 29 20 2a 2f 0a 09 09 73 65 6c 65 63  file) */...selec
8310: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
8320: 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
8330: 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
8340: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
8350: 69 64 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  id);...if (selec
8360: 74 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  t_ret < 0) {....
8370: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8380: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
8390: 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
83a0: 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
83b0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
83c0: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
83d0: 09 09 7d 0a 0a 09 09 2f 2a 20 50 72 6f 63 65 73  ..}..../* Proces
83e0: 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c  s this file's TL
83f0: 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65  V looking for ce
8400: 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09  rtificates */...
8410: 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  app_tlv = cackey
8420: 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
8430: 0a 0a 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
8440: 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
8450: 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
8460: 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
8470: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
8480: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
8490: 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43  nd tag: %s", CAC
84a0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
84b0: 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75  AG_TO_STR(app_cu
84c0: 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 69 66  rr->tag));....if
84d0: 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
84e0: 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
84f0: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
8500: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8510: 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
8520: 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
8530: 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54 49  care about CERTI
8540: 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09 09  FICATEs)");.....
8550: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
8560: 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63  ....curr_id = &c
8570: 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09  erts[outidx];...
8580: 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d  .outidx++;.....m
8590: 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 61  emcpy(curr_id->a
85a0: 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c  pplet, curr_aid,
85b0: 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d   sizeof(curr_id-
85c0: 3e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 63 75  >applet));....cu
85d0: 72 72 5f 69 64 2d 3e 66 69 6c 65 20 3d 20 63 63  rr_id->file = cc
85e0: 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
85f0: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
8600: 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6c 61 62  ....curr_id->lab
8610: 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  el = NULL;.....c
8620: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
8630: 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
8640: 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
8650: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
8660: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
8670: 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
8680: 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  te_len);....memc
8690: 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  py(curr_id->cert
86a0: 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72  ificate, app_cur
86b0: 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69  r->value, curr_i
86c0: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
86d0: 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74  en);.....if (out
86e0: 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
86f0: 0a 09 09 09 09 69 66 20 28 63 65 72 74 73 5f 72  .....if (certs_r
8700: 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09  esizable) {.....
8710: 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09  .*count *= 2;...
8720: 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
8730: 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
8740: 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
8750: 6e 74 29 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  nt));.....} else
8760: 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
8770: 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ...}....}...}...
8780: 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
8790: 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 69 66  (app_tlv);....if
87a0: 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
87b0: 6e 74 29 20 7b 0a 09 09 09 62 72 65 61 6b 3b 0a  nt) {....break;.
87c0: 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
87d0: 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76  free_tlv(ccc_tlv
87e0: 29 3b 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75  );...*count = ou
87f0: 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74  tidx;...if (cert
8800: 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
8810: 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63  .certs = realloc
8820: 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a  (certs, sizeof(*
8830: 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74  certs) * (*count
8840: 29 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ));..}...return(
8850: 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  certs);.}../* Re
8860: 74 75 72 6e 73 20 31 20 69 66 20 61 20 74 6f 6b  turns 1 if a tok
8870: 65 6e 20 69 73 20 69 6e 20 74 68 65 20 73 70 65  en is in the spe
8880: 63 69 66 69 65 64 20 73 6c 6f 74 2c 20 30 20 6f  cified slot, 0 o
8890: 74 68 65 72 77 69 73 65 20 2a 2f 0a 73 74 61 74  therwise */.stat
88a0: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 74 6f  ic int cackey_to
88b0: 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75  ken_present(stru
88c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
88d0: 73 6c 6f 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65  slot) {..unsigne
88e0: 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d  d char ccc_aid[]
88f0: 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43   = {GSCIS_AID_CC
8900: 43 7d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  C};..int send_re
8910: 74 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74  t;.../* Select t
8920: 68 65 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f  he CCC Applet */
8930: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
8940: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
8950: 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c  t(slot, ccc_aid,
8960: 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29   sizeof(ccc_aid)
8970: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
8980: 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
8990: 28 30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  (0);..}...return
89a0: 28 31 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (1);.}../* Retur
89b0: 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
89c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
89d0: 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
89e0: 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
89f0: 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
8a00: 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
8a10: 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
8a20: 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
8a30: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
8a40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8a50: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8a60: 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
8a70: 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
8a80: 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
8a90: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
8aa0: 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
8ab0: 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
8ac0: 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
8ad0: 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
8ae0: 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
8af0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8b00: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
8b10: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
8b20: 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
8b30: 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
8b40: 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
8b50: 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
8b60: 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
8b70: 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
8b80: 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
8b90: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8ba0: 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
8bb0: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
8bc0: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
8bd0: 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
8be0: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
8bf0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
8c00: 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
8c10: 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
8c20: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
8c30: 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
8c40: 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
8c50: 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
8c60: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
8c70: 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
8c80: 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
8c90: 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
8ca0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8cb0: 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
8cc0: 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
8cd0: 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
8ce0: 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
8cf0: 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
8d00: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
8d10: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
8d20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
8d30: 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
8d40: 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
8d50: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
8d60: 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
8d70: 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
8d80: 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
8d90: 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
8da0: 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
8db0: 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
8dc0: 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
8dd0: 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
8de0: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
8df0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8e00: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
8e10: 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
8e20: 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
8e30: 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
8e40: 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
8e50: 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
8e60: 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
8e70: 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
8e80: 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
8e90: 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
8ea0: 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
8eb0: 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
8ec0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8ed0: 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
8ee0: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
8ef0: 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
8f00: 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
8f10: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
8f20: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
8f30: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
8f40: 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
8f50: 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
8f60: 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
8f70: 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
8f80: 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
8f90: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
8fa0: 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
8fb0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8fc0: 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
8fd0: 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
8fe0: 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
8ff0: 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
9000: 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
9010: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
9020: 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
9030: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
9040: 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
9050: 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
9060: 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
9070: 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
9080: 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
9090: 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
90a0: 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
90b0: 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
90c0: 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
90d0: 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
90e0: 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
90f0: 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
9100: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9110: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
9120: 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
9130: 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
9140: 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
9150: 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
9160: 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
9170: 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
9180: 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
9190: 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
91a0: 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
91b0: 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
91c0: 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
91d0: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
91e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
91f0: 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
9200: 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
9210: 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
9220: 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
9230: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
9240: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
9250: 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
9260: 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
9270: 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
9280: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
9290: 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
92a0: 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
92b0: 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
92c0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
92d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
92e0: 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
92f0: 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
9300: 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
9310: 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
9320: 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
9330: 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
9340: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
9350: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
9360: 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
9370: 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
9380: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
9390: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
93a0: 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
93b0: 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
93c0: 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
93d0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
93e0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
93f0: 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
9400: 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
9410: 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
9420: 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
9430: 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
9440: 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
9450: 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
9460: 61 6c 73 65 20 3d 20 30 3b 0a 09 43 4b 5f 55 4c  alse = 0;..CK_UL
9470: 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30  ONG numattrs = 0
9480: 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a  , retval_count;.
9490: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59  .CK_ATTRIBUTE_TY
94a0: 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  PE curr_attr_typ
94b0: 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  e;..CK_ATTRIBUTE
94c0: 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74   curr_attr, *ret
94d0: 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  val;..CK_VOID_PT
94e0: 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c  R pValue;..CK_UL
94f0: 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  ONG ulValueLen;.
9500: 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  .CK_OBJECT_CLASS
9510: 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73   ck_object_class
9520: 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54  ;..CK_CERTIFICAT
9530: 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66  E_TYPE ck_certif
9540: 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f  icate_type;..CK_
9550: 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f  KEY_TYPE ck_key_
9560: 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48  type;..CK_UTF8CH
9570: 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34  AR ucTmpBuf[1024
9580: 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
9590: 72 20 63 65 72 74 69 66 69 63 61 74 65 5b 31 36  r certificate[16
95a0: 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 63  384];..ssize_t c
95b0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
95c0: 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72   -1, x509_read_r
95d0: 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f  et;..int pValue_
95e0: 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  free;...CACKEY_D
95f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
9600: 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73  led (objectClass
9610: 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79   = %lu, identity
9620: 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28  _num = %lu).", (
9630: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
9640: 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e  bjectclass, iden
9650: 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66 20  tity_num);...if 
9660: 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
9670: 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
9680: 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
9690: 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
96a0: 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
96b0: 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
96c0: 45 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  EY) {...CACKEY_D
96d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
96e0: 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
96f0: 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
9700: 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
9710: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
9720: 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f  ;..}...retval_co
9730: 75 6e 74 20 3d 20 31 36 3b 0a 09 72 65 74 76 61  unt = 16;..retva
9740: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61  l = malloc(retva
9750: 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
9760: 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 2f 2a  (*retval));.../*
9770: 20 58 58 58 3a 20 47 65 74 20 43 65 72 74 20 2a   XXX: Get Cert *
9780: 2f 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  /..certificate_l
9790: 65 6e 20 3d 20 2d 31 3b 0a 0a 09 69 66 20 28 63  en = -1;...if (c
97a0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
97b0: 3d 20 2d 31 29 20 7b 0a 09 09 43 41 43 4b 45 59  = -1) {...CACKEY
97c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
97d0: 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
97e0: 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20  ts (NULL), this 
97f0: 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f  identity does no
9800: 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20  t have an X.509 
9810: 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
9820: 63 69 61 74 65 64 20 77 69 74 68 20 69 74 20 61  ciated with it a
9830: 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  nd will not work
9840: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
9850: 4c 4c 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63  LL);..}...for (c
9860: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
9870: 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
9880: 65 20 3c 20 30 78 63 65 35 33 36 33 35 66 3b 20  e < 0xce53635f; 
9890: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
98a0: 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
98b0: 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
98c0: 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
98d0: 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
98e0: 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
98f0: 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
9900: 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
9910: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
9920: 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
9930: 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
9940: 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
9950: 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
9960: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9970: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
9980: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
9990: 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
99a0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
99b0: 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
99c0: 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
99d0: 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
99e0: 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
99f0: 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
9a00: 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
9a10: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
9a20: 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
9a30: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
9a40: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
9a50: 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
9a60: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
9a70: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
9a80: 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
9a90: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
9aa0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9ab0: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
9ac0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
9ad0: 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
9ae0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9af0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
9b00: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
9b10: 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
9b20: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
9b30: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
9b40: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
9b50: 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
9b60: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
9b70: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
9b80: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
9b90: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
9ba0: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
9bb0: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
9bc0: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
9bd0: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
9be0: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
9bf0: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
9c00: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
9c10: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
9c20: 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  IFIABLE:.....CAC
9c30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9c40: 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
9c50: 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46  ribute CKA_MODIF
9c60: 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20  IABLE (0x%08lx) 
9c70: 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
9c80: 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
9c90: 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
9ca0: 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
9cb0: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
9cc0: 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
9cd0: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
9ce0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
9cf0: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
9d00: 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
9d10: 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
9d20: 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
9d30: 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
9d40: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
9d50: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
9d60: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
9d70: 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45  LABEL:.....CACKE
9d80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9d90: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
9da0: 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28  bute CKA_LABEL (
9db0: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
9dc0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
9dd0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
9de0: 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65 74  ...../* XXX: Det
9df0: 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a 0a  ermine name */..
9e00: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9e10: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
9e20: 74 75 72 6e 69 6e 67 20 25 73 20 28 25 70 2f 25  turning %s (%p/%
9e30: 6c 75 29 22 2c 20 28 63 68 61 72 20 2a 29 20 28  lu)", (char *) (
9e40: 28 43 4b 5f 55 54 46 38 43 48 41 52 20 2a 29 20  (CK_UTF8CHAR *) 
9e50: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
9e60: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
9e70: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
9e80: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
9e90: 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
9ea0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9eb0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
9ec0: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
9ed0: 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
9ee0: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
9ef0: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
9f00: 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
9f10: 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
9f20: 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
9f30: 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
9f40: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f50: 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
9f60: 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
9f70: 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
9f80: 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
9f90: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
9fa0: 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42  ....case CKO_PUB
9fb0: 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 2f  LIC_KEY:......./
9fc0: 2a 20 58 58 58 3a 20 54 4f 44 4f 20 2a 2f 0a 0a  * XXX: TODO */..
9fd0: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
9fe0: 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
9ff0: 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
a000: 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
a010: 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
a020: 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
a030: 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
a040: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
a050: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a060: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
a070: 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
a080: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
a090: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
a0a0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
a0b0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
a0c0: 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
a0d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
a0e0: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
a0f0: 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
a100: 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
a110: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
a120: 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
a130: 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
a140: 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
a150: 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
a160: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a170: 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
a180: 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
a190: 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
a1a0: 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
a1b0: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
a1c0: 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
a1d0: 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
a1e0: 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
a1f0: 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
a200: 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61  issuer(certifica
a210: 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
a220: 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
a230: 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
a240: 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
a250: 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
a260: 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
a270: 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
a280: 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
a290: 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
a2a0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a2b0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
a2c0: 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
a2d0: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
a2e0: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
a2f0: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
a300: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
a310: 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
a320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a330: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
a340: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
a350: 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78  ERIAL_NUMBER (0x
a360: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
a370: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
a380: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
a390: 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
a3a0: 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
a3b0: 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
a3c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a3d0: 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
a3e0: 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
a3f0: 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
a400: 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
a410: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a420: 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
a430: 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
a440: 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
a450: 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
a460: 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
a470: 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
a480: 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
a490: 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
a4a0: 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
a4b0: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
a4c0: 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
a4d0: 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
a4e0: 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
a4f0: 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
a500: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a510: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
a520: 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
a530: 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
a540: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
a550: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
a560: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
a570: 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41  _SUBJECT:.....CA
a580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a590: 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
a5a0: 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a  tribute CKA_SUBJ
a5b0: 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ECT (0x%08lx) ..
a5c0: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
a5d0: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
a5e0: 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
a5f0: 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
a600: 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
a610: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a620: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
a630: 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
a640: 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
a650: 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
a660: 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
a670: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
a680: 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
a690: 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
a6a0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
a6b0: 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
a6c0: 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
a6d0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
a6e0: 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
a6f0: 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
a700: 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
a710: 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
a720: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
a730: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
a740: 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
a750: 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
a760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a770: 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
a780: 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
a790: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
a7a0: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
a7b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
a7c0: 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43  se CKA_ID:.....C
a7d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a7e0: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
a7f0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20  ttribute CKA_ID 
a800: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
a810: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
a820: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
a830: 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30  ......ucTmpBuf[0
a840: 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e  ] = ((identity_n
a850: 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20  um + 1) >> 8) & 
a860: 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42  0xff;.....ucTmpB
a870: 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69  uf[1] =  (identi
a880: 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78  ty_num + 1) & 0x
a890: 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ff;......pValue 
a8a0: 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09  = &ucTmpBuf;....
a8b0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b  .ulValueLen = 2;
a8c0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
a8d0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
a8e0: 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
a8f0: 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
a900: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
a910: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
a920: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
a930: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
a940: 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
a950: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
a960: 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
a970: 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
a980: 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
a990: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
a9a0: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
a9b0: 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
a9c0: 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
a9d0: 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
a9e0: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
a9f0: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
aa00: 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
aa10: 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
aa20: 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
aa30: 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  ate.");.......br
aa40: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
aa50: 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
aa60: 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61  rt one certifica
aa70: 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  te type */.....c
aa80: 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
aa90: 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a  pe = CKC_X_509;.
aaa0: 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
aab0: 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
aac0: 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  pe;.....ulValueL
aad0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63  en = sizeof(ck_c
aae0: 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29  ertificate_type)
aaf0: 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
ab00: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
ab10: 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58   returning CKC_X
ab20: 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25  _509 (%lu) (%p/%
ab30: 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
ab40: 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
ab50: 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
ab60: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
ab70: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ab80: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
ab90: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
aba0: 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a  e CKA_KEY_TYPE:.
abb0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
abc0: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
abd0: 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
abe0: 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30  A_KEY_TYPE (0x%0
abf0: 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
ac00: 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
ac10: 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
ac20: 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
ac30: 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
ac40: 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
ac50: 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss != CKO_PUBLIC
ac60: 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43  _KEY) {......CAC
ac70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ac80: 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
ac90: 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
aca0: 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b  e we are not a k
acb0: 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ey.");.......bre
acc0: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
acd0: 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
ace0: 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a  t one key type *
acf0: 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70  /.....ck_key_typ
ad00: 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09  e = CKK_RSA;....
ad10: 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b  ..pValue = &ck_k
ad20: 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  ey_type;.....ulV
ad30: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
ad40: 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a  (ck_key_type);..
ad50: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ad60: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
ad70: 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20  turning CKK_RSA 
ad80: 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c  (%lu) (%p/%lu)",
ad90: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ada0: 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41   *((CK_CERTIFICA
adb0: 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75  TE_TYPE *) pValu
adc0: 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
add0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
ade0: 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
adf0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
ae00: 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45  _SIGN:.....CACKE
ae10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ae20: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
ae30: 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30  bute CKA_SIGN (0
ae40: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
ae50: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
ae60: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
ae70: 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
ae80: 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
ae90: 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
aea0: 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
aeb0: 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
aec0: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
aed0: 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
aee0: 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
aef0: 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
af00: 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
af10: 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
af20: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
af30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
af40: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
af50: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
af60: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
af70: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
af80: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
af90: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
afa0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
afb0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
afc0: 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
afd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
afe0: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
aff0: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
b000: 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
b010: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
b020: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
b030: 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
b040: 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
b050: 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c  O_PRIVATE_KEY ||
b060: 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20   objectclass == 
b070: 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
b080: 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
b090: 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
b0a0: 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
b0b0: 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
b0c0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
b0d0: 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
b0e0: 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
b0f0: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
b100: 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
b110: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b120: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
b130: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
b140: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
b150: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
b160: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
b170: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
b180: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
b190: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
b1a0: 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
b1b0: 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09  SERVER_AUTH:....
b1c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b1d0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
b1e0: 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
b1f0: 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
b200: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
b210: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b220: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
b230: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
b240: 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
b250: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
b260: 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
b270: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b280: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
b290: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
b2a0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
b2b0: 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
b2c0: 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
b2d0: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
b2e0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
b2f0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
b300: 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
b310: 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 09  LIENT_AUTH:.....
b320: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b330: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
b340: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
b350: 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 20  UST_CLIENT_AUTH 
b360: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
b370: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b380: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
b390: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
b3a0: 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
b3b0: 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
b3c0: 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
b3d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b3e0: 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
b3f0: 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
b400: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
b410: 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
b420: 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
b430: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
b440: 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
b450: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
b460: 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f  ase CKA_TRUST_CO
b470: 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 09  DE_SIGNING:.....
b480: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b490: 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
b4a0: 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
b4b0: 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47  UST_CODE_SIGNING
b4c0: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
b4d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b4e0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
b4f0: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
b500: 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c  &ck_true;.....ul
b510: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
b520: 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09  f(ck_true);.....
b530: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b540: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
b550: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
b560: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
b570: 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
b580: 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
b590: 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
b5a0: 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
b5b0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
b5c0: 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
b5d0: 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
b5e0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b5f0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
b600: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
b610: 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50  KA_TRUST_EMAIL_P
b620: 52 4f 54 45 43 54 49 4f 4e 20 28 30 78 25 30 38  ROTECTION (0x%08
b630: 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
b640: 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
b650: 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
b660: 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
b670: 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
b680: 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
b690: 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
b6a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
b6b0: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
b6c0: 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
b6d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
b6e0: 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
b6f0: 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
b700: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
b710: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
b720: 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
b730: 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  :.....pValue = N
b740: 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ULL;.....ulValue
b750: 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
b760: 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  -1;.....break;..
b770: 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c  .}....if (((CK_L
b780: 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ONG) ulValueLen)
b790: 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d   != ((CK_LONG) -
b7a0: 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68  1)) {..../* Push
b7b0: 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20   curr_attr onto 
b7c0: 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09  the stack */....
b7d0: 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d  curr_attr.type =
b7e0: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
b7f0: 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c  ....curr_attr.ul
b800: 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
b810: 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f  ueLen;.....curr_
b820: 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61  attr.pValue = ma
b830: 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75  lloc(curr_attr.u
b840: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d  lValueLen);....m
b850: 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e  emcpy(curr_attr.
b860: 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
b870: 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
b880: 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70  eLen);.....if (p
b890: 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56  Value_free && pV
b8a0: 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65  alue) {.....free
b8b0: 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a  (pValue);....}..
b8c0: 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
b8d0: 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29  >= retval_count)
b8e0: 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 5f 63 6f   {.....retval_co
b8f0: 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 72 65  unt *= 2;.....re
b900: 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
b910: 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
b920: 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
b930: 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09  tval));....}....
b940: 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b  .memcpy(&retval[
b950: 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72  numattrs], &curr
b960: 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75  _attr, sizeof(cu
b970: 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75  rr_attr));....nu
b980: 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d  mattrs++;...}..}
b990: 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
b9a0: 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c  != 0) {...retval
b9b0: 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  _count = numattr
b9c0: 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65  s;...retval = re
b9d0: 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
b9e0: 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
b9f0: 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
ba00: 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28  } else {...free(
ba10: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76  retval);....retv
ba20: 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  al = NULL;..}...
ba30: 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61  *pulCount = numa
ba40: 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ttrs;...CACKEY_D
ba50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
ba60: 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63  urning %lu objec
ba70: 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74  ts (%p).", numat
ba80: 74 72 73 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  trs, retval);...
ba90: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
baa0: 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
bab0: 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
bac0: 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  nitialize)(CK_VO
bad0: 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73  ID_PTR pInitArgs
bae0: 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41  ) {..CK_C_INITIA
baf0: 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52  LIZE_ARGS CK_PTR
bb00: 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74   args;..uint32_t
bb10: 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
bb20: 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43  _init_ret;...CAC
bb30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
bb40: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
bb50: 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
bb60: 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
bb70: 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
bb80: 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
bb90: 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
bba0: 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
bbb0: 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
bbc0: 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
bbd0: 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
bbe0: 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
bbf0: 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
bc00: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
bc10: 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
bc20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
bc30: 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
bc40: 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
bc50: 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
bc60: 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
bc70: 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
bc80: 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
bc90: 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
bca0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
bcb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
bcc0: 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
bcd0: 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
bce0: 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
bcf0: 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
bd00: 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
bd10: 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
bd20: 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 70 52 65  ...if (args->pRe
bd30: 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
bd40: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
bd50: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
bd60: 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
bd70: 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 09 72  t NULL.");.....r
bd80: 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
bd90: 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 09 7d  NTS_BAD);...}..}
bda0: 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
bdb0: 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
bdc0: 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
bdd0: 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d  ey_args.DestroyM
bde0: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
bdf0: 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
be00: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
be10: 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
be20: 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
be30: 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  .cackey_args.fla
be40: 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  gs = 0;..}...if 
be50: 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  (cackey_initiali
be60: 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
be70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
be80: 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e  ror.  Already in
be90: 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
bea0: 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
beb0: 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49  TOKI_ALREADY_INI
bec0: 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
bed0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
bee0: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
bef0: 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
bf00: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
bf10: 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
bf20: 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  +) {...cackey_se
bf30: 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
bf40: 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  ve = 0;..}...for
bf50: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
bf60: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
bf70: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
bf80: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
bf90: 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
bfa0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
bfb0: 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61  active = 0;...ca
bfc0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
bfd0: 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
bfe0: 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  LL;..}...cackey_
bff0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
c000: 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62  ...if (!cackey_b
c010: 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09  iglock_init) {..
c020: 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  .mutex_init_ret 
c030: 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  = cackey_mutex_c
c040: 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69  reate(&cackey_bi
c050: 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d  glock);....if (m
c060: 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d  utex_init_ret !=
c070: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
c080: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
c090: 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74  ror.  Mutex init
c0a0: 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65  ialization faile
c0b0: 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
c0c0: 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b  (CKR_CANT_LOCK);
c0d0: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62  ...}....cackey_b
c0e0: 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b  iglock_init = 1;
c0f0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
c100: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
c110: 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
c120: 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
c130: 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
c140: 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
c150: 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
c160: 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50  alize)(CK_VOID_P
c170: 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a  TR pReserved) {.
c180: 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
c190: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c1a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
c1b0: 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64  ...if (pReserved
c1c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
c1d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c1e0: 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72  F("Error. pReser
c1f0: 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ved is not NULL.
c200: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
c210: 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
c220: 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
c230: 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
c240: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c250: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
c260: 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
c270: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
c280: 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
c290: 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
c2a0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
c2b0: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
c2c0: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
c2d0: 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
c2e0: 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
c2f0: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
c300: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
c310: 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
c320: 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69  C_CloseSession(i
c330: 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  dx);...}..}...ca
c340: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
c350: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66  nnect_all();...f
c360: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
c370: 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
c380: 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
c390: 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
c3a0: 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
c3b0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
c3c0: 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
c3d0: 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  r) {....free(cac
c3e0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
c3f0: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d  csc_reader);...}
c400: 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ..}...cackey_ini
c410: 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09  tialized = 0;...
c420: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c430: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
c440: 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
c450: 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
c460: 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
c470: 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
c480: 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28  _RV, C_GetInfo)(
c490: 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  CK_INFO_PTR pInf
c4a0: 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
c4b0: 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63  UTF8CHAR manufac
c4c0: 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53  turerID[] = "U.S
c4d0: 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09  . Government";..
c4e0: 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
c4f0: 41 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  AR libraryDescri
c500: 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
c510: 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  y";...CACKEY_DEB
c520: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
c530: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
c540: 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
c550: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c560: 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
c570: 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
c580: 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
c590: 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
c5a0: 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
c5b0: 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
c5c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c5d0: 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
c5e0: 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
c5f0: 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
c600: 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
c610: 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  IZED);..}...pInf
c620: 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69  o->cryptokiVersi
c630: 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
c640: 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
c650: 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
c660: 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f  ) & 0xff;..pInfo
c670: 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
c680: 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
c690: 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
c6a0: 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
c6b0: 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74  & 0xff;...memset
c6c0: 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
c6d0: 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
c6e0: 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
c6f0: 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65  acturerID));..me
c700: 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
c710: 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75  facturerID, manu
c720: 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65  facturerID, size
c730: 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49  of(manufacturerI
c740: 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  D) - 1);...pInfo
c750: 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a  ->flags = 0x00;.
c760: 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
c770: 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
c780: 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
c790: 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
c7a0: 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
c7b0: 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mcpy(pInfo->libr
c7c0: 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
c7d0: 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
c7e0: 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61  on, sizeof(libra
c7f0: 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d  ryDescription) -
c800: 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69   1);...pInfo->li
c810: 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a  braryVersion.maj
c820: 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
c830: 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
c840: 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
c850: 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
c860: 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
c870: 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
c880: 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43  8) & 0xff;...CAC
c890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c8a0: 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
c8b0: 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
c8c0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
c8d0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72  OK);.}../*. * Pr
c8e0: 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65  ocess list of re
c8f0: 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74  aders, and creat
c900: 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65  e mapping betwee
c910: 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e  n reader name an
c920: 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b  d slot ID. */.CK
c930: 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
c940: 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f  (CK_RV, C_GetSlo
c950: 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20  tList)(CK_BBOOL 
c960: 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b  tokenPresent, CK
c970: 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
c980: 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  otList, CK_ULONG
c990: 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
c9a0: 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
c9b0: 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
c9c0: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
c9d0: 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
c9e0: 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
c9f0: 73 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73  slot;..char *pcs
ca00: 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63  c_readers, *pcsc
ca10: 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73  _readers_s, *pcs
ca20: 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57  c_readers_e;..DW
ca30: 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73  ORD pcsc_readers
ca40: 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _len;..LONG scar
ca50: 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
ca60: 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f  t;..size_t curr_
ca70: 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41  reader_len;...CA
ca80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ca90: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
caa0: 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
cab0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
cac0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
cad0: 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69  rror. pulCount i
cae0: 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
caf0: 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
cb00: 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
cb10: 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
cb20: 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
cb30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cb40: 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
cb50: 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
cb60: 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
cb70: 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
cb80: 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ED);..}...mutex_
cb90: 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
cba0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
cbb0: 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
cbc0: 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
cbd0: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
cbe0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
cbf0: 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
cc00: 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
cc10: 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
cc20: 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c  ROR);..}.../* Cl
cc30: 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74  ear list of slot
cc40: 73 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c  s */..if (pSlotL
cc50: 69 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79  ist) {.../* Only
cc60: 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
cc70: 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
cc80: 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
cc90: 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ng supply the sl
cca0: 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
ccb0: 2f 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  /...cackey_slots
ccc0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
ccd0: 29 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73  );....for (currs
cce0: 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
ccf0: 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
cd00: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
cd10: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
cd20: 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
cd30: 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
cd40: 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
cd50: 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
cd60: 0a 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
cd70: 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
cd80: 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
cd90: 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
cda0: 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
cdb0: 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
cdc0: 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
cdd0: 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
cde0: 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09  ctive = 0;...}..
cdf0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
ce00: 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
ce10: 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63   */..pcsc_connec
ce20: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
ce30: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
ce40: 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
ce50: 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 43 41  _ret < 0) {...CA
ce60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ce70: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
ce80: 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
ce90: 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
cea0: 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
ceb0: 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
cec0: 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
ced0: 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
cee0: 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
cef0: 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
cf00: 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
cf10: 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
cf20: 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
cf30: 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28  ers_len);...if (
cf40: 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
cf50: 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
cf60: 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63  _SUCCESS && pcsc
cf70: 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20  _readers_len != 
cf80: 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61  0) {....pcsc_rea
cf90: 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  ders = malloc(pc
cfa0: 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
cfb0: 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
cfc0: 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _s = pcsc_reader
cfd0: 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73  s;.....scard_lis
cfe0: 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53  treaders_ret = S
cff0: 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
d000: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
d010: 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f  dle, NULL, pcsc_
d020: 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72  readers, &pcsc_r
d030: 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
d040: 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
d050: 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
d060: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
d070: 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
d080: 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72  _e = pcsc_reader
d090: 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73  s + pcsc_readers
d0a0: 5f 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73  _len;......currs
d0b0: 6c 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69  lot = 0;.....whi
d0c0: 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
d0d0: 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
d0e0: 65 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72  e) {......curr_r
d0f0: 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c  eader_len = strl
d100: 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  en(pcsc_readers)
d110: 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73  ;.......if ((pcs
d120: 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72  c_readers + curr
d130: 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70  _reader_len) > p
d140: 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
d150: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
d160: 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
d170: 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
d180: 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65  = 0) {.......bre
d190: 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09  ak;......}......
d1a0: 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d  .if (currslot >=
d1b0: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
d1c0: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
d1d0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
d1e0: 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45  )) {.......CACKE
d1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d200: 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65  Found more reade
d210: 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72  rs than slots ar
d220: 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a  e available!");.
d230: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
d240: 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45  ...}.......CACKE
d250: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d260: 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73  Found reader: %s
d270: 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29  ", pcsc_readers)
d280: 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20  ;......./* Only 
d290: 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
d2a0: 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
d2b0: 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
d2c0: 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
d2d0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
d2e0: 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
d2f0: 69 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63  ist) {.......cac
d300: 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
d310: 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
d320: 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
d330: 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
d340: 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75  c_reader = strdu
d350: 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  p(pcsc_readers);
d360: 0a 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
d370: 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
d380: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
d390: 64 20 3d 20 30 3b 0a 09 09 09 09 09 7d 0a 09 09  d = 0;......}...
d3a0: 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
d3b0: 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
d3c0: 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
d3d0: 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
d3e0: 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
d3f0: 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
d400: 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
d410: 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
d420: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
d430: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d440: 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
d450: 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
d460: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
d470: 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
d480: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
d490: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
d4a0: 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
d4b0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
d4c0: 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
d4d0: 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
d4e0: 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
d4f0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
d500: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d510: 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
d520: 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
d530: 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
d540: 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
d550: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
d560: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
d570: 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
d580: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
d590: 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
d5a0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
d5b0: 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
d5c0: 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
d5d0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
d5e0: 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
d5f0: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
d600: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d610: 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
d620: 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
d630: 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
d640: 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
d650: 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
d660: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
d670: 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
d680: 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
d690: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
d6a0: 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
d6b0: 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
d6c0: 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
d6d0: 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
d6e0: 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
d6f0: 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
d700: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d710: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
d720: 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
d730: 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
d740: 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
d750: 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
d760: 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
d770: 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
d780: 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
d790: 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
d7a0: 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
d7b0: 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
d7c0: 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
d7d0: 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
d7e0: 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
d7f0: 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
d800: 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
d810: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d820: 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
d830: 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
d840: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
d850: 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
d860: 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
d870: 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
d880: 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
d890: 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
d8a0: 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
d8b0: 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
d8c0: 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
d8d0: 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
d8e0: 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
d8f0: 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
d900: 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
d910: 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
d920: 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 62 79  y Slot";..int by
d930: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43  tes_to_copy;...C
d940: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d950: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d960: 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
d970: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
d980: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
d990: 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
d9a0: 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
d9b0: 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
d9c0: 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
d9d0: 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
d9e0: 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
d9f0: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
da00: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
da10: 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
da20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
da30: 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
da40: 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
da50: 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
da60: 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
da70: 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
da80: 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
da90: 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
daa0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
dab0: 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
dac0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
dad0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
dae0: 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
daf0: 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
db00: 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
db10: 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
db20: 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
db30: 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
db40: 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
db50: 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
db60: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
db70: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
db80: 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
db90: 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
dba0: 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
dbb0: 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
dbc0: 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
dbd0: 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
dbe0: 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ion, ' ', sizeof
dbf0: 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
dc00: 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
dc10: 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  py(pInfo->slotDe
dc20: 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44  scription, slotD
dc30: 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
dc40: 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69  of(slotDescripti
dc50: 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  on) - 1);...mems
dc60: 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
dc70: 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
dc80: 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
dc90: 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a  ufacturerID));..
dca0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
dcb0: 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73   strlen(cackey_s
dcc0: 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73  lots[slotID].pcs
dcd0: 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28  c_reader);..if (
dce0: 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
dcf0: 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20  nufacturerID) < 
dd00: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
dd10: 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
dd20: 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d   = sizeof(pInfo-
dd30: 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
dd40: 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e  ;..}..memcpy(pIn
dd50: 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
dd60: 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ID, cackey_slots
dd70: 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
dd80: 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63  ader, bytes_to_c
dd90: 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  opy);...pInfo->f
dda0: 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69 66 20 28  lags = 0;...if (
ddb0: 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
ddc0: 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
ddd0: 74 73 5b 73 6c 6f 74 49 44 5d 29 29 20 7b 0a 09  ts[slotID])) {..
dde0: 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
ddf0: 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
de00: 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  NT;..}...pInfo->
de10: 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
de20: 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
de30: 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
de40: 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
de50: 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
de60: 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
de70: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
de80: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
de90: 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
dea0: 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
deb0: 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
dec0: 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
ded0: 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
dee0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
def0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
df00: 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
df10: 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
df20: 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
df30: 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
df40: 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
df50: 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
df60: 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
df70: 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
df80: 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
df90: 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
dfa0: 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
dfb0: 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
dfc0: 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
dfd0: 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
dfe0: 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
dff0: 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
e000: 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
e010: 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 0a 09 43 41  CAC Token";...CA
e020: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e030: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
e040: 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
e050: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
e060: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
e070: 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
e080: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
e090: 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
e0a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
e0b0: 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
e0c0: 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
e0d0: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
e0e0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
e0f0: 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
e100: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
e110: 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
e120: 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
e130: 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
e140: 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
e150: 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
e160: 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
e170: 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
e180: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
e190: 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
e1a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e1b0: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
e1c0: 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
e1d0: 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
e1e0: 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
e1f0: 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
e200: 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
e210: 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
e220: 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
e230: 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
e240: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e250: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
e260: 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
e270: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
e280: 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
e290: 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
e2a0: 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
e2b0: 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
e2c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
e2d0: 74 49 44 5d 29 29 20 7b 0a 09 09 43 41 43 4b 45  tID])) {...CACKE
e2e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e2f0: 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
e300: 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
e310: 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
e320: 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
e330: 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b  EN_NOT_PRESENT);
e340: 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ..}...memset(pIn
e350: 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20  fo->label, ' ', 
e360: 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
e370: 62 65 6c 29 29 3b 0a 09 69 66 20 28 31 29 20 7b  bel));..if (1) {
e380: 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
e390: 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c  >label, defaultL
e3a0: 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66  abel, sizeof(def
e3b0: 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b  aultLabel) - 1);
e3c0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 7d 0a 0a 09  ..} else {..}...
e3d0: 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
e3e0: 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
e3f0: 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
e400: 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
e410: 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
e420: 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
e430: 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
e440: 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
e450: 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
e460: 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
e470: 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f  odel, ' ', sizeo
e480: 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29  f(pInfo->model))
e490: 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
e4a0: 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73  >model, model, s
e4b0: 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31  izeof(model) - 1
e4c0: 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  );...memset(pInf
e4d0: 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c  o->serialNumber,
e4e0: 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
e4f0: 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72  fo->serialNumber
e500: 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ));...memset(pIn
e510: 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27  fo->utcTime, ' '
e520: 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
e530: 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e  utcTime));...pIn
e540: 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
e550: 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63  ion.major = (cac
e560: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
e570: 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
e580: 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65  .pInfo->hardware
e590: 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
e5a0: 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
e5b0: 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66  on() >> 8) & 0xf
e5c0: 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d  f;...pInfo->firm
e5d0: 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
e5e0: 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f  r = 0x00;..pInfo
e5f0: 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f  ->firmwareVersio
e600: 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a  n.minor = 0x00;.
e610: 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
e620: 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45   CKF_WRITE_PROTE
e630: 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  CTED | CKF_USER_
e640: 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  PIN_INITIALIZED 
e650: 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54  | CKF_TOKEN_INIT
e660: 49 41 4c 49 5a 45 44 3b 0a 0a 09 70 49 6e 66 6f  IALIZED;...pInfo
e670: 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f  ->ulMaxSessionCo
e680: 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61  unt = (sizeof(ca
e690: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
e6a0: 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
e6b0: 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31  essions[0])) - 1
e6c0: 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73  ;..pInfo->ulSess
e6d0: 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
e6e0: 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
e6f0: 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
e700: 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75  lMaxRwSessionCou
e710: 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e  nt = 0;..pInfo->
e720: 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ulRwSessionCount
e730: 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
e740: 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
e750: 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c  pInfo->ulMaxPinL
e760: 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f  en = 128;..pInfo
e770: 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20  ->ulMinPinLen = 
e780: 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  0;..pInfo->ulTot
e790: 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d  alPublicMemory =
e7a0: 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
e7b0: 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
e7c0: 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69  nfo->ulFreePubli
e7d0: 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  cMemory = CK_UNA
e7e0: 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
e7f0: 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
e800: 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f  TotalPrivateMemo
e810: 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
e820: 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
e830: 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50  ..pInfo->ulFreeP
e840: 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43  rivateMemory = C
e850: 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
e860: 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43  FORMATION;...CAC
e870: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e880: 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
e890: 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
e8a0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
e8b0: 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
e8c0: 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
e8d0: 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  , C_WaitForSlotE
e8e0: 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66  vent)(CK_FLAGS f
e8f0: 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44  lags, CK_SLOT_ID
e900: 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b  _PTR pSlotID, CK
e910: 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72  _VOID_PTR pReser
e920: 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ved) {..CACKEY_D
e930: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e940: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52  led.");...if (pR
e950: 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29  eserved != NULL)
e960: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e970: 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
e980: 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f   pReserved is no
e990: 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  t NULL.");....re
e9a0: 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
e9b0: 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
e9c0: 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
e9d0: 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
e9e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9f0: 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
ea00: 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
ea10: 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
ea20: 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
ea30: 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
ea40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ea50: 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
ea60: 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
ea70: 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
ea80: 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
ea90: 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
eaa0: 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
eab0: 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
eac0: 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
ead0: 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
eae0: 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43  MechanismList)(C
eaf0: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
eb00: 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
eb10: 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  YPE_PTR pMechani
eb20: 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  smList, CK_ULONG
eb30: 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
eb40: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eb50: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
eb60: 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
eb70: 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
eb80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
eb90: 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
eba0: 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
ebb0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
ebc0: 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
ebd0: 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
ebe0: 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
ebf0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
ec00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
ec10: 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20  rror.  pulCount 
ec20: 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
ec30: 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
ec40: 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
ec50: 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  f (pMechanismLis
ec60: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
ec70: 70 75 6c 43 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09  pulCount = 3;...
ec80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ec90: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
eca0: 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
ecb0: 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
ecc0: 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
ecd0: 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 33  f (*pulCount < 3
ece0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ecf0: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
ed00: 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d  .  Buffer too sm
ed10: 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  all.");....retur
ed20: 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  n(CKR_BUFFER_TOO
ed30: 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d  _SMALL);..}...pM
ed40: 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20  echanismList[0] 
ed50: 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a  = CKM_RSA_PKCS;.
ed60: 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
ed70: 31 5d 20 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53  1] = CKM_SHA1_RS
ed80: 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75  A_PKCS;..*pulCou
ed90: 6e 74 20 3d 20 32 3b 0a 0a 09 43 41 43 4b 45 59  nt = 2;...CACKEY
eda0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
edb0: 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
edc0: 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
edd0: 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
ede0: 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
edf0: 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
ee00: 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
ee10: 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
ee20: 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  otID, CK_MECHANI
ee30: 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b  SM_TYPE type, CK
ee40: 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f  _MECHANISM_INFO_
ee50: 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 43 41  PTR pInfo) {..CA
ee60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ee70: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
ee80: 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
ee90: 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
eea0: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
eeb0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
eec0: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
eed0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eee0: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
eef0: 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
ef00: 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
ef10: 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
ef20: 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
ef30: 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
ef40: 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
ef50: 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
ef60: 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
ef70: 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
ef80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ef90: 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
efa0: 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
efb0: 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
efc0: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
efd0: 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
efe0: 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
eff0: 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
f000: 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
f010: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
f020: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
f030: 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
f040: 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
f050: 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
f060: 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
f070: 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
f080: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
f090: 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
f0a0: 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
f0b0: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
f0c0: 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
f0d0: 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
f0e0: 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69  .}.../* XXX: Thi
f0f0: 73 20 69 73 20 75 6e 74 65 73 74 65 64 2c 20 61  s is untested, a
f100: 6e 64 20 66 75 72 74 68 65 72 20 49 27 6d 20 6e  nd further I'm n
f110: 6f 74 20 72 65 61 6c 6c 79 20 73 75 72 65 20 69  ot really sure i
f120: 66 20 74 68 69 73 20 69 73 20 63 6f 72 72 65 63  f this is correc
f130: 74 2e 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 74  t. */..switch (t
f140: 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
f150: 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70  M_RSA_PKCS:....p
f160: 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69  Info->ulMinKeySi
f170: 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e  ze = 512;....pIn
f180: 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65  fo->ulMaxKeySize
f190: 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66   = 8192;....pInf
f1a0: 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
f1b0: 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20  W | CKF_ENCRYPT 
f1c0: 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20  | CKF_DECRYPT | 
f1d0: 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56  CKF_SIGN | CKF_V
f1e0: 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b  ERIFY;....break;
f1f0: 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
f200: 58 5f 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d  X_509:....pInfo-
f210: 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
f220: 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
f230: 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
f240: 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
f250: 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
f260: 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
f270: 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
f280: 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
f290: 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
f2a0: 73 65 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f  se CKM_SHA1_RSA_
f2b0: 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  PKCS:....pInfo->
f2c0: 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
f2d0: 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
f2e0: 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
f2f0: 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
f300: 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
f310: 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
f320: 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
f330: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
f340: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
f350: 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
f360: 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
f370: 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
f380: 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
f390: 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
f3a0: 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
f3b0: 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
f3c0: 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
f3d0: 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
f3e0: 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
f3f0: 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
f400: 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
f410: 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
f420: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f430: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
f440: 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
f450: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
f460: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f470: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
f480: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
f490: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
f4a0: 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
f4b0: 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
f4c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f4d0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
f4e0: 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
f4f0: 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
f500: 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
f510: 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
f520: 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
f530: 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
f540: 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
f550: 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
f560: 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
f570: 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
f580: 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
f590: 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
f5a0: 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
f5b0: 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
f5c0: 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
f5d0: 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
f5e0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
f5f0: 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
f600: 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
f610: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f620: 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
f630: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
f640: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
f650: 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
f660: 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
f670: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f680: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
f690: 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
f6a0: 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
f6b0: 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
f6c0: 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
f6d0: 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
f6e0: 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
f6f0: 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
f700: 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
f710: 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
f720: 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
f730: 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
f740: 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
f750: 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
f760: 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
f770: 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
f780: 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
f790: 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
f7a0: 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
f7b0: 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
f7c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f7d0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
f7e0: 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
f7f0: 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
f800: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
f810: 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
f820: 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
f830: 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
f840: 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
f850: 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
f860: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f870: 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
f880: 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
f890: 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
f8a0: 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
f8b0: 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
f8c0: 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
f8d0: 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
f8e0: 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
f8f0: 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e  ON(CK_RV, C_Open
f900: 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
f910: 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
f920: 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
f930: 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
f940: 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
f950: 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
f960: 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
f970: 53 65 73 73 69 6f 6e 29 20 7b 0a 09 73 74 72 75  Session) {..stru
f980: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f990: 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
f9a0: 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63  entities;..struc
f9b0: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
f9c0: 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  y *identities;..
f9d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
f9e0: 78 2c 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69  x, num_ids, id_i
f9f0: 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65  dx, curr_id_type
fa00: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
fa10: 20 6e 75 6d 5f 63 65 72 74 73 2c 20 63 65 72 74   num_certs, cert
fa20: 5f 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _idx;..int mutex
fa30: 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f  _retval;..int fo
fa40: 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b  und_session = 0;
fa50: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
fa60: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
fa70: 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  );...if (slotID 
fa80: 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
fa90: 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
faa0: 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
fab0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
fac0: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
fad0: 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
fae0: 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
faf0: 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
fb00: 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
fb10: 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
fb20: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
fb30: 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
fb40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
fb50: 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
fb60: 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
fb70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fb80: 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
fb90: 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
fba0: 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
fbb0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
fbc0: 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
fbd0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
fbe0: 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
fbf0: 0a 09 7d 0a 0a 09 69 66 20 28 28 66 6c 61 67 73  ..}...if ((flags
fc00: 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45   & CKF_SERIAL_SE
fc10: 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45  SSION) != CKF_SE
fc20: 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a  RIAL_SESSION) {.
fc30: 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
fc40: 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f  SION_PARALLEL_NO
fc50: 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d  T_SUPPORTED);..}
fc60: 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
fc70: 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
fc80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
fc90: 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
fca0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
fcb0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
fcc0: 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
fcd0: 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f  IALIZED);..}.../
fce0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
fcf0: 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c  e card is actual
fd00: 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20  ly in the slot. 
fd10: 2a 2f 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  */..if (!cackey_
fd20: 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
fd30: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
fd40: 49 44 5d 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  ID])) {...CACKEY
fd50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
fd60: 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
fd70: 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
fd80: 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
fd90: 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 72 65 74  EMOVED");....ret
fda0: 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
fdb0: 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75  EMOVED);..}...mu
fdc0: 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
fdd0: 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
fde0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
fdf0: 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
fe00: 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
fe10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fe20: 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
fe30: 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
fe40: 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
fe50: 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 66  L_ERROR);..}...f
fe60: 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
fe70: 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
fe80: 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
fe90: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
fea0: 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
feb0: 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
fec0: 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
fed0: 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
fee0: 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
fef0: 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
ff00: 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
ff10: 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
ff20: 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
ff30: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
ff40: 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
ff50: 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
ff60: 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
ff70: 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
ff80: 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
ff90: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
ffa0: 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
ffb0: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
ffc0: 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
ffd0: 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
ffe0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
fff0: 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
10000 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
10010 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
10020 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
10030 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
10040 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
10050 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
10060 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
10070 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
10080 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
10090 3d 20 30 3b 0a 0a 09 09 09 70 63 73 63 5f 69 64  = 0;.....pcsc_id
100a0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
100b0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
100c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
100d0 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
100e0 65 72 74 73 29 3b 0a 09 09 09 69 66 20 28 70 63  erts);....if (pc
100f0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
10100 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 2f 2a 20   NULL) {...../* 
10110 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
10120 66 20 49 44 73 20 74 6f 20 6e 75 6d 62 65 72 20  f IDs to number 
10130 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
10140 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
10150 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
10160 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
10170 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
10180 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
10190 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64   = malloc(num_id
101a0 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  s * sizeof(*iden
101b0 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 09 69  tities));......i
101c0 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 09 09 66  d_idx = 0;.....f
101d0 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
101e0 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
101f0 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
10200 2b 2b 29 20 7b 0a 09 09 09 09 09 66 6f 72 20 28  ++) {......for (
10210 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43  curr_id_type = C
10220 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20  KO_CERTIFICATE; 
10230 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20  curr_id_type <= 
10240 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b  CKO_PRIVATE_KEY;
10250 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29   curr_id_type++)
10260 20 7b 0a 09 09 09 09 09 09 69 64 65 6e 74 69 74   {.......identit
10270 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
10280 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
10290 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
102a0 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
102b0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
102c0 72 74 5f 69 64 78 5d 2c 20 2d 31 2c 20 26 69 64  rt_idx], -1, &id
102d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
102e0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
102f0 74 29 3b 0a 0a 09 09 09 09 09 09 69 66 20 28 69  t);........if (i
10300 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
10310 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 3d 20  ].attributes == 
10320 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 69  NULL) {........i
10330 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
10340 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
10350 6e 74 20 3d 20 30 3b 0a 09 09 09 09 09 09 7d 0a  nt = 0;.......}.
10360 0a 09 09 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b  .......id_idx++;
10370 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
10380 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
10390 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
103a0 65 73 20 3d 20 69 64 65 6e 74 69 74 69 65 73 3b  es = identities;
103b0 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
103c0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
103d0 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d  ties_count = num
103e0 5f 69 64 73 3b 0a 0a 09 09 09 09 63 61 63 6b 65  _ids;......cacke
103f0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
10400 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
10410 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 09  m_certs, 1);....
10420 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
10430 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
10440 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
10450 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
10460 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
10470 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
10480 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
10490 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
104a0 3d 20 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  = 0;.....break;.
104b0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
104c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
104d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
104e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
104f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
10500 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
10510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
10520 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
10530 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
10540 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
10550 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
10560 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
10570 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10580 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
10590 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
105a0 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
105b0 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
105c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
105d0 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
105e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
105f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
10600 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
10610 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
10620 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
10630 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
10640 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
10650 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
10660 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
10670 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 41 54 54 52  sion) {..CK_ATTR
10680 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
10690 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
106a0 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64   id_idx, attr_id
106b0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
106c0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
106d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
106e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
106f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
10700 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
10710 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
10720 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
10730 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
10740 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
10750 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
10760 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
10770 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
10780 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
10790 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
107a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
107b0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
107c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
107d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
107e0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
107f0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
10800 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
10810 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
10820 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
10830 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
10840 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
10850 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
10860 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
10870 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
10880 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
10890 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
108a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
108b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
108c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
108d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
108e0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
108f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
10900 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
10910 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
10920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10930 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
10940 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
10950 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
10960 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
10970 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
10980 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
10990 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20  ssion].active = 
109a0 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  0;..if (cackey_s
109b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
109c0 5d 2e 69 64 65 6e 74 69 74 69 65 73 29 20 7b 0a  ].identities) {.
109d0 09 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
109e0 30 3b 20 69 64 5f 69 64 78 20 3c 20 63 61 63 6b  0; id_idx < cack
109f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
10a00 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
10a10 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b  _count; id_idx++
10a20 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
10a30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
10a40 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
10a50 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
10a60 65 73 29 20 7b 0a 09 09 09 09 66 6f 72 20 28 61  es) {.....for (a
10a70 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
10a80 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
10a90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
10aa0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ].identities[id_
10ab0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
10ac0 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
10ad0 2b 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 61  +) {......curr_a
10ae0 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ttr = &cackey_se
10af0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
10b00 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
10b10 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61  dx].attributes[a
10b20 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 09  ttr_idx];.......
10b30 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
10b40 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 09 66  Value) {.......f
10b50 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  ree(curr_attr->p
10b60 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 7d 0a 09  Value);......}..
10b70 09 09 09 7d 0a 0a 09 09 09 09 66 72 65 65 28 63  ...}......free(c
10b80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
10b90 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
10ba0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
10bb0 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 09 09  ibutes);....}...
10bc0 7d 0a 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79  }....free(cackey
10bd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
10be0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 29 3b  on].identities);
10bf0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
10c00 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
10c10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
10c20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
10c30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
10c40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10c50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
10c60 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
10c70 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
10c80 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
10c90 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
10ca0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10cb0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
10cc0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
10cd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
10ce0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
10cf0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
10d00 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
10d10 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
10d20 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
10d30 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
10d40 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
10d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10d60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
10d70 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
10d80 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
10d90 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
10da0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
10db0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
10dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10dd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
10de0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
10df0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
10e00 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
10e10 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
10e20 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
10e30 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
10e40 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
10e50 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
10e60 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
10e70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10e80 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
10e90 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
10ea0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
10eb0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
10ec0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
10ed0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
10ee0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
10ef0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
10f00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
10f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10f20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
10f30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
10f40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
10f50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
10f60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
10f70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
10f80 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
10f90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
10fa0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
10fb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
10fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
10fd0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
10fe0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
10ff0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
11000 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 66 6f 72  ERROR);..}...for
11010 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
11020 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
11030 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
11040 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
11050 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
11060 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
11070 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
11080 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61  ive) {....if (ca
11090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
110a0 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f  x].slotID != slo
110b0 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  tID) {.....conti
110c0 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  nue;....}.....ca
110d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
110e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
110f0 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73  );....C_CloseSes
11100 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61  sion(idx);....ca
11110 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
11120 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
11130 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
11140 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
11150 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
11160 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
11170 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
11180 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
11190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
111a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
111b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
111c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
111d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
111e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
111f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
11200 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
11210 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
11220 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
11230 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
11240 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  RV, C_GetSession
11250 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Info)(CK_SESSION
11260 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
11270 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46  , CK_SESSION_INF
11280 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
11290 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
112a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
112b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
112c0 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
112d0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
112e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
112f0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
11300 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
11310 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
11320 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
11330 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
11340 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
11350 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11360 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
11370 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
11380 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
11390 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
113a0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
113b0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
113c0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
113d0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
113e0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
113f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
11400 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
11410 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11420 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
11430 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
11440 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
11450 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
11460 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
11470 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
11480 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
11490 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
114a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
114b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
114c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
114d0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
114e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
114f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
11500 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
11510 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
11520 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
11530 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
11540 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
11550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
11560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11570 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
11580 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
11590 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
115a0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
115b0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
115c0 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d  .pInfo->slotID =
115d0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
115e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
115f0 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65  D;..pInfo->state
11600 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
11610 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61  ns[hSession].sta
11620 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  te;..pInfo->flag
11630 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
11640 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c  ons[hSession].fl
11650 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44  ags;..pInfo->ulD
11660 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63  eviceError = cac
11670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
11680 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45  ssion].ulDeviceE
11690 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  rror;...mutex_re
116a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
116b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
116c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
116d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
116e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
116f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11700 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
11710 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
11720 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
11730 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
11740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11750 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
11760 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
11770 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
11780 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
11790 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
117a0 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  , C_GetOperation
117b0 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  State)(CK_SESSIO
117c0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
117d0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
117e0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20  OperationState, 
117f0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
11800 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
11810 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
11820 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
11830 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
11840 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
11850 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11860 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11870 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
11880 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
11890 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
118a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
118b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
118c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
118d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
118e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
118f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
11900 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
11910 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
11920 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
11930 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
11940 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
11950 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74  _RV, C_SetOperat
11960 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53  ionState)(CK_SES
11970 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
11980 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
11990 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  R pOperationStat
119a0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70  e, CK_ULONG ulOp
119b0 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c  erationStateLen,
119c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
119d0 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79  E hEncryptionKey
119e0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
119f0 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69  LE hAuthenticati
11a00 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59  onKey) {..CACKEY
11a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
11a20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
11a30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
11a40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
11a50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11a60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
11a70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
11a80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
11a90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
11aa0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
11ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
11ac0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
11ad0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
11ae0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
11af0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
11b00 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
11b10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
11b20 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
11b30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
11b40 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e  N(CK_RV, C_Login
11b50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
11b60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
11b70 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
11b80 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
11b90 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
11ba0 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
11bb0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
11bc0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
11bd0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
11be0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
11bf0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
11c00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11c10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11c20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
11c30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
11c40 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
11c50 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
11c60 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
11c70 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
11c80 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
11c90 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
11ca0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
11cb0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
11cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11cd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
11ce0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
11cf0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
11d00 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
11d10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
11d20 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65  }...if (userType
11d30 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a   != CKU_USER) {.
11d40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11d50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57  RINTF("Error.  W
11d60 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55  e only support U
11d70 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20  SER mode, asked 
11d80 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20  for %lu mode.", 
11d90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11da0 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74  userType)....ret
11db0 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50  urn(CKR_USER_TYP
11dc0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
11dd0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
11de0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
11df0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
11e00 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
11e10 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
11e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11e30 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
11e40 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
11e50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
11e60 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
11e70 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
11e80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
11e90 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
11ea0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
11eb0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
11ec0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
11ed0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11ee0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
11ef0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
11f00 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
11f10 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
11f20 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
11f30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
11f40 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
11f50 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
11f60 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
11f70 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
11f80 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
11f90 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
11fa0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
11fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11fc0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
11fd0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
11fe0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
11ff0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
12000 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
12010 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12020 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
12030 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
12040 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
12050 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
12060 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
12070 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
12080 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
12090 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
120a0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
120b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
120c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
120d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
120e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
120f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12100 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
12110 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
12120 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
12130 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
12140 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
12150 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
12160 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
12170 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
12180 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
12190 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
121a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
121b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
121c0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
121d0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
121e0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
121f0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
12200 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
12210 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
12220 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
12230 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
12240 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
12250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12270 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
12280 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
12290 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
122a0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
122b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
122c0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
122d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
122e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
122f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
12300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12310 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
12320 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
12330 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
12340 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
12350 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
12360 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
12370 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
12380 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
12390 53 53 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72  SSION;...mutex_r
123a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
123b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
123c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
123d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
123e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
123f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
12400 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
12410 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
12420 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
12430 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
12440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12450 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
12460 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
12470 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
12480 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
12490 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
124a0 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  V, C_CreateObjec
124b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
124c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
124d0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
124e0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
124f0 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
12500 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
12510 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  R phObject) {..C
12520 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12530 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
12540 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
12550 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
12560 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12570 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
12580 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
12590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
125a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
125b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
125c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
125d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
125e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
125f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
12600 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
12610 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
12620 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
12630 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
12640 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
12650 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
12660 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  CopyObject)(CK_S
12670 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
12680 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
12690 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
126a0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
126b0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
126c0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
126d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
126e0 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74  _PTR phNewObject
126f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
12700 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
12710 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
12720 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
12730 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
12740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
12750 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
12760 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
12770 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
12780 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
12790 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
127a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
127b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
127c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
127d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
127e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
127f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
12800 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
12810 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
12820 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
12830 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  RV, C_DestroyObj
12840 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ect)(CK_SESSION_
12850 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
12860 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
12870 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41  E hObject) {..CA
12880 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12890 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
128a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
128b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
128c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
128d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
128e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
128f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
12900 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
12910 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
12920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12930 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
12940 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
12950 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
12960 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
12970 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
12980 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
12990 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
129a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
129b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
129c0 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b  etObjectSize)(CK
129d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
129e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
129f0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
12a00 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ct, CK_ULONG_PTR
12a10 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43   pulSize) {..CAC
12a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12a30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
12a40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
12a50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
12a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12a70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
12a80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
12a90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
12aa0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
12ab0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
12ac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12ad0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
12ae0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
12af0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
12b00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
12b10 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
12b20 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
12b30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
12b40 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
12b50 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
12b60 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29  tAttributeValue)
12b70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
12b80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
12b90 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
12ba0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
12bb0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
12bc0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
12bd0 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49  unt) {..CK_ATTRI
12be0 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
12bf0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
12c00 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
12c10 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ty;..unsigned lo
12c20 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c  ng identity_idx,
12c30 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f   attr_idx, sess_
12c40 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64  attr_idx, num_id
12c50 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  s;..int mutex_re
12c60 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74  tval;..CK_RV ret
12c70 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43  val = CKR_OK;..C
12c80 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
12c90 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
12ca0 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45  alueLen;...CACKE
12cb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12cc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
12cd0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
12ce0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
12cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12d00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
12d10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
12d20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
12d30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
12d40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
12d50 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
12d60 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
12d70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
12d80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
12d90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
12da0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
12db0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
12dc0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
12dd0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
12de0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
12df0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
12e00 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f  ID);..}...if (hO
12e10 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09  bject == 0) {...
12e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12e30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a  NTF("Error.  Obj
12e40 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ect handle out o
12e50 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
12e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
12e70 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
12e80 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43  D);..}...if (ulC
12e90 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  ount == 0) {.../
12ea0 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c  * Short circuit,
12eb0 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73   if zero objects
12ec0 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20   were specified 
12ed0 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d  return zero item
12ee0 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f  s immediately */
12ef0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12f00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
12f10 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
12f20 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
12f30 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
12f40 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
12f50 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d  .if (pTemplate =
12f60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
12f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12f80 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61  "Error.  pTempla
12f90 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  te is NULL.");..
12fa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
12fb0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
12fc0 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d  ..identity_idx =
12fd0 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09   hObject - 1;...
12fe0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
12ff0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
13000 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13010 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13020 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13040 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
13050 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13060 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13070 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13080 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
13090 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
130a0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
130b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
130c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
130d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
130e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
130f0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
13100 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
13110 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
13120 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
13130 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20  ..}...num_ids = 
13140 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13150 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
13160 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66  ties_count;...if
13170 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e   (identity_idx >
13180 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63  = num_ids) {...c
13190 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
131a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
131b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
131c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
131d0 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
131e0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  e out of range. 
131f0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20   identity_idx = 
13200 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25  %lu, num_ids = %
13210 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu.", (unsigned 
13220 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
13230 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
13240 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09  ng) num_ids);...
13250 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45  .return(CKR_OBJE
13260 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  CT_HANDLE_INVALI
13270 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
13280 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
13290 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
132a0 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69  dentities[identi
132b0 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28  ty_idx];...for (
132c0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
132d0 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  tr_idx < ulCount
132e0 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
132f0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70  ..curr_attr = &p
13300 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64  Template[attr_id
13310 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20  x];....pValue = 
13320 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
13330 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
13340 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
13350 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69  UG_PRINTF("Looki
13360 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
13370 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69   0x%08lx (identi
13380 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75  ty:%lu) ...", (u
13390 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
133a0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
133b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
133c0 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09  dentity_idx);...
133d0 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f  .for (sess_attr_
133e0 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74  idx = 0; sess_at
133f0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
13400 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  y->attributes_co
13410 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  unt; sess_attr_i
13420 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69  dx++) {....if (i
13430 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
13440 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
13450 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f  x].type == curr_
13460 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09  attr->type) {...
13470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13480 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e  RINTF(" ... foun
13490 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25  d it, pValue = %
134a0 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  p, ulValueLen = 
134b0 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e  %lu", identity->
134c0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
134d0 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
134e0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
134f0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
13500 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
13510 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c  );..........pVal
13520 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61  ue = identity->a
13530 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
13540 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b  ttr_idx].pValue;
13550 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
13560 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  = identity->attr
13570 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
13580 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
13590 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
135a0 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
135b0 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b  lue && pValue) {
135c0 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
135d0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d  r->ulValueLen >=
135e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09   ulValueLen) {..
135f0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
13600 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61  ttr->pValue, pVa
13610 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29  lue, ulValueLen)
13620 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
13630 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28  ..ulValueLen = (
13640 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09  CK_LONG) -1;....
13650 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
13660 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
13670 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72  ....}...}....cur
13680 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
13690 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
136a0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
136b0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
136c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
136d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
136e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
136f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13700 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13710 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
13720 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
13730 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
13740 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72  ROR);..}...if (r
13750 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54  etval == CKR_ATT
13760 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
13770 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  LID) {...CACKEY_
13780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13790 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52  turning CKR_ATTR
137a0 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
137b0 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  ID (%i)", (int) 
137c0 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
137d0 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
137e0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
137f0 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ALL) {...CACKEY_
13800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13810 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
13820 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69  ER_TOO_SMALL (%i
13830 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  )", (int) retval
13840 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72  );..} else if (r
13850 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29  etval == CKR_OK)
13860 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13870 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
13880 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
13890 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
138a0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
138b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
138c0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
138d0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
138e0 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  .}...return(retv
138f0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
13900 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
13910 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  , C_SetAttribute
13920 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
13930 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
13940 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
13950 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
13960 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
13970 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
13980 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41  G ulCount) {..CA
13990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
139a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
139b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
139c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
139d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
139f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
13a00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
13a10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
13a20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
13a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13a40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
13a50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
13a60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
13a70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
13a80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
13a90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
13aa0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
13ab0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
13ac0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
13ad0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28  indObjectsInit)(
13ae0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
13af0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41  E hSession, CK_A
13b00 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
13b10 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
13b20 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 69 6e 74   ulCount) {..int
13b30 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
13b40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13b50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
13b60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
13b70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
13b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13b90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
13ba0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
13bb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
13bc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
13bd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
13be0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
13bf0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
13c00 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
13c10 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
13c20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
13c30 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
13c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13c50 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
13c60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
13c70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
13c80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
13c90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
13ca0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
13cb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
13cc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13cd0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13ce0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13d00 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
13d10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
13d20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
13d30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
13d40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
13d50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
13d60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
13d70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
13d80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
13d90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13da0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
13db0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
13dc0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
13dd0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
13de0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
13df0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
13e00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
13e10 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
13e20 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
13e30 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
13e40 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
13e50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13e60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
13e70 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  ch already activ
13e80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
13e90 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
13ea0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
13eb0 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
13ec0 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
13ed0 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
13ee0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
13ef0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
13f00 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
13f10 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
13f20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
13f30 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
13f40 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
13f50 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
13f60 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
13f70 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
13f80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
13f90 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
13fa0 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
13fb0 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
13fc0 61 74 65 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  ate));...} else 
13fd0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
13fe0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
13ff0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
14000 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  t = 0;....cackey
14010 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
14020 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
14030 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20   = NULL;...}..} 
14040 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43  else {...if (ulC
14050 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
14060 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
14070 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
14080 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ck);.....CACKEY_
14090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
140a0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65  ror.  Search que
140b0 72 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ry specified as 
140c0 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72  NULL, but number
140d0 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20   of query terms 
140e0 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73  not specified as
140f0 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72   0.");.....retur
14100 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
14110 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  BAD);...}....cac
14120 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
14130 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
14140 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ery_count = 0;..
14150 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
14160 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
14170 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a  h_query = NULL;.
14180 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
14190 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
141a0 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31  earch_active = 1
141b0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
141c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
141d0 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b  rch_curr_id = 0;
141e0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
141f0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
14200 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
14210 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
14220 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
14230 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14240 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14250 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
14260 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
14270 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
14280 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
14290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
142a0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
142b0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
142c0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
142d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
142e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
142f0 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53  indObjects)(CK_S
14300 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
14310 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
14320 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
14330 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  bject, CK_ULONG 
14340 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
14350 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
14360 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b  ulObjectCount) {
14370 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
14380 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
14390 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  d;..CK_ATTRIBUTE
143a0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b   *curr_attr;..CK
143b0 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69  _ULONG curr_id_i
143c0 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  dx, curr_out_id_
143d0 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69  idx, curr_attr_i
143e0 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64  dx, sess_attr_id
143f0 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74  x;..CK_ULONG mat
14400 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76  ched_count, prev
14410 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a  _matched_count;.
14420 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
14430 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
14440 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
14450 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
14460 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
14470 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14480 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
14490 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
144a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
144b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
144c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
144d0 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
144e0 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
144f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
14510 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
14520 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
14530 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
14540 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
14550 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
14560 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
14570 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
14580 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
14590 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
145a0 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
145b0 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
145c0 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
145d0 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
145e0 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
145f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14600 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
14610 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
14620 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
14630 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14640 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
14650 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
14660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
14670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
14680 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
14690 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
146a0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
146b0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
146c0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
146d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
146e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
146f0 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
14700 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
14710 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
14720 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
14730 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
14740 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
14750 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
14760 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
14770 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
14780 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
14790 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
147a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
147b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
147c0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
147d0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
147e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
147f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
14800 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
14810 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
14820 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
14830 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
14840 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
14850 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
14860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14870 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
14880 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
14890 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
148a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
148b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
148c0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
148d0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
148e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
148f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
14900 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14910 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
14920 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
14930 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
14940 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
14950 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
14960 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
14970 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
14980 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
14990 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
149a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
149b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
149c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
149d0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
149e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
149f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
14a00 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
14a10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 75  ALIZED);..}...cu
14a20 72 72 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  rr_id_idx = 0;..
14a30 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20  curr_out_id_idx 
14a40 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f  = 0;..for (curr_
14a50 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f  id_idx = cackey_
14a60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
14a70 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
14a80 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c  d; curr_id_idx <
14a90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
14aa0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
14ab0 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75  ities_count && u
14ac0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b  lMaxObjectCount;
14ad0 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20   curr_id_idx++) 
14ae0 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63  {...curr_id = &c
14af0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
14b00 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
14b10 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d  ies[curr_id_idx]
14b20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
14b30 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73  G_PRINTF("Proces
14b40 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c  sing identity:%l
14b50 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
14b60 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  ng) curr_id_idx)
14b70 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  ;....matched_cou
14b80 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28  nt = 0;....for (
14b90 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20  curr_attr_idx = 
14ba0 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  0; curr_attr_idx
14bb0 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
14bc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
14bd0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
14be0 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b   curr_attr_idx++
14bf0 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63  ) {....prev_matc
14c00 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63  hed_count = matc
14c10 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63  hed_count;.....c
14c20 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b  urr_attr = &cack
14c30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
14c40 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
14c50 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78  ry[curr_attr_idx
14c60 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ];.....CACKEY_DE
14c70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68  BUG_PRINTF("  Ch
14c80 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ecking for attri
14c90 62 75 74 65 20 30 78 25 30 38 6c 78 20 69 6e 20  bute 0x%08lx in 
14ca0 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
14cb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
14cc0 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
14cd0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
14ce0 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  idx);....CACKEY_
14cf0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
14d00 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e      Value lookin
14d10 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74  g for:", curr_at
14d20 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72  tr->pValue, curr
14d30 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
14d40 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73  n);.....for (ses
14d50 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
14d60 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
14d70 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
14d80 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f  tes_count; sess_
14d90 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
14da0 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 61  ..if (curr_id->a
14db0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
14dc0 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d  ttr_idx].type ==
14dd0 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
14de0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
14df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
14e00 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
14e10 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
14e20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14e30 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
14e40 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
14e50 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  , curr_id->attri
14e60 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
14e70 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 63 75 72  idx].pValue, cur
14e80 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
14e90 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
14ea0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
14eb0 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
14ec0 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
14ed0 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
14ee0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
14ef0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
14f00 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
14f10 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65 64  ;........matched
14f20 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09  _count++;.......
14f30 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
14f40 20 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 61   .....if (curr_a
14f50 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  ttr->ulValueLen 
14f60 3d 3d 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  == curr_id->attr
14f70 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
14f80 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  _idx].ulValueLen
14f90 20 26 26 20 6d 65 6d 63 6d 70 28 63 75 72 72 5f   && memcmp(curr_
14fa0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
14fb0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
14fc0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
14fd0 2e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  .pValue, curr_id
14fe0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
14ff0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
15000 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a  lueLen) == 0) {.
15010 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15020 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
15030 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
15040 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  t match");......
15050 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
15060 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
15070 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
15080 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
15090 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
150a0 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
150b0 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
150c0 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
150d0 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
150e0 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
150f0 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
15100 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
15110 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
15120 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
15130 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
15140 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
15150 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
15160 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
15170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15180 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
15190 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
151a0 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
151b0 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
151c0 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
151d0 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
151e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
151f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
15200 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
15210 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
15220 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
15230 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
15240 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
15250 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
15260 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
15270 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
15280 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
15290 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
152a0 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
152b0 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
152c0 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
152d0 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
152e0 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
152f0 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
15300 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
15310 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
15320 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
15330 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
15340 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
15350 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
15360 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
15370 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
15380 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
15390 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
153a0 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
153b0 69 64 78 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  idx;...mutex_ret
153c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
153d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
153e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
153f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
15400 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
15410 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15420 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
15430 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
15440 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
15450 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
15460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15470 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
15480 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65  K (%i), num obje
15490 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f  cts = %lu", CKR_
154a0 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  OK, *pulObjectCo
154b0 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
154c0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
154d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
154e0 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
154f0 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  tsFinal)(CK_SESS
15500 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
15510 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
15520 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
15530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15540 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15550 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15560 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15580 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
15590 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
155a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
155b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
155c0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
155d0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
155e0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
155f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
15600 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
15610 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
15620 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
15630 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15640 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
15650 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
15660 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
15670 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
15680 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
15690 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
156a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
156b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
156c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
156d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
156e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
156f0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
15700 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
15710 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
15720 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
15730 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
15740 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
15750 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
15760 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
15770 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
15780 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15790 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
157a0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
157b0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
157c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
157d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
157e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
157f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
15800 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
15810 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
15820 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
15830 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
15840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15850 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
15860 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
15870 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
15880 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
15890 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63  IALIZED);..}...c
158a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
158b0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
158c0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 69 66 20  active = 0;..if 
158d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
158e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
158f0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
15900 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
15910 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
15920 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
15930 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
15940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
15950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
15960 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
15970 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
15980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15990 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
159a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
159b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
159c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
159d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
159e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
159f0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
15a00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
15a10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
15a20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
15a30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
15a40 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
15a50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
15a60 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
15a70 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
15a80 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
15a90 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
15aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ab0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
15ac0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
15ad0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
15ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15af0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
15b00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
15b10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
15b20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
15b30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
15b40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15b50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
15b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
15b70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
15b80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
15b90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
15ba0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
15bb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
15bc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
15bd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
15be0 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
15bf0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
15c00 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
15c10 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
15c20 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
15c30 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
15c40 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
15c50 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
15c60 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
15c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15c80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
15c90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
15ca0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
15cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15cc0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
15cd0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
15ce0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
15cf0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
15d00 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
15d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15d20 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
15d30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
15d40 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
15d50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
15d60 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
15d70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
15d80 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
15d90 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
15da0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
15db0 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
15dc0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
15dd0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
15de0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
15df0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
15e00 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
15e10 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
15e20 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
15e30 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
15e40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15e50 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
15e60 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
15e70 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
15e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15e90 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
15ea0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
15eb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
15ec0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
15ed0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
15ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ef0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
15f00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
15f10 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
15f20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
15f30 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
15f40 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
15f50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
15f60 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
15f70 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
15f80 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
15f90 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
15fa0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
15fb0 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
15fc0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
15fd0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
15fe0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
15ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16000 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
16010 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
16020 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
16030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16040 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
16050 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
16060 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16070 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
16080 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
16090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
160a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
160b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
160c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
160d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
160e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
160f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
16100 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
16110 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
16120 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
16130 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
16140 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
16150 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
16160 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
16170 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
16180 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
16190 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
161a0 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
161b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
161c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
161d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
161e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
161f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16200 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
16210 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
16220 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
16230 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
16240 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
16250 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
16260 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
16270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16280 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
16290 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
162a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
162b0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
162c0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
162d0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
162e0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
162f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16300 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
16310 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
16320 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
16330 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
16340 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
16350 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
16360 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
16370 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
16380 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
16390 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
163a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
163b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
163c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
163d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
163e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
163f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
16400 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
16410 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
16420 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
16430 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
16440 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
16450 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16460 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
16470 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
16480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16490 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
164a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
164b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
164c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
164d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
164e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
164f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
16500 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
16510 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
16520 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
16530 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16540 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
16550 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
16560 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
16570 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
16580 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
16590 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
165a0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
165b0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
165c0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
165d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
165e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
165f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
16600 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
16610 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
16620 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
16630 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
16640 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
16650 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
16660 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
16670 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
16680 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
16690 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
166a0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
166b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
166c0 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
166d0 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  e out of range."
166e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
166f0 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
16700 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
16710 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
16720 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
16730 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
16740 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
16750 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
16760 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
16770 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
16780 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
16790 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
167a0 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70  pt_mech_parm = p
167b0 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61  Mechanism->pPara
167c0 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73  meter;..cackey_s
167d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
167e0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
167f0 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e  armlen = pMechan
16800 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72  ism->ulParameter
16810 4c 65 6e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  Len;...mutex_ret
16820 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
16830 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16840 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16850 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16860 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16870 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16880 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
16890 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
168a0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
168b0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
168c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
168d0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
168e0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
168f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
16900 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
16910 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
16920 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
16930 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
16940 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
16950 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
16960 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
16970 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
16980 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
16990 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
169a0 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
169b0 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
169c0 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
169d0 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
169e0 65 63 72 79 70 74 5f 72 65 74 3b 0a 0a 09 43 41  ecrypt_ret;...CA
169f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16a00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
16a10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
16a20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
16a30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16a40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
16a50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
16a60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
16a70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
16a80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
16a90 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55  pulDataLen == NU
16aa0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
16ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16ac0 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69  or. pulDataLen i
16ad0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
16ae0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
16af0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61  TS_BAD);..}...da
16b00 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a  talen_update = *
16b10 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65  pulDataLen;...de
16b20 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
16b30 63 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73  cryptUpdate(hSes
16b40 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64  sion, pEncrypted
16b50 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65  Data, ulEncrypte
16b60 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c  dDataLen, pData,
16b70 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65   &datalen_update
16b80 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
16b90 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
16ba0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16bb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16bc0 44 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20  DecryptUpdate() 
16bd0 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65  returned failure
16be0 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28   (rv = %lu).", (
16bf0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
16c00 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09  ecrypt_ret);....
16c10 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72  return(decrypt_r
16c20 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44  et);..}...if (pD
16c30 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b  ata) {...pData +
16c40 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  = datalen_update
16c50 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69  ;..}..datalen_fi
16c60 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65  nal = *pulDataLe
16c70 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n - datalen_upda
16c80 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  te;...decrypt_re
16c90 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  t = C_DecryptFin
16ca0 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  al(hSession, pDa
16cb0 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e  ta, &datalen_fin
16cc0 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  al);..if (decryp
16cd0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
16ce0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16cf0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
16d00 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29    DecryptFinal()
16d10 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
16d20 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
16d30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16d40 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09  decrypt_ret);...
16d50 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
16d60 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44  ret);..}...*pulD
16d70 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e  ataLen = datalen
16d80 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65  _update + datale
16d90 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45  n_final;...CACKE
16da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16db0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
16dc0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
16dd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
16de0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
16df0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
16e00 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 29  C_DecryptUpdate)
16e10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
16e20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
16e30 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
16e40 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
16e50 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
16e60 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
16e70 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
16e80 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
16e90 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
16ea0 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a  YTE buf[16384];.
16eb0 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b  .ssize_t buflen;
16ec0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
16ed0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
16ee0 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  OR;..int mutex_r
16ef0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
16f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
16f10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
16f20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
16f30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
16f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
16f50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
16f60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
16f70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
16f80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
16f90 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
16fa0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
16fb0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
16fc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
16fd0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
16fe0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
16ff0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17000 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17010 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
17020 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
17030 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
17040 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
17050 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
17060 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
17070 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65  LL && ulEncrypte
17080 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
17090 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
170a0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
170b0 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e  ked to decrypt n
170c0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
170d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
170e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
170f0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
17100 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
17110 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
17120 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
17130 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
17140 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
17150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17160 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70  ("Error. pEncryp
17170 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  tedPart is NULL,
17180 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64   but ulEncrypted
17190 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
171a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
171b0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
171c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e  );..}...if (ulEn
171d0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
171e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
171f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
17200 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64  ror. ulEncrypted
17210 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
17220 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
17230 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
17240 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
17250 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
17260 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  ulPartLen == NUL
17270 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
17280 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17290 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73  r. pulPartLen is
172a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
172b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
172c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
172d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
172e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
172f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17300 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
17310 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
17320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17330 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
17340 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
17350 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
17360 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
17370 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
17380 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
17390 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
173a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
173b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
173c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
173d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
173e0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
173f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
17400 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
17410 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
17420 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
17430 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17440 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
17450 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
17460 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
17470 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
17480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17490 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
174a0 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
174b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
174c0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
174d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
174e0 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
174f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
17500 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
17510 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
17520 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
17530 09 09 62 75 66 6c 65 6e 20 3d 20 2d 31 3b 0a 0a  ..buflen = -1;..
17540 09 09 09 2f 2a 20 58 58 58 3a 20 41 73 6b 20 63  .../* XXX: Ask c
17550 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a  ard to decrypt *
17560 2f 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  /.....if (buflen
17570 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
17580 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
17590 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  . */.....retval 
175a0 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
175b0 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65 20 69  ROR;....} else i
175c0 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
175d0 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70  ng) buflen) > *p
175e0 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61  ulPartLen && pPa
175f0 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63  rt) {...../* Dec
17600 72 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20  rypted data too 
17610 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74  large */.....ret
17620 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
17630 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
17640 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28   else {.....if (
17650 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65  pPart) {......me
17660 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c  mcpy(pPart, buf,
17670 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a   buflen);.....}.
17680 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e  .....*pulPartLen
17690 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09   = buflen;......
176a0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
176b0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
176c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
176d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
176e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
176f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
17700 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
17710 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
17730 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
17740 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
17750 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
17760 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
17770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17780 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
17790 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
177a0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
177b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
177c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
177d0 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ecryptFinal)(CK_
177e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
177f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
17800 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20  _PTR pLastPart, 
17810 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
17820 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09  LastPartLen) {..
17830 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
17840 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65  ;..int terminate
17850 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09  _decrypt = 1;...
17860 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17870 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
17880 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
17890 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
178a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
178b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
178c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
178d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
178e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
178f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
17900 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
17910 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
17920 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
17930 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
17940 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
17950 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
17960 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17970 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
17980 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
17990 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
179a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
179b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
179c0 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  f (pulLastPartLe
179d0 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
179e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
179f0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61  TF("Error. pulLa
17a00 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c  stPartLen is NUL
17a10 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
17a20 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
17a30 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
17a40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
17a50 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
17a60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
17a70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
17a80 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
17a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
17aa0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
17ab0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
17ac0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
17ad0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
17ae0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
17af0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
17b00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
17b10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
17b20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
17b30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17b40 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
17b50 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
17b60 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
17b70 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
17b80 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
17b90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
17ba0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
17bb0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
17bc0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
17bd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
17be0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
17bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17c00 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e  rror.  Decrypt n
17c10 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
17c20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
17c30 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
17c40 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a  IALIZED);..}...*
17c50 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d  pulLastPartLen =
17c60 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50   0;...if (pLastP
17c70 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
17c80 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  .terminate_decry
17c90 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  pt = 0;..}...if 
17ca0 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79  (terminate_decry
17cb0 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  pt) {...cackey_s
17cc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
17cd0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
17ce0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
17cf0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
17d00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
17d10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
17d20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
17d30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
17d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17d50 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
17d60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
17d70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
17d80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
17d90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17da0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
17db0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
17dc0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
17dd0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
17de0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
17df0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69  _RV, C_DigestIni
17e00 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
17e10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
17e20 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
17e30 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43  pMechanism) {..C
17e40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
17e60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
17e70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
17e80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17e90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
17ea0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
17eb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
17ec0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
17ed0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
17ee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17ef0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
17f00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
17f10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
17f20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
17f30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
17f40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
17f50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
17f60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
17f70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
17f80 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49  Digest)(CK_SESSI
17f90 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
17fa0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
17fb0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
17fc0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
17fd0 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
17fe0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
17ff0 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
18000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18010 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18020 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
18030 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
18040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18050 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
18060 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
18070 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
18080 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18090 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
180a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
180b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
180c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
180d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
180e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
180f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
18100 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
18110 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
18120 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
18130 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
18140 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
18150 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
18160 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
18170 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
18180 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
18190 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
181a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
181b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
181c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
181d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
181e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
181f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
18200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18210 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
18220 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
18230 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18240 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
18250 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
18260 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
18270 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
18280 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
18290 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
182a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
182b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
182c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
182d0 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43  , C_DigestKey)(C
182e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
182f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
18300 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
18310 29 20 7b 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 43 61 6c 6c 65 64  G_PRINTF("Called
18330 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
18340 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
18350 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18370 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
18380 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18390 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
183a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
183b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
183c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
183d0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
183e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
183f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
18400 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
18410 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
18420 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
18430 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
18440 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
18450 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61  RV, C_DigestFina
18460 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
18470 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
18480 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65  K_BYTE_PTR pDige
18490 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
184a0 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b   pulDigestLen) {
184b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
184c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
184d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
184e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
184f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18500 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
18510 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
18520 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18530 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
18540 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
18550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18560 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
18570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
18580 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
18590 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
185a0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
185b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
185c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
185d0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
185e0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
185f0 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f   C_SignInit)(CK_
18600 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
18610 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
18620 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
18630 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
18640 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
18650 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
18660 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41  ;...hKey--;...CA
18670 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18680 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
18690 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
186a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
186b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
186c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
186d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
186e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
186f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
18700 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
18710 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55  pMechanism == NU
18720 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
18730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18740 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69  or. pMechanism i
18750 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
18760 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
18770 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
18780 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65   (pMechanism->me
18790 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52  chanism != CKM_R
187a0 53 41 5f 50 4b 43 53 20 26 26 20 70 4d 65 63 68  SA_PKCS && pMech
187b0 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
187c0 20 21 3d 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41   != CKM_SHA1_RSA
187d0 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
187e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
187f0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
18800 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
18810 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
18820 4d 5f 52 53 41 5f 50 4b 43 53 20 6f 72 20 43 4b  M_RSA_PKCS or CK
18830 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 22  M_SHA1_RSA_PKCS"
18840 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
18850 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
18860 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
18870 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
18880 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
18890 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
188a0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
188b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
188c0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
188d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
188e0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
188f0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
18900 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
18910 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
18920 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
18930 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
18940 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
18950 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
18960 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
18970 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
18980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18990 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
189a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
189b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
189c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
189d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
189e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
189f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
18a00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
18a10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
18a20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
18a30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18a40 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
18a50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
18a60 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
18a70 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
18a80 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (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 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
18ab0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
18ac0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
18ad0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
18ae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18af0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
18b00 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
18b10 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
18b20 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
18b30 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
18b40 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
18b50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
18b60 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
18b70 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
18b80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
18b90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
18ba0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18bb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18bc0 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
18bd0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 0a 09 09  of range.");....
18be0 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
18bf0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
18c00 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
18c10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
18c20 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ign_active = 1;.
18c30 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
18c40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
18c50 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
18c60 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
18c70 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  sm;...cackey_ses
18c80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
18c90 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32  sign_buflen = 12
18ca0 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  8;..cackey_sessi
18cb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
18cc0 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a  gn_bufused = 0;.
18cd0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
18ce0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
18cf0 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  buf = malloc(siz
18d00 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
18d10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
18d20 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
18d30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
18d40 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
18d50 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
18d60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
18d70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
18d80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
18d90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
18da0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18db0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
18dc0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
18dd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
18de0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
18df0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
18e00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18e10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
18e20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
18e30 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
18e40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
18e50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
18e60 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f  _Sign)(CK_SESSIO
18e70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
18e80 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
18e90 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
18ea0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
18eb0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
18ec0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
18ed0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
18ee0 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65  {..CK_RV sign_re
18ef0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
18f00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
18f10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
18f20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
18f30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
18f40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
18f50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
18f60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18f70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
18f80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
18f90 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
18fa0 53 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73  SignUpdate(hSess
18fb0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61  ion, pData, ulDa
18fc0 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  taLen);..if (sig
18fd0 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
18fe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18ff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
19000 20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72    SignUpdate() r
19010 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
19020 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
19030 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
19040 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  gn_ret);....retu
19050 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
19060 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f  ...sign_ret = C_
19070 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69  SignFinal(hSessi
19080 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20  on, pSignature, 
19090 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
190a0 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
190b0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
190c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
190d0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
190e0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
190f0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
19100 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
19110 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
19120 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
19130 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  _ret);..}...CACK
19140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19150 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
19160 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
19170 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
19180 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
19190 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
191a0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43   C_SignUpdate)(C
191b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
191c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
191d0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
191e0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
191f0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
19200 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
19210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19220 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
19230 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
19240 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
19250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19260 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
19270 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
19280 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
19290 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
192a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
192b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
192c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
192d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
192e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
192f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
19300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
19310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19320 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
19330 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
19340 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
19350 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
19360 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
19370 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50  t == NULL && ulP
19380 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
19390 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
193a0 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
193b0 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e  d to sign nothin
193c0 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
193d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
193e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
193f0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
19400 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
19410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
19420 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
19430 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
19440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19450 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74  TF("Error. pPart
19460 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
19470 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
19480 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19490 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
194a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61  );..}...if (ulPa
194b0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
194c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
194d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61  NTF("Error. ulPa
194e0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
194f0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
19500 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
19510 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
19520 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
19530 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
19540 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
19550 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
19560 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
19570 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
19580 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
19590 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
195a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
195b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
195c0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
195d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
195e0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
195f0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
19600 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
19610 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
19620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19630 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
19640 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
19650 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19660 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
19670 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
19680 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
19690 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
196a0 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
196b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
196c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
196d0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
196e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
196f0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
19700 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
19710 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
19720 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
19730 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  D);..}...switch 
19740 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
19750 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
19760 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
19770 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
19780 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
19790 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09  te directly */..
197a0 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
197b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
197c0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
197d0 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
197e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
197f0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
19800 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  en) {.....cackey
19810 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19820 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
19830 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
19840 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19850 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
19860 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
19870 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
19880 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
19890 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
198a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
198b0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
198c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
198d0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
198e0 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
198f0 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
19900 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
19910 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
19920 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19930 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
19940 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
19950 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
19960 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
19970 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
19980 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
19990 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 4b 4d  reak;...case CKM
199a0 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53 3a 0a  _SHA1_RSA_PKCS:.
199b0 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65  .../* Accumulate
199c0 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68 61 73   into a SHA1 has
199d0 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 6d  h */....cackey_m
199e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
199f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
19a00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19a10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19a20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
19a30 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
19a40 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
19a50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
19a60 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
19a70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
19a80 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61 6b 3b  RTED);....break;
19a90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
19aa0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
19ab0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
19ac0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
19ad0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
19ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19b00 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
19b10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
19b20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
19b30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
19b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19b50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
19b60 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
19b70 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
19b80 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
19b90 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
19ba0 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f  C_SignFinal)(CK_
19bb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
19bc0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
19bd0 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
19be0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
19bf0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
19c00 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
19c10 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09   sigbuf[1024];..
19c20 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65  ssize_t sigbufle
19c30 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  n;..CK_RV retval
19c40 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
19c50 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
19c60 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
19c70 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
19c80 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
19c90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
19ca0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
19cb0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
19cc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19cd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19ce0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
19cf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
19d00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
19d10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
19d20 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
19d30 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
19d40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19d50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
19d60 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
19d70 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
19d80 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
19d90 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
19da0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
19db0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
19dc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
19dd0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
19de0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
19df0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
19e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19e10 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
19e20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
19e30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
19e40 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
19e50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
19e60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
19e70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
19e80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19e90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19ea0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19ec0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
19ed0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
19ee0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
19ef0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
19f00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
19f10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
19f20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
19f30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
19f40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
19f50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19f60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19f70 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
19f80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
19f90 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
19fa0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
19fb0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
19fc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19fd0 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
19fe0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
19ff0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1a000 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1a010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a020 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
1a030 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1a040 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
1a050 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
1a060 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
1a070 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
1a080 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1a090 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
1a0a0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
1a0b0 41 5f 50 4b 43 53 3a 0a 09 09 09 73 69 67 62 75  A_PKCS:....sigbu
1a0c0 66 6c 65 6e 20 3d 20 2d 31 3b 0a 0a 09 09 09 2f  flen = -1;...../
1a0d0 2a 20 58 58 58 3a 20 41 73 6b 20 63 61 72 64 20  * XXX: Ask card 
1a0e0 74 6f 20 73 69 67 6e 20 2a 2f 0a 0a 09 09 09 69  to sign */.....i
1a0f0 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30  f (sigbuflen < 0
1a100 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69  ) {...../* Signi
1a110 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  ng failed. */...
1a120 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
1a130 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
1a140 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e  .} else if (((un
1a150 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
1a160 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69  buflen) > *pulSi
1a170 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53  gnatureLen && pS
1a180 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
1a190 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20 74  /* Signed data t
1a1a0 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09  oo large */.....
1a1b0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
1a1c0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a  FER_TOO_SMALL;..
1a1d0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
1a1e0 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73  gn = 0;....} els
1a1f0 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74  e {.....terminat
1a200 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09  e_sign = 0;.....
1a210 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29  .if (pSignature)
1a220 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
1a230 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75  Signature, sigbu
1a240 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a  f, sigbuflen);..
1a250 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
1a260 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a  ign = 1;.....}..
1a270 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72  ....*pulSignatur
1a280 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e  eLen = sigbuflen
1a290 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
1a2a0 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
1a2b0 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
1a2c0 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1a2d0 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
1a2e0 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
1a2f0 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
1a300 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1a310 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1a320 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a330 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a340 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1a350 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1a360 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1a370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a380 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1a390 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1a3a0 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
1a3b0 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
1a3c0 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
1a3d0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1a3e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1a3f0 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
1a400 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
1a410 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
1a420 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
1a430 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1a440 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
1a450 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
1a460 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1a470 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1a480 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1a490 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1a4a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1a4b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a4c0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1a4d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1a4e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1a4f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1a500 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a510 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a520 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
1a530 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
1a540 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
1a550 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1a560 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
1a570 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
1a580 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1a590 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1a5a0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1a5b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1a5c0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
1a5d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a5e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a5f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1a600 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1a610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a620 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1a630 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a640 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a650 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1a660 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1a670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1a680 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1a690 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1a6a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1a6b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a6c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1a6d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1a6e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1a6f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1a700 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
1a710 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
1a720 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1a730 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1a740 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1a750 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1a760 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
1a770 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
1a780 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1a790 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1a7a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a7b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1a7c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a7d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a7e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a7f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a800 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a810 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a820 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a830 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a840 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a850 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1a860 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1a870 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1a880 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1a890 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1a8a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1a8b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1a8c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1a8d0 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
1a8e0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1a8f0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1a900 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
1a910 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
1a920 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
1a930 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1a940 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a950 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1a960 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1a970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a990 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1a9a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1a9b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1a9c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1a9d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a9e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a9f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1aa00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1aa10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1aa20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1aa30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1aa40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1aa50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1aa60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1aa70 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
1aa80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1aa90 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1aaa0 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
1aab0 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
1aac0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
1aad0 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
1aae0 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
1aaf0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1ab00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1ab10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1ab20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1ab30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ab40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ab50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1ab60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1ab70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1ab80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1ab90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aba0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1abb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1abc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1abd0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1abe0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1abf0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1ac00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1ac10 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1ac20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ac30 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
1ac40 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
1ac50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1ac60 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
1ac70 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
1ac80 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
1ac90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1aca0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1acb0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1acc0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1acd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ace0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1acf0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ad00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ad10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ad20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1ad30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1ad40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1ad50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1ad60 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1ad70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1ad80 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1ad90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1ada0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1adb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1adc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
1add0 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
1ade0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1adf0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1ae00 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
1ae10 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
1ae20 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1ae30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1ae40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1ae50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ae60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ae70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ae80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1ae90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1aea0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1aeb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1aec0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1aed0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1aee0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1aef0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1af00 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1af10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1af20 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1af30 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1af40 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1af50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1af60 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
1af70 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
1af80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1af90 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1afa0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1afb0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
1afc0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
1afd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1afe0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1aff0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1b000 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1b010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b020 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1b030 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1b040 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1b050 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1b060 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1b070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b080 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b0a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1b0b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b0c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1b0d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1b0e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b0f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b100 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b110 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
1b120 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1b130 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1b140 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1b150 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
1b160 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
1b170 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
1b180 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
1b190 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
1b1a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b1b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1b1c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1b1d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1b1e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b1f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1b200 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1b210 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1b220 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1b230 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1b240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1b250 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1b260 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1b270 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1b280 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b290 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1b2a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1b2b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1b2c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1b2d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
1b2e0 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
1b2f0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1b300 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1b310 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
1b320 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
1b330 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
1b340 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
1b350 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1b360 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1b370 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1b380 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1b390 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1b3a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1b3b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b3c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b3d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1b3e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b3f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1b400 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1b410 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b420 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1b430 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1b440 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1b450 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1b460 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b470 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1b480 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1b490 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1b4a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1b4b0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
1b4c0 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
1b4d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1b4e0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
1b4f0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
1b500 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
1b510 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
1b520 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
1b530 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1b540 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
1b550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b560 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1b570 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1b580 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1b590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b5a0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1b5b0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1b5c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1b5d0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1b5e0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1b5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b600 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1b610 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b620 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1b630 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b640 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1b650 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1b660 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1b670 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b680 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b690 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
1b6a0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
1b6b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
1b6c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
1b6d0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
1b6e0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
1b6f0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
1b700 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1b710 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1b720 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1b730 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b740 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1b750 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1b760 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1b770 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b780 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1b790 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b7a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1b7b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1b7c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1b7d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b7e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1b7f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1b800 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1b810 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1b820 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1b830 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1b840 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1b850 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b860 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
1b870 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
1b880 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1b890 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1b8a0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
1b8b0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
1b8c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1b8d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
1b8e0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
1b8f0 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
1b900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b910 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1b920 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1b930 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1b960 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1b970 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1b980 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1b990 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
1b9a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b9b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1b9c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1b9d0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1b9e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1b9f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1ba00 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1ba10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ba20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ba30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ba40 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
1ba50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1ba60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
1ba70 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
1ba80 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
1ba90 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
1baa0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
1bab0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
1bac0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
1bad0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1bae0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1baf0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1bb00 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1bb10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1bb20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bb30 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1bb40 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1bb50 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1bb60 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1bb70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bb80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1bb90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1bba0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1bbb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1bbc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1bbd0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1bbe0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1bbf0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1bc00 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1bc10 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
1bc20 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
1bc30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1bc40 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
1bc50 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
1bc60 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
1bc70 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
1bc80 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1bc90 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
1bca0 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
1bcb0 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
1bcc0 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
1bcd0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
1bce0 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
1bcf0 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
1bd00 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
1bd10 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
1bd20 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
1bd30 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
1bd40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bd50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1bd60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1bd70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1bd80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bd90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1bda0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1bdb0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1bdc0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1bdd0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
1bde0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1bdf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1be00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1be10 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1be20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1be30 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1be40 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1be50 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1be60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1be70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
1be80 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
1be90 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1bea0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
1beb0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
1bec0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
1bed0 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
1bee0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
1bef0 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
1bf00 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
1bf10 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
1bf20 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
1bf30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bf40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1bf50 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1bf60 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1bf70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bf80 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1bf90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1bfa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1bfb0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1bfc0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1bfd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bfe0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1bff0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c000 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
1c010 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1c020 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
1c030 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1c040 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1c050 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1c060 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1c070 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
1c080 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
1c090 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
1c0a0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
1c0b0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
1c0c0 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
1c0d0 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
1c0e0 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
1c0f0 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
1c100 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
1c110 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
1c120 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
1c130 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
1c140 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1c150 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
1c160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c170 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1c180 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c190 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c1a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c1b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c1c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c1d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c1e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c1f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
1c200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c210 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1c220 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c230 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
1c240 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1c250 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
1c260 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
1c270 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c280 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c290 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c2a0 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
1c2b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1c2c0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1c2d0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1c2e0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1c2f0 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
1c300 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
1c310 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
1c320 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
1c330 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
1c340 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
1c350 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1c360 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1c370 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1c380 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c390 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c3a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c3b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c3c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c3d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c3e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c3f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c410 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1c420 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1c430 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1c440 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1c450 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1c460 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1c470 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1c480 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1c490 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
1c4a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1c4b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1c4c0 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
1c4d0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
1c4e0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1c4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1c500 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1c510 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1c520 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1c530 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c540 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1c550 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1c560 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1c570 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1c580 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1c590 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c5a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1c5b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1c5c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1c5d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1c5e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1c5f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1c600 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1c610 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1c620 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
1c630 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
1c640 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1c650 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1c660 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
1c670 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
1c680 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1c690 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1c6a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1c6b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c6c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c6d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c6e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c6f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c700 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c710 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c720 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1c730 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1c740 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1c750 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1c760 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1c770 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1c780 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1c790 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1c7a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
1c7b0 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
1c7c0 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
1c7d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c7e0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
1c7f0 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
1c800 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
1c810 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1c820 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c830 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
1c840 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c850 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1c860 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
1c870 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1c880 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
1c890 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1c8a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
1c8b0 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
1c8c0 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
1c8d0 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
1c8e0 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
1c8f0 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
1c900 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
1c910 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c920 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
1c930 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
1c940 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1c950 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
1c960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c970 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
1c980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c990 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1c9a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
1c9b0 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
1c9c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
1c9d0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
1c9e0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1c9f0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
1ca00 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
1ca10 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
1ca20 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
1ca30 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
1ca40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1ca50 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
1ca60 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
1ca70 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
1ca80 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
1ca90 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
1caa0 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
1cab0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
1cac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cad0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1cae0 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
1caf0 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
1cb00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cb10 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
1cb20 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
1cb30 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1cb40 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1cb50 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
1cb60 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
1cb70 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
1cb80 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
1cb90 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
1cba0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
1cbb0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
1cbc0 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
1cbd0 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
1cbe0 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
1cbf0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
1cc00 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
1cc10 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
1cc20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
1cc30 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
1cc40 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
1cc50 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
1cc60 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
1cc70 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
1cc80 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1cc90 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
1cca0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
1ccb0 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
1ccc0 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
1ccd0 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
1cce0 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
1ccf0 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
1cd00 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
1cd10 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
1cd20 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
1cd30 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
1cd40 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
1cd50 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
1cd60 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
1cd70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1cd80 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
1cd90 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
1cda0 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
1cdb0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
1cdc0 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
1cdd0 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
1cde0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1cdf0 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
1ce00 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
1ce10 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
1ce20 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
1ce30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1ce40 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
1ce50 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
1ce60 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
1ce70 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
1ce80 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
1ce90 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
1cea0 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
1ceb0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
1cec0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
1ced0 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
1cee0 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
1cef0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1cf00 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
1cf10 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
1cf20 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
1cf30 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
1cf40 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
1cf50 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
1cf60 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1cf70 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
1cf80 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
1cf90 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
1cfa0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
1cfb0 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
1cfc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1cfd0 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
1cfe0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
1cff0 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
1d000 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
1d010 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
1d020 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
1d030 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
1d040 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
1d050 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
1d060 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
1d070 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
1d080 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
1d090 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
1d0a0 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
1d0b0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
1d0c0 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
1d0d0 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
1d0e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d0f0 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
1d100 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
1d110 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
1d120 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
1d130 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
1d140 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
1d150 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
1d160 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
1d170 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
1d180 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
1d190 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
1d1a0 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
1d1b0 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
1d1c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
1d1d0 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
1d1e0 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
1d1f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
1d200 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
1d210 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d220 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
1d230 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
1d240 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
1d250 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
1d260 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
1d270 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
1d280 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
1d290 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
1d2a0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
1d2b0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
1d2c0 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
1d2d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
1d2e0 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
1d2f0 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
1d300 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1d310 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
1d320 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
1d330 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1d340 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
1d350 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
1d360 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
1d370 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
1d380 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d390 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
1d3a0 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
1d3b0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
1d3c0 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
1d3d0 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
1d3e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1d3f0 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
1d400 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
1d410 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
1d420 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
1d430 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
1d440 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
1d450 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
1d460 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
1d470 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
1d480 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
1d490 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
1d4a0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
1d4b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
1d4c0 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
1d4d0 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
1d4e0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
1d4f0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
1d500 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
1d510 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
1d520 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
1d530 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
1d540 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d550 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
1d560 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
1d570 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
1d580 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
1d590 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
1d5a0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
1d5b0 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
1d5c0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
1d5d0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
1d5e0 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
1d5f0 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
1d600 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d610 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
1d620 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
1d630 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
1d640 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
1d650 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
1d660 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
1d670 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
1d680 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
1d690 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
1d6a0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
1d6b0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
1d6c0 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
1d6d0 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
1d6e0 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
1d6f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
1d700 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
1d710 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
1d720 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
1d730 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
1d740 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
1d750 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
1d760 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
1d770 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
1d780 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
1d790 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
1d7a0 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
1d7b0 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
1d7c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
1d7d0 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
1d7e0 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
1d7f0 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
1d800 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
1d810 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
1d820 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
1d830 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
1d840 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
1d850 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
1d860 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
1d870 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d880 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
1d890 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
1d8a0 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
1d8b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
1d8c0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
1d8d0 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
1d8e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
1d8f0 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
1d900 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
1d910 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
1d920 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
1d930 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
1d940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d950 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d960 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1d970 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1d980 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..