Hex Artifact Content

Artifact 36bd79ba268f831be1afd9688e720bdacfe67af2:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 43 53  .#ifdef HAVE_PCS
0040: 43 4c 49 54 45 5f 48 0a 23 20 20 69 6e 63 6c 75  CLITE_H.#  inclu
0050: 64 65 20 3c 70 63 73 63 6c 69 74 65 2e 68 3e 0a  de <pcsclite.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 57 49 4e 53 43 41 52 44 5f 48 0a 23 20  VE_WINSCARD_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73 63 61   include <winsca
0090: 72 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  rd.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 53 54 44 49 4e 54 5f  def HAVE_STDINT_
00b0: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74  H.#  include <st
00c0: 64 69 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  dint.h>.#endif.#
00d0: 69 66 64 65 66 20 48 41 56 45 5f 49 4e 54 54 59  ifdef HAVE_INTTY
00e0: 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65  PES_H.#  include
00f0: 20 3c 69 6e 74 74 79 70 65 73 2e 68 3e 0a 23 65   <inttypes.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 53 54 44 4c 49 42 5f 48 0a 23 20 20 69 6e 63  _STDLIB_H.#  inc
0120: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0130: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0140: 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 20 20 69  VE_UNISTD_H.#  i
0150: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0160: 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  >.#endif.#ifdef 
0170: 48 41 56 45 5f 53 54 52 49 4e 47 5f 48 0a 23 20  HAVE_STRING_H.# 
0180: 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67   include <string
0190: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
01a0: 66 20 48 41 56 45 5f 50 54 48 52 45 41 44 5f 48  f HAVE_PTHREAD_H
01b0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 74 68  .#  include <pth
01c0: 72 65 61 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  read.h>.#endif.#
01d0: 69 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f  ifdef HAVE_ZLIB_
01e0: 48 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  H.#  ifdef HAVE_
01f0: 4c 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64  LIBZ.#    includ
0200: 65 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e  e <zlib.h>.#  en
0210: 64 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64  dif.#else.#  ifd
0220: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0230: 20 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42    undef HAVE_LIB
0240: 5a 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  Z.#  endif.#endi
0250: 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b 5f 50 54  f..#define CK_PT
0260: 52 20 2a 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  R *.#define CK_D
0270: 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 72  EFINE_FUNCTION(r
0280: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
0290: 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65   returnType name
02a0: 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c  .#define CK_DECL
02b0: 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74  ARE_FUNCTION(ret
02c0: 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72  urnType, name) r
02d0: 65 74 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23  eturnType name.#
02e0: 64 65 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52  define CK_DECLAR
02f0: 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54  E_FUNCTION_POINT
0300: 45 52 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e  ER(returnType, n
0310: 61 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20  ame) returnType 
0320: 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66 69 6e 65  (* name).#define
0330: 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f 46 55 4e   CK_CALLBACK_FUN
0340: 43 54 49 4f 4e 28 72 65 74 75 72 6e 54 79 70 65  CTION(returnType
0350: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0360: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 69 66 6e  pe (* name).#ifn
0370: 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a 23 20 20  def NULL_PTR.#  
0380: 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50 54 52 20  define NULL_PTR 
0390: 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75  0.#endif..#inclu
03a0: 64 65 20 22 70 6b 63 73 31 31 2e 68 22 0a 23 69  de "pkcs11.h".#i
03b0: 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35 30  nclude "asn1-x50
03c0: 39 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 43 41  9.h"..#ifndef CA
03d0: 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
03e0: 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20 64 65  RSION_CODE.#  de
03f0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52 59 50  fine CACKEY_CRYP
0400: 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
0410: 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e 64 69  E 0x021e00.#endi
0420: 66 0a 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  f..#ifndef CKA_T
0430: 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
0440: 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54  .#  define CKA_T
0450: 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
0460: 20 30 78 63 65 35 33 36 33 35 38 0a 23 65 6e 64   0xce536358.#end
0470: 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  if.#ifndef CKA_T
0480: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
0490: 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f 54  .#  define CKA_T
04a0: 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48  RUST_CLIENT_AUTH
04b0: 20 30 78 63 65 35 33 36 33 35 39 0a 23 65 6e 64   0xce536359.#end
04c0: 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41 5f 54  if.#ifndef CKA_T
04d0: 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
04e0: 47 0a 23 20 20 64 65 66 69 6e 65 20 43 4b 41 5f  G.#  define CKA_
04f0: 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
0500: 4e 47 20 30 78 63 65 35 33 36 33 35 61 0a 23 65  NG 0xce53635a.#e
0510: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 43 4b 41  ndif.#ifndef CKA
0520: 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f  _TRUST_EMAIL_PRO
0530: 54 45 43 54 49 4f 4e 0a 23 20 20 64 65 66 69 6e  TECTION.#  defin
0540: 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
0550: 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 30 78 63  L_PROTECTION 0xc
0560: 65 35 33 36 33 35 62 0a 23 65 6e 64 69 66 0a 0a  e53635b.#endif..
0570: 2f 2a 20 47 53 43 2d 49 53 20 76 32 2e 31 20 44  /* GSC-IS v2.1 D
0580: 65 66 69 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a  efinitions */./*
0590: 2a 20 43 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64  * Classes **/.#d
05a0: 65 66 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53  efine GSCIS_CLAS
05b0: 53 5f 49 53 4f 37 38 31 36 20 20 20 20 20 20 20  S_ISO7816       
05c0: 20 20 20 20 30 78 30 30 0a 23 64 65 66 69 6e 65      0x00.#define
05d0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
05e0: 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30  BAL_PLATFORM   0
05f0: 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63  x80../** Instruc
0600: 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e  tions **/.#defin
0610: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0620: 54 5f 52 45 53 50 4f 4e 53 45 20 20 20 20 20 20  T_RESPONSE      
0630: 30 78 43 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0xC0.#define GSC
0640: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 49  IS_INSTR_READ_BI
0650: 4e 41 52 59 20 20 20 20 20 20 20 30 78 42 30 0a  NARY       0xB0.
0660: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0670: 53 54 52 5f 55 50 44 41 54 45 5f 42 49 4e 41 52  STR_UPDATE_BINAR
0680: 59 20 20 20 20 20 30 78 44 36 0a 23 64 65 66 69  Y     0xD6.#defi
0690: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
06a0: 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
06b0: 20 30 78 41 34 0a 23 64 65 66 69 6e 65 20 47 53   0xA4.#define GS
06c0: 43 49 53 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e  CIS_INSTR_EXTERN
06d0: 41 4c 5f 41 55 54 48 20 20 20 20 20 30 78 38 32  AL_AUTH     0x82
06e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
06f0: 4e 53 54 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e  NSTR_GET_CHALLEN
0700: 47 45 20 20 20 20 20 30 78 38 34 0a 23 64 65 66  GE     0x84.#def
0710: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
0720: 49 4e 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20  INTERNAL_AUTH   
0730: 20 20 30 78 38 38 0a 23 64 65 66 69 6e 65 20 47    0x88.#define G
0740: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
0750: 59 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32  Y            0x2
0760: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0770: 49 4e 53 54 52 5f 53 49 47 4e 20 20 20 20 20 20  INSTR_SIGN      
0780: 20 20 20 20 20 20 20 20 30 78 32 41 0a 23 64 65          0x2A.#de
0790: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
07a0: 5f 47 45 54 5f 50 52 4f 50 20 20 20 20 20 20 20  _GET_PROP       
07b0: 20 20 20 30 78 35 36 0a 23 64 65 66 69 6e 65 20     0x56.#define 
07c0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
07d0: 41 43 52 20 20 20 20 20 20 20 20 20 20 20 30 78  ACR           0x
07e0: 34 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  4C.#define GSCIS
07f0: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
0800: 45 52 20 20 20 20 20 20 20 30 78 35 32 0a 23 64  ER       0x52.#d
0810: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0820: 52 5f 53 49 47 4e 44 45 43 52 59 50 54 20 20 20  R_SIGNDECRYPT   
0830: 20 20 20 20 30 78 34 32 0a 0a 23 64 65 66 69 6e      0x42..#defin
0840: 65 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  e GSCIS_PARAM_SE
0850: 4c 45 43 54 5f 41 50 50 4c 45 54 20 20 20 20 20  LECT_APPLET     
0860: 30 78 30 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a  0x04../** Tags *
0870: 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73  */./*** CCC Tags
0880: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
0890: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 20 20  CIS_TAG_CARDID  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 30              0xF0
08b0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
08c0: 41 47 5f 43 43 43 5f 56 45 52 20 20 20 20 20 20  AG_CCC_VER      
08d0: 20 20 20 20 20 20 20 30 78 46 31 0a 23 64 65 66         0xF1.#def
08e0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ine GSCIS_TAG_CC
08f0: 47 5f 56 45 52 20 20 20 20 20 20 20 20 20 20 20  G_VER           
0900: 20 20 30 78 46 32 0a 23 64 65 66 69 6e 65 20 47    0xF2.#define G
0910: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0930: 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  3.#define GSCIS_
0940: 54 41 47 5f 50 4b 43 53 31 35 20 20 20 20 20 20  TAG_PKCS15      
0950: 20 20 20 20 20 20 20 20 30 78 46 34 0a 23 64 65          0xF4.#de
0960: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52  fine GSCIS_TAG_R
0970: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20  EG_DATA_MODEL   
0980: 20 20 20 30 78 46 35 0a 23 64 65 66 69 6e 65 20     0xF5.#define 
0990: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
09a0: 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 30 78  BLE           0x
09b0: 46 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  F6.#define GSCIS
09c0: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 20 20  _TAG_CARD_APDU  
09d0: 20 20 20 20 20 20 20 20 20 30 78 46 37 0a 23 64           0xF7.#d
09e0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
09f0: 52 45 44 49 52 45 43 54 49 4f 4e 20 20 20 20 20  REDIRECTION     
0a00: 20 20 20 20 30 78 46 41 0a 23 64 65 66 69 6e 65      0xFA.#define
0a10: 20 47 53 43 49 53 5f 54 41 47 5f 43 54 20 20 20   GSCIS_TAG_CT   
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0a30: 78 46 42 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xFB.#define GSCI
0a40: 53 5f 54 41 47 5f 53 54 20 20 20 20 20 20 20 20  S_TAG_ST        
0a50: 20 20 20 20 20 20 20 20 20 20 30 78 46 43 0a 23            0xFC.#
0a60: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0a70: 5f 4e 45 58 54 43 43 43 20 20 20 20 20 20 20 20  _NEXTCCC        
0a80: 20 20 20 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20       0xFD../*** 
0a90: 47 65 6e 65 72 61 6c 20 2d 20 45 46 20 32 32 30  General - EF 220
0aa0: 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  0 ***/.#define G
0ab0: 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20  SCIS_TAG_FNAME  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0ad0: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
0ae0: 54 41 47 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20  TAG_MNAME       
0af0: 20 20 20 20 20 20 20 20 30 78 30 32 0a 23 64 65          0x02.#de
0b00: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4c  fine GSCIS_TAG_L
0b10: 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
0b20: 20 20 20 30 78 30 33 0a 23 64 65 66 69 6e 65 20     0x03.#define 
0b30: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0b50: 30 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  04.#define GSCIS
0b60: 5f 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59  _TAG_GOVT_AGENCY
0b70: 20 20 20 20 20 20 20 20 20 30 78 30 35 0a 23 64           0x05.#d
0b80: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0b90: 42 55 52 45 41 55 20 20 20 20 20 20 20 20 20 20  BUREAU          
0ba0: 20 20 20 20 30 78 30 36 0a 23 64 65 66 69 6e 65      0x06.#define
0bb0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
0bc0: 55 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20 30  U_CODE         0
0bd0: 78 30 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x07.#define GSCI
0be0: 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 20  S_TAG_DEPT_CODE 
0bf0: 20 20 20 20 20 20 20 20 20 20 30 78 30 38 0a 23            0x08.#
0c00: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0c10: 5f 54 49 54 4c 45 20 20 20 20 20 20 20 20 20 20  _TITLE          
0c20: 20 20 20 20 20 30 78 30 39 0a 23 64 65 66 69 6e       0x09.#defin
0c30: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
0c40: 44 49 4e 47 20 20 20 20 20 20 20 20 20 20 20 20  DING            
0c50: 30 78 31 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x10.#define GSC
0c60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44  IS_TAG_OFFICE_AD
0c70: 44 52 31 20 20 20 20 20 20 20 20 30 78 31 31 0a  DR1        0x11.
0c80: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c90: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 20 20  G_OFFICE_ADDR2  
0ca0: 20 20 20 20 20 20 30 78 31 32 0a 23 64 65 66 69        0x12.#defi
0cb0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0cc0: 49 43 45 5f 43 49 54 59 20 20 20 20 20 20 20 20  ICE_CITY        
0cd0: 20 30 78 31 33 0a 23 64 65 66 69 6e 65 20 47 53   0x13.#define GS
0ce0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
0cf0: 54 41 54 45 20 20 20 20 20 20 20 20 30 78 31 34  TATE        0x14
0d00: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0d10: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 20 20 20  AG_OFFICE_ZIP   
0d20: 20 20 20 20 20 20 20 30 78 31 35 0a 23 64 65 66         0x15.#def
0d30: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0d40: 46 49 43 45 5f 43 4f 55 4e 54 52 59 20 20 20 20  FICE_COUNTRY    
0d50: 20 20 30 78 31 36 0a 23 64 65 66 69 6e 65 20 47    0x16.#define G
0d60: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0d70: 50 48 4f 4e 45 20 20 20 20 20 20 20 20 30 78 31  PHONE        0x1
0d80: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
0d90: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
0da0: 5f 45 58 54 20 20 20 20 30 78 31 38 0a 23 64 65  _EXT    0x18.#de
0db0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0dc0: 46 46 49 43 45 5f 46 41 58 20 20 20 20 20 20 20  FFICE_FAX       
0dd0: 20 20 20 30 78 31 39 0a 23 64 65 66 69 6e 65 20     0x19.#define 
0de0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0df0: 5f 45 4d 41 49 4c 20 20 20 20 20 20 20 20 30 78  _EMAIL        0x
0e00: 31 41 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  1A.#define GSCIS
0e10: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d  _TAG_OFFICE_ROOM
0e20: 20 20 20 20 20 20 20 20 20 30 78 31 42 0a 23 64           0x1B.#d
0e30: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0e40: 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 20 20 20  NONGOV_AGENCY   
0e50: 20 20 20 20 30 78 31 43 0a 23 64 65 66 69 6e 65      0x1C.#define
0e60: 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44   GSCIS_TAG_SSN_D
0e70: 45 53 49 47 4e 41 54 4f 52 20 20 20 20 20 20 30  ESIGNATOR      0
0e80: 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20  x1D../*** PII - 
0e90: 45 46 20 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 2100 ***/.#de
0ea0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0eb0: 53 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  SN              
0ec0: 20 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20     0x20.#define 
0ed0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 20 20 20  GSCIS_TAG_DOB   
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0ef0: 32 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  21.#define GSCIS
0f00: 5f 54 41 47 5f 47 45 4e 44 45 52 20 20 20 20 20  _TAG_GENDER     
0f10: 20 20 20 20 20 20 20 20 20 30 78 32 32 0a 0a 2f           0x22../
0f20: 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d  *** Login Inform
0f30: 61 74 69 6f 6e 20 2d 20 45 46 20 34 30 30 30 20  ation - EF 4000 
0f40: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0f50: 49 53 5f 54 41 47 5f 55 53 45 52 49 44 20 20 20  IS_TAG_USERID   
0f60: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 30 0a             0x40.
0f70: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f80: 47 5f 44 4f 4d 41 49 4e 20 20 20 20 20 20 20 20  G_DOMAIN        
0f90: 20 20 20 20 20 20 30 78 34 31 0a 23 64 65 66 69        0x41.#defi
0fa0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53  ne GSCIS_TAG_PAS
0fb0: 53 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20  SWORD           
0fc0: 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64   0x42../*** Card
0fd0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45   Information - E
0fe0: 46 20 35 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66  F 5000 ***/.#def
0ff0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ine GSCIS_TAG_IS
1000: 53 55 45 52 49 44 20 20 20 20 20 20 20 20 20 20  SUERID          
1010: 20 20 30 78 35 30 0a 23 64 65 66 69 6e 65 20 47    0x50.#define G
1020: 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20  SCIS_TAG_SERNO  
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 35               0x5
1040: 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  1.#define GSCIS_
1050: 54 41 47 5f 49 53 53 55 45 5f 44 41 54 45 20 20  TAG_ISSUE_DATE  
1060: 20 20 20 20 20 20 20 20 30 78 35 32 0a 23 64 65          0x52.#de
1070: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 45  fine GSCIS_TAG_E
1080: 58 50 49 52 45 5f 44 41 54 45 20 20 20 20 20 20  XPIRE_DATE      
1090: 20 20 20 30 78 35 33 0a 23 64 65 66 69 6e 65 20     0x53.#define 
10a0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 54  GSCIS_TAG_CARD_T
10b0: 59 50 45 20 20 20 20 20 20 20 20 20 20 20 30 78  YPE           0x
10c0: 35 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  54.#define GSCIS
10d0: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
10e0: 44 45 20 20 20 20 20 20 20 30 78 35 37 0a 23 64  DE       0x57.#d
10f0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1100: 43 41 52 44 49 44 5f 41 49 44 20 20 20 20 20 20  CARDID_AID      
1110: 20 20 20 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50      0x58../*** P
1120: 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  KI Information -
1130: 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64   EF 7000 ***/.#d
1140: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
1150: 43 45 52 54 49 46 49 43 41 54 45 20 20 20 20 20  CERTIFICATE     
1160: 20 20 20 20 30 78 37 30 0a 23 64 65 66 69 6e 65      0x70.#define
1170: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
1180: 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20 30  ISSUE_DATE     0
1190: 78 37 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x71.#define GSCI
11a0: 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52  S_TAG_CERT_EXPIR
11b0: 45 5f 44 41 54 45 20 20 20 20 30 78 37 32 0a 0a  E_DATE    0x72..
11c0: 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44 73 20 2a  /** Applet IDs *
11d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
11e0: 5f 41 49 44 5f 43 43 43 20 20 20 20 20 20 20 20  _AID_CCC        
11f0: 20 20 20 20 20 20 20 20 20 30 78 41 30 2c 20 30           0xA0, 0
1200: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 31 2c  x00, 0x00, 0x01,
1210: 20 30 78 31 36 2c 20 30 78 44 42 2c 20 30 78 30   0x16, 0xDB, 0x0
1220: 30 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  0..#ifdef CACKEY
1230: 5f 44 45 42 55 47 0a 23 20 20 69 66 64 65 66 20  _DEBUG.#  ifdef 
1240: 48 41 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20  HAVE_STDIO_H.#  
1250: 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f    include <stdio
1260: 2e 68 3e 0a 23 20 20 65 6e 64 69 66 0a 0a 23 20  .h>.#  endif..# 
1270: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1280: 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e 2e  EBUG_PRINTF(x...
1290: 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65  ) { fprintf(stde
12a0: 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 5f 5f  rr, "%s(): ", __
12b0: 66 75 6e 63 5f 5f 29 3b 20 66 70 72 69 6e 74 66  func__); fprintf
12c0: 28 73 74 64 65 72 72 2c 20 78 29 3b 20 66 70 72  (stderr, x); fpr
12d0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
12e0: 22 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65 20  "); }.#  define 
12f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1300: 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20 7b  NTBUF(f, x, y) {
1310: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1320: 54 4d 50 42 55 46 3b 20 75 6e 73 69 67 6e 65 64  TMPBUF; unsigned
1330: 20 6c 6f 6e 67 20 69 64 78 3b 20 54 4d 50 42 55   long idx; TMPBU
1340: 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  F = (unsigned ch
1350: 61 72 20 2a 29 20 28 78 29 3b 20 66 70 72 69 6e  ar *) (x); fprin
1360: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 28 29  tf(stderr, "%s()
1370: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1380: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1390: 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e  , f, #x, (unsign
13a0: 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54 4d  ed long) (y), TM
13b0: 50 42 55 46 5b 30 5d 29 3b 20 66 6f 72 20 28 69  PBUF[0]); for (i
13c0: 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 79  dx = 1; idx < (y
13d0: 29 3b 20 69 64 78 2b 2b 29 20 7b 20 66 70 72 69  ); idx++) { fpri
13e0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2c 20 25  ntf(stderr, ", %
13f0: 30 32 78 22 2c 20 54 4d 50 42 55 46 5b 69 64 78  02x", TMPBUF[idx
1400: 5d 29 3b 20 7d 3b 20 66 70 72 69 6e 74 66 28 73  ]); }; fprintf(s
1410: 74 64 65 72 72 2c 20 22 7d 29 5c 6e 22 29 3b 20  tderr, "})\n"); 
1420: 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  }.#  define CACK
1430: 45 59 5f 44 45 42 55 47 5f 50 45 52 52 4f 52 28  EY_DEBUG_PERROR(
1440: 78 29 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64  x) { fprintf(std
1450: 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 5f  err, "%s(): ", _
1460: 5f 66 75 6e 63 5f 5f 29 3b 20 70 65 72 72 6f 72  _func__); perror
1470: 28 78 29 3b 20 7d 0a 23 20 20 64 65 66 69 6e 65  (x); }.#  define
1480: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14a0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
14b0: 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b  x, #x); free(x);
14c0: 20 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20   }..static void 
14d0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
14e0: 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74  NC_MALLOC(size_t
14f0: 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61   size, const cha
1500: 72 20 2a 66 75 6e 63 29 20 7b 0a 09 76 6f 69 64  r *func) {..void
1510: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
1520: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
1530: 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 73 74 64  );...fprintf(std
1540: 65 72 72 2c 20 22 25 73 28 29 3a 20 22 2c 20 66  err, "%s(): ", f
1550: 75 6e 63 29 3b 0a 09 66 70 72 69 6e 74 66 28 73  unc);..fprintf(s
1560: 74 64 65 72 72 2c 20 22 4d 41 4c 4c 4f 43 28 29  tderr, "MALLOC()
1570: 20 3d 20 25 70 22 2c 20 72 65 74 76 61 6c 29 3b   = %p", retval);
1580: 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
1590: 2c 20 22 5c 6e 22 29 3b 0a 0a 09 72 65 74 75 72  , "\n");...retur
15a0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
15b0: 61 74 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45  atic void *CACKE
15c0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
15d0: 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74 72 2c 20  LLOC(void *ptr, 
15e0: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
15f0: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 29 20 7b  st char *func) {
1600: 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a  ..void *retval;.
1610: 0a 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
1620: 6f 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a  oc(ptr, size);..
1630: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70  .if (retval != p
1640: 74 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28  tr) {...fprintf(
1650: 73 74 64 65 72 72 2c 20 22 25 73 28 29 3a 20 22  stderr, "%s(): "
1660: 2c 20 66 75 6e 63 29 3b 0a 09 09 66 70 72 69 6e  , func);...fprin
1670: 74 66 28 73 74 64 65 72 72 2c 20 22 52 45 41 4c  tf(stderr, "REAL
1680: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
1690: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
16a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
16b0: 5c 6e 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  \n");..}...retur
16c0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74  n(retval);.}..st
16d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
16e0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
16f0: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e  NC_TAG_TO_STR(un
1700: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29  signed char tag)
1710: 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29   {..switch (tag)
1720: 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f   {...case GSCIS_
1730: 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72  TAG_CARDID:....r
1740: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1750: 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73  _CARDID");...cas
1760: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  e GSCIS_TAG_CCC_
1770: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
1780: 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45  GSCIS_TAG_CCC_VE
1790: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
17a0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09  S_TAG_CCG_VER:..
17b0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
17c0: 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09  TAG_CCG_VER");..
17d0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
17e0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75  CARDURL:....retu
17f0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
1800: 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20  RDURL");...case 
1810: 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35  GSCIS_TAG_PKCS15
1820: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1830: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b  IS_TAG_PKCS15");
1840: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1850: 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c  G_REG_DATA_MODEL
1860: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1870: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
1880: 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  MODEL");...case 
1890: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
18a0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
18b0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
18c0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  BLE");...case GS
18d0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
18e0: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
18f0: 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44  CIS_TAG_CARD_APD
1900: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1910: 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f  S_TAG_REDIRECTIO
1920: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
1930: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
1940: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ION");...case GS
1950: 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72  CIS_TAG_CT:....r
1960: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1970: 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _CT");...case GS
1980: 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72  CIS_TAG_ST:....r
1990: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
19a0: 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53  _ST");...case GS
19b0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a  CIS_TAG_NEXTCCC:
19c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
19d0: 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b  S_TAG_NEXTCCC");
19e0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
19f0: 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75  G_FNAME:....retu
1a00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e  rn("GSCIS_TAG_FN
1a10: 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AME");...case GS
1a20: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09  CIS_TAG_MNAME:..
1a30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1a40: 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_MNAME");...c
1a50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e  ase GSCIS_TAG_LN
1a60: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
1a70: 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22  GSCIS_TAG_LNAME"
1a80: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1a90: 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72  TAG_SUFFIX:....r
1aa0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1ab0: 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73  _SUFFIX");...cas
1ac0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54  e GSCIS_TAG_GOVT
1ad0: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
1ae0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f  rn("GSCIS_TAG_GO
1af0: 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63  VT_AGENCY");...c
1b00: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
1b10: 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28  REAU:....return(
1b20: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41  "GSCIS_TAG_BUREA
1b30: 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  U");...case GSCI
1b40: 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44  S_TAG_BUREAU_COD
1b50: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1b60: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
1b70: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
1b80: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1b90: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
1ba0: 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44  CIS_TAG_DEPT_COD
1bb0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1bc0: 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09  S_TAG_TITLE:....
1bd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1be0: 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73  G_TITLE");...cas
1bf0: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c  e GSCIS_TAG_BUIL
1c00: 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28  DING:....return(
1c10: 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44  "GSCIS_TAG_BUILD
1c20: 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ING");...case GS
1c30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
1c40: 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28  DDR1:....return(
1c50: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1c60: 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73  E_ADDR1");...cas
1c70: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
1c80: 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74  CE_ADDR2:....ret
1c90: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1ca0: 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09  FFICE_ADDR2");..
1cb0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
1cc0: 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09  OFFICE_CITY:....
1cd0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
1ce0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b  G_OFFICE_CITY");
1cf0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1d00: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a  G_OFFICE_STATE:.
1d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
1d20: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
1d30: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
1d40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
1d50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
1d60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
1d70: 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  P");...case GSCI
1d80: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
1d90: 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  NTRY:....return(
1da0: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
1db0: 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63  E_COUNTRY");...c
1dc0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1dd0: 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72  FICE_PHONE:....r
1de0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1df0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b  _OFFICE_PHONE");
1e00: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1e10: 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45  G_OFFICE_PHONE_E
1e20: 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  XT:....return("G
1e30: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
1e40: 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63  PHONE_EXT");...c
1e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1e60: 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74  FICE_FAX:....ret
1e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
1e80: 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63  FFICE_FAX");...c
1e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
1ea0: 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72  FICE_EMAIL:....r
1eb0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
1ec0: 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b  _OFFICE_EMAIL");
1ed0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1ee0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09  G_OFFICE_ROOM:..
1ef0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
1f00: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22  TAG_OFFICE_ROOM"
1f10: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1f20: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
1f30: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
1f40: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
1f50: 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20  GENCY");...case 
1f60: 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45  GSCIS_TAG_SSN_DE
1f70: 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74  SIGNATOR:....ret
1f80: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
1f90: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b  SN_DESIGNATOR");
1fa0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
1fb0: 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e  G_SSN:....return
1fc0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22  ("GSCIS_TAG_SSN"
1fd0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
1fe0: 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75  TAG_DOB:....retu
1ff0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f  rn("GSCIS_TAG_DO
2000: 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  B");...case GSCI
2010: 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09  S_TAG_GENDER:...
2020: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2030: 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63  AG_GENDER");...c
2040: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53  ase GSCIS_TAG_US
2050: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2060: 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49  "GSCIS_TAG_USERI
2070: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2080: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09  S_TAG_DOMAIN:...
2090: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
20a0: 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63  AG_DOMAIN");...c
20b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41  ase GSCIS_TAG_PA
20c0: 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72  SSWORD:....retur
20d0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53  n("GSCIS_TAG_PAS
20e0: 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20  SWORD");...case 
20f0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52  GSCIS_TAG_ISSUER
2100: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
2110: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2120: 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  D");...case GSCI
2130: 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09  S_TAG_SERNO:....
2140: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2150: 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73  G_SERNO");...cas
2160: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2170: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
2180: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53  n("GSCIS_TAG_ISS
2190: 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  UE_DATE");...cas
21a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
21b0: 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  RE_DATE:....retu
21c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58  rn("GSCIS_TAG_EX
21d0: 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  PIRE_DATE");...c
21e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
21f0: 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  RD_TYPE:....retu
2200: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2210: 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  RD_TYPE");...cas
2220: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55  e GSCIS_TAG_SECU
2230: 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65  RITY_CODE:....re
2240: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2250: 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b  SECURITY_CODE");
2260: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2270: 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09  G_CARDID_AID:...
2280: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2290: 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b  AG_CARDID_AID");
22a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
22b0: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
22c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
22d0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22  TAG_CERTIFICATE"
22e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
22f0: 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44  TAG_CERT_ISSUE_D
2300: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2310: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
2320: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2330: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
2340: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a  RT_EXPIRE_DATE:.
2350: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2360: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
2370: 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65  _DATE");..}...re
2380: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
2390: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
23a0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
23b0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
23c0: 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65  R_TO_STR(LONG re
23d0: 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68  tcode) {..switch
23e0: 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63   (retcode) {...c
23f0: 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43  ase SCARD_S_SUCC
2400: 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ESS:....return("
2410: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22  SCARD_S_SUCCESS"
2420: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2430: 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09  E_CANCELLED:....
2440: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2450: 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63  CANCELLED");...c
2460: 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54  ase SCARD_E_CANT
2470: 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74  _DISPOSE:....ret
2480: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
2490: 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63  T_DISPOSE");...c
24a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55  ase SCARD_E_INSU
24b0: 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a  FFICIENT_BUFFER:
24c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
24d0: 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54  D_E_INSUFFICIENT
24e0: 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73  _BUFFER");...cas
24f0: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2500: 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e  D_ATR:....return
2510: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
2520: 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20  D_ATR");...case 
2530: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
2540: 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72  HANDLE:....retur
2550: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
2560: 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63  ID_HANDLE");...c
2570: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
2580: 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09  LID_PARAMETER:..
2590: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
25a0: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
25b0: 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TER");...case SC
25c0: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
25d0: 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  RGET:....return(
25e0: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
25f0: 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73  _TARGET");...cas
2600: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
2610: 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  D_VALUE:....retu
2620: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
2630: 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63  LID_VALUE");...c
2640: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  ase SCARD_E_NO_M
2650: 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e  EMORY:....return
2660: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d  ("SCARD_E_NO_MEM
2670: 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ORY");...case SC
2680: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
2690: 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  ADER:....return(
26a0: 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e  "SCARD_E_UNKNOWN
26b0: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
26c0: 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55  e SCARD_E_TIMEOU
26d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
26e0: 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b  ARD_E_TIMEOUT");
26f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2700: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
2710: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  N:....return("SC
2720: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
2730: 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73  OLATION");...cas
2740: 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  e SCARD_E_NO_SMA
2750: 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  RTCARD:....retur
2760: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d  n("SCARD_E_NO_SM
2770: 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ARTCARD");...cas
2780: 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  e SCARD_E_UNKNOW
2790: 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  N_CARD:....retur
27a0: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
27b0: 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  WN_CARD");...cas
27c0: 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  e SCARD_E_PROTO_
27d0: 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74  MISMATCH:....ret
27e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f  urn("SCARD_E_PRO
27f0: 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09  TO_MISMATCH");..
2800: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
2810: 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75  T_READY:....retu
2820: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f  rn("SCARD_E_NOT_
2830: 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20  READY");...case 
2840: 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43  SCARD_E_SYSTEM_C
2850: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
2860: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53  urn("SCARD_E_SYS
2870: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b  TEM_CANCELLED");
2880: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2890: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a  NOT_TRANSACTED:.
28a0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
28b0: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
28c0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
28d0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41  D_E_READER_UNAVA
28e0: 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  ILABLE:....retur
28f0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2900: 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b  R_UNAVAILABLE");
2910: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f  ...case SCARD_W_
2920: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44  UNSUPPORTED_CARD
2930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2940: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
2950: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
2960: 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e  SCARD_W_UNRESPON
2970: 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65  SIVE_CARD:....re
2980: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e  turn("SCARD_W_UN
2990: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22  RESPONSIVE_CARD"
29a0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
29b0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
29c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
29d0: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
29e0: 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ARD");...case SC
29f0: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2a10: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22  RD_W_RESET_CARD"
2a20: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a30: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a  W_REMOVED_CARD:.
2a40: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
2a50: 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22  _W_REMOVED_CARD"
2a60: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2a70: 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a  E_PCI_TOO_SMALL:
2a80: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2a90: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
2aa0: 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  L");...case SCAR
2ab0: 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50  D_E_READER_UNSUP
2ac0: 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72  PORTED:....retur
2ad0: 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45  n("SCARD_E_READE
2ae0: 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  R_UNSUPPORTED");
2af0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2b00: 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52  DUPLICATE_READER
2b10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
2b20: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
2b30: 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20  EADER");...case 
2b40: 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53  SCARD_E_CARD_UNS
2b50: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
2b60: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52  urn("SCARD_E_CAR
2b70: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b  D_UNSUPPORTED");
2b80: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
2b90: 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72  NO_SERVICE:....r
2ba0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
2bb0: 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63  O_SERVICE");...c
2bc0: 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56  ase SCARD_E_SERV
2bd0: 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09  ICE_STOPPED:....
2be0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
2bf0: 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22  SERVICE_STOPPED"
2c00: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
2c10: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a  W_INSERTED_CARD:
2c20: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
2c30: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
2c40: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
2c50: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
2c60: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
2c70: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
2c80: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
2c90: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
2ca0: 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74  UNKNOWN");.}..st
2cb0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2cc0: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
2cd0: 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
2ce0: 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20  uint16_t objid) 
2cf0: 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64  {..switch (objid
2d00: 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30  ) {...case 0x200
2d10: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
2d20: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
2d30: 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09  ENERALINFO");...
2d40: 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09  case 0x2100:....
2d50: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
2d60: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
2d70: 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61  ONALINFO");...ca
2d80: 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65  se 0x3000:....re
2d90: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2da0: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
2db0: 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30  TROL");...case 0
2dc0: 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x4000:....return
2dd0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
2de0: 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61  ID_LOGIN");...ca
2df0: 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65  se 0x5000:....re
2e00: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2e10: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22  _OBJID_CARDINFO"
2e20: 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30 30  );...case 0x6000
2e30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
2e40: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49  KEY_TLV_OBJID_BI
2e50: 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61  OMETRICS");...ca
2e60: 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65  se 0x7000:....re
2e70: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
2e80: 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49  _OBJID_DIGITALSI
2e90: 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20  GCERT");...case 
2ea0: 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72  0x0200:....retur
2eb0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2ec0: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29  JID_CAC_PERSON")
2ed0: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32 3a  ;...case 0x0202:
2ee0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
2ef0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
2f00: 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63  _BENEFITS");...c
2f10: 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72  ase 0x0203:....r
2f20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2f30: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45  V_OBJID_CAC_OTHE
2f40: 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63  RBENEFITS");...c
2f50: 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72  ase 0x0201:....r
2f60: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
2f70: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
2f80: 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  ONNEL");...case 
2f90: 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72  0x02FE:....retur
2fa0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
2fb0: 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22  JID_CAC_PKICERT"
2fc0: 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28  );..}....return(
2fd0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
2fe0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2ff0: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3000: 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53  UNC_APPTYPE_TO_S
3010: 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79  TR(uint8_t appty
3020: 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61  pe) {..switch (a
3030: 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  pptype) {...case
3040: 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e   0x00:....return
3050: 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65  ("NONE");...case
3060: 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e   0x01:....return
3070: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3080: 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61  _GENERIC");...ca
3090: 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75  se 0x02:....retu
30a0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41  rn("CACKEY_TLV_A
30b0: 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_SKI");...case
30c0: 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e   0x03:....return
30d0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
30e0: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
30f0: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b  Y_TLV_APP_SKI");
3100: 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09  ...case 0x04:...
3110: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3120: 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09  TLV_APP_PKI");..
3130: 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72  .case 0x05:....r
3140: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3150: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3160: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3170: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3180: 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  6:....return("CA
3190: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
31a0: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
31b0: 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20  P_PKI");...case 
31c0: 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28  0x07:....return(
31d0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  "CACKEY_TLV_APP_
31e0: 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59  GENERIC | CACKEY
31f0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
3200: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
3210: 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  I");..}...return
3220: 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a  ("INVALID");.}..
3230: 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63  #  define malloc
3240: 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47  (x) CACKEY_DEBUG
3250: 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20  _FUNC_MALLOC(x, 
3260: 5f 5f 66 75 6e 63 5f 5f 29 0a 23 20 20 64 65 66  __func__).#  def
3270: 69 6e 65 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79  ine realloc(x, y
3280: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
3290: 55 4e 43 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79  UNC_REALLOC(x, y
32a0: 2c 20 5f 5f 66 75 6e 63 5f 5f 29 0a 23 65 6c 73  , __func__).#els
32b0: 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b  e.#  define CACK
32c0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32d0: 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x...) /**/.#  de
32e0: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
32f0: 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c  G_PRINTBUF(f, x,
3300: 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69   y) /**/.#  defi
3310: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
3320: 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f 0a 23  PERROR(x) /**/.#
3330: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
3340: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
3350: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
3360: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
3370: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
3380: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
3390: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
33a0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
33b0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
33c0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
33d0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
33e0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
33f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
3400: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
3410: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
3420: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 73 74  BLED".#endif..st
3430: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
3440: 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09 75 6e 73  _identity {..uns
3450: 69 67 6e 65 64 20 63 68 61 72 20 61 70 70 6c 65  igned char apple
3460: 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  t[7];..uint16_t 
3470: 66 69 6c 65 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  file;...unsigned
3480: 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09   char *label;...
3490: 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
34a0: 74 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65  te_len;..unsigne
34b0: 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
34c0: 61 74 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ate;.};..struct 
34d0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
34e0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
34f0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
3500: 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41  identity;...CK_A
3510: 54 54 52 49 42 55 54 45 20 2a 61 74 74 72 69 62  TTRIBUTE *attrib
3520: 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  utes;..CK_ULONG 
3530: 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
3540: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
3550: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69  key_session {..i
3560: 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f  nt active;...CK_
3570: 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
3580: 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61 74 65  ..CK_STATE state
3590: 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  ;..CK_FLAGS flag
35a0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  s;..CK_ULONG ulD
35b0: 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f  eviceError;..CK_
35c0: 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63  VOID_PTR pApplic
35d0: 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46  ation;..CK_NOTIF
35e0: 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75  Y Notify;...stru
35f0: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
3600: 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
3610: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
3620: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
3630: 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f 61 63  ...int search_ac
3640: 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  tive;..CK_ATTRIB
3650: 55 54 45 5f 50 54 52 20 73 65 61 72 63 68 5f 71  UTE_PTR search_q
3660: 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  uery;..CK_ULONG 
3670: 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
3680: 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  nt;..unsigned lo
3690: 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72 5f 69  ng search_curr_i
36a0: 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63  d;...int sign_ac
36b0: 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e  tive;..CK_MECHAN
36c0: 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65  ISM_TYPE sign_me
36d0: 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54  chanism;..CK_BYT
36e0: 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a  E_PTR sign_buf;.
36f0: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73  .unsigned long s
3700: 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73  ign_buflen;..uns
3710: 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f  igned long sign_
3720: 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75 63 74  bufused;..struct
3730: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
3740: 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b   *sign_identity;
3750: 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74 5f 61  ...int decrypt_a
3760: 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41  ctive;..CK_MECHA
3770: 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72 79 70  NISM_TYPE decryp
3780: 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b  t_mechanism;..CK
3790: 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72 79 70  _VOID_PTR decryp
37a0: 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b  t_mech_parm;..CK
37b0: 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d  _ULONG decrypt_m
37c0: 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74  ech_parmlen;..st
37d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
37e0: 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f 69 64  tity *decrypt_id
37f0: 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75  entity;.};..stru
3800: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b  ct cackey_slot {
3810: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
3820: 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
3830: 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63 61  r;...int pcsc_ca
3840: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09 53  rd_connected;..S
3850: 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63 5f  CARDHANDLE pcsc_
3860: 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61 6e  card;...int tran
3870: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a 0a  saction_depth;..
3880: 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
3890: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  .};..typedef enu
38a0: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
38b0: 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30 78  APP_GENERIC = 0x
38c0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
38d0: 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30 78  APP_SKI     = 0x
38e0: 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  02,..CACKEY_TLV_
38f0: 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30 78  APP_PKI     = 0x
3900: 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f  04.} cackey_tlv_
3910: 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64 65  apptype;..typede
3920: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
3930: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3940: 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20 30  ALINFO       = 0
3950: 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2000,..CACKEY_T
3960: 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53  LV_OBJID_PROPERS
3970: 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78 32  ONALINFO   = 0x2
3980: 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  100,..CACKEY_TLV
3990: 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e  _OBJID_ACCESSCON
39a0: 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30 30  TROL     = 0x300
39b0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
39c0: 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20 20  BJID_LOGIN      
39d0: 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30 2c         = 0x4000,
39e0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
39f0: 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20 20  ID_CARDINFO     
3a00: 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a 09       = 0x5000,..
3a10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3a20: 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20 20  _BIOMETRICS     
3a30: 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43 41     = 0x6000,..CA
3a40: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44  CKEY_TLV_OBJID_D
3a50: 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20 20  IGITALSIGCERT   
3a60: 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43 4b   = 0x7000,..CACK
3a70: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3a80: 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20 3d  _PERSON        =
3a90: 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45 59   0x0200,..CACKEY
3aa0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
3ab0: 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20 30  ENEFITS      = 0
3ac0: 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54  x0202,..CACKEY_T
3ad0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3ae0: 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78 30  ERBENEFITS = 0x0
3af0: 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  203,..CACKEY_TLV
3b00: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f  _OBJID_CAC_PERSO
3b10: 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32 30  NNEL     = 0x020
3b20: 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  1,..CACKEY_TLV_O
3b30: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3b40: 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45 0a         = 0x02FE.
3b50: 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  } cackey_tlv_obj
3b60: 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66 20  ectid;..typedef 
3b70: 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 50  enum {..CACKEY_P
3b80: 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
3b90: 4e 54 20 20 20 20 3d 20 32 2c 0a 09 43 41 43 4b  NT    = 2,..CACK
3ba0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41  EY_PCSC_S_TOKENA
3bb0: 42 53 45 4e 54 20 20 20 20 20 3d 20 31 2c 0a 09  BSENT     = 1,..
3bc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
3be0: 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  0,..CACKEY_PCSC_
3bf0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20  E_GENERIC       
3c00: 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f    = -1,..CACKEY_
3c10: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20  PCSC_E_BADPIN   
3c20: 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41         = -2,..CA
3c30: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
3c40: 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33  ED          = -3
3c50: 2c 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a  ,.} cackey_ret;.
3c60: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
3c70: 6c 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e  lv_cardurl {..un
3c80: 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20  signed char     
3c90: 20 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b     rid[5];..cack
3ca0: 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20  ey_tlv_apptype  
3cb0: 20 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65   apptype;..cacke
3cc0: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20  y_tlv_objectid  
3cd0: 6f 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65  objectid;..cacke
3ce0: 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20  y_tlv_objectid  
3cf0: 61 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64  appid;..unsigned
3d00: 20 63 68 61 72 20 20 20 20 20 20 20 20 70 69 6e   char        pin
3d10: 69 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  id;.};..struct c
3d20: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
3d30: 3b 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ;.struct cackey_
3d40: 74 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69  tlv_entity {..ui
3d50: 6e 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65  nt8_t tag;..size
3d60: 5f 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69  _t length;...uni
3d70: 6f 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c  on {...void *val
3d80: 75 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63  ue;...struct cac
3d90: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
3da0: 2a 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a  *value_cardurl;.
3db0: 09 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f  ..uint8_t value_
3dc0: 62 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75  byte;..};...stru
3dd0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
3de0: 74 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a  tity *_next;.};.
3df0: 0a 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61  ./* CACKEY Globa
3e00: 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61  l Handles */.sta
3e10: 74 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79  tic void *cackey
3e20: 5f 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b  _biglock = NULL;
3e30: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
3e40: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61  ackey_session ca
3e50: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32  ckey_sessions[12
3e60: 38 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  8];.static struc
3e70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61  t cackey_slot ca
3e80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b  ckey_slots[128];
3e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
3ea0: 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
3eb0: 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63   0;.static int c
3ec0: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e  ackey_biglock_in
3ed0: 69 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49  it = 0;.CK_C_INI
3ee0: 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63  TIALIZE_ARGS cac
3ef0: 6b 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 20 50 43  key_args;../* PC
3f00: 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  SC Global Handle
3f10: 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43  s */.static LPSC
3f20: 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65  ARDCONTEXT cacke
3f30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
3f40: 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e  NULL;..static un
3f50: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
3f60: 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f  ey_getversion(vo
3f70: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e  id) {..static un
3f80: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76  signed long retv
3f90: 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67  al = 255;..unsig
3fa0: 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d  ned long major =
3fb0: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f   0;..unsigned lo
3fc0: 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63  ng minor = 0;..c
3fd0: 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d  har *major_str =
3fe0: 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69   NULL;..char *mi
3ff0: 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  nor_str = NULL;.
4000: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4010: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
4020: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
4030: 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45  = 255) {...CACKE
4040: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
4050: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20  Returning 0x%lx 
4060: 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76  (cached).", retv
4070: 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72  al);....return(r
4080: 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
4090: 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  val = 0;..#ifdef
40a0: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
40b0: 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73  .        major_s
40c0: 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52  tr = PACKAGE_VER
40d0: 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72  SION;..if (major
40e0: 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20  _str) {..       
40f0: 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c   major = strtoul
4100: 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e  (major_str, &min
4110: 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09  or_str, 10);....
4120: 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b  if (minor_str) {
4130: 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74  ....minor = strt
4140: 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20  oul(minor_str + 
4150: 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09  1, NULL, 10);...
4160: 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  }..}...retval = 
4170: 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20  (major << 16) | 
4180: 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65  (minor << 8);.#e
4190: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
41a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
41b0: 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65  rning 0x%lx", re
41c0: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
41d0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50  retval);.}../* P
41e0: 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e  C/SC Related Fun
41f0: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
4200: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
4210: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
4220: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
4230: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
4240: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
4250: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
4260: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
4270: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
4280: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
4290: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
42a0: 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a  from all cards..
42b0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
42c0: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
42d0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
42e0: 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  oid) {..uint32_t
42f0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
4300: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
4310: 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69  led.");...for (i
4320: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
4330: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
4340: 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
4350: 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
4360: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
4370: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4380: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
4390: 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45  cted) {....CACKE
43a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
43b0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
43c0: 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75  %lu) called", (u
43d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
43e0: 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73  x);.....SCardDis
43f0: 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73  connect(cackey_s
4400: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
4410: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
4420: 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  _CARD);...}....c
4430: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
4440: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
4450: 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b  cted = 0;...cack
4460: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
4470: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
4480: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  = 0;....if (cack
4490: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
44a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45  tive) {....CACKE
44b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
44c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73  Marking active s
44d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67  lot %lu as being
44e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e   reset", (unsign
44f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09  ed long) idx);..
4500: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
4510: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
4520: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  et = 1;..}...CAC
4530: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
4540: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
4550: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
4560: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
4570: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
4580: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
4590: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
45a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
45b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
45c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
45d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
45e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
45f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
4600: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
4610: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
4620: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
4630: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
4640: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
4650: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
4660: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
4670: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
4680: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
4690: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
46a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
46b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
46c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
46d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
46e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
46f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
4700: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
4710: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
4720: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4730: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
4740: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
4750: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
4760: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
4770: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
4780: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
4790: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
47a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
47b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
47c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
47d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
47e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
47f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
4800: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
4810: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
4820: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
4830: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
4840: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
4850: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
4860: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
4870: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
4880: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
4890: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
48a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
48b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
48c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
48d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
48e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
48f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
4900: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
4910: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
4920: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
4930: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
4940: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
4950: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
4960: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
4970: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
4980: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
4990: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
49a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
49b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
49c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
49d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
49e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
49f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
4a00: 6c 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
4a10: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
4a20: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
4a30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
4a40: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09  _GENERIC);...}..
4a50: 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  }..#ifdef HAVE_S
4a60: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45  CARDISVALIDCONTE
4a70: 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  XT..CACKEY_DEBUG
4a80: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73  _PRINTF("SCardIs
4a90: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63  ValidContext() c
4aa0: 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f  alled");..scard_
4ab0: 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43  isvalid_ret = SC
4ac0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
4ad0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
4ae0: 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61  andle);..if (sca
4af0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21  rd_isvalid_ret !
4b00: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
4b10: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
4b20: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64  BUG_PRINTF("Hand
4b30: 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e  le has become in
4b40: 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61  valid (SCardIsVa
4b50: 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f  lidContext = %s/
4b60: 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20  %li), trying to 
4b70: 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22  re-establish..."
4b80: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
4b90: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
4ba0: 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69  STR(scard_isvali
4bb0: 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  d_ret), (long) s
4bc0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
4bd0: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
4be0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
4bf0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
4c00: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73  () called");...s
4c10: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
4c20: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61  _ret = SCardEsta
4c30: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41  blishContext(SCA
4c40: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c  RD_SCOPE_SYSTEM,
4c50: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63   NULL, NULL, cac
4c60: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4c70: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73  ;...if (scard_es
4c80: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  t_context_ret !=
4c90: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
4ca0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
4cb0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
4cc0: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69   to SCardEstabli
4cd0: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64  shContext failed
4ce0: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c   (returned %s/%l
4cf0: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  i), returning in
4d00: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45   failure", CACKE
4d10: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4d20: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
4d30: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
4d40: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
4d50: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
4d60: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63  t);.....free(cac
4d70: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
4d80: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
4d90: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
4da0: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
4db0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
4dc0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
4dd0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
4de0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
4df0: 65 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68  een re-establish
4e00: 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  ed");..}.#endif.
4e10: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
4e20: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
4e30: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ly connected to 
4e40: 50 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67  PC/SC, returning
4e50: 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a   in success");..
4e60: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
4e70: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
4e80: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
4e90: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
4ea0: 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
4eb0: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
4ec0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
4ed0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
4ee0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
4ef0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
4f00: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
4f10: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
4f20: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
4f30: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
4f40: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
4f50: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
4f60: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
4f70: 6d 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  m the PC/SC Conn
4f80: 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61  ection manager a
4f90: 6e 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20  nd updates. *   
4fa0: 20 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e    the global han
4fb0: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
4fc0: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
4fd0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
4fe0: 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f  nect(void) {..LO
4ff0: 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e  NG scard_rel_con
5000: 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  text_ret;...CACK
5010: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5020: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
5030: 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61   (cackey_pcsc_ha
5040: 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ndle == NULL) {.
5050: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
5060: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
5070: 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  .scard_rel_conte
5080: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  xt_ret = SCardRe
5090: 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61  leaseContext(*ca
50a0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
50b0: 29 3b 0a 0a 09 66 72 65 65 28 63 61 63 6b 65 79  );...free(cackey
50c0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
50d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
50e0: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20  le = NULL;...if 
50f0: 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  (scard_rel_conte
5100: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
5110: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72  S_SUCCESS) {...r
5120: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
5130: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
5140: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5150: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
5160: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
5170: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
5180: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
5190: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
51a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
51b0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
51c0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
51d0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
51e0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
51f0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
5200: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
5210: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5220: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5230: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5240: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5250: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5260: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5270: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
5280: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
5290: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
52a0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
52b0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
52c0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
52d0: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
52e0: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
52f0: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
5300: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
5310: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5320: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
5330: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
5340: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5350: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
5360: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
5370: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
5380: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
5390: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
53a0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
53b0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
53c0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
53d0: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
53e0: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
53f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
5400: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5410: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
5420: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
5430: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
5440: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
5450: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
5460: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
5470: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
5480: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
5490: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
54a0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
54b0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
54c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
54d0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
54e0: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
54f0: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
5500: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
5510: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
5520: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
5530: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
5540: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
5550: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
5560: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
5570: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
5580: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
5590: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
55a0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
55b0: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
55c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
55d0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
55e0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
55f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
5600: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
5610: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
5620: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
5630: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
5640: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
5650: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
5660: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
5670: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5680: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
5690: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
56a0: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
56b0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
56c0: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 7d 0a  n_depth = 0;..}.
56d0: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
56e0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
56f0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
5700: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
5710: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
5720: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
5730: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
5740: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
5750: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
5760: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
5770: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
5780: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
5790: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
57a0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
57b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
57c0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
57d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
57e0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
57f0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
5800: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74  TES. *     The t
5810: 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c  ransaction shoul
5820: 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20  d be terminated 
5830: 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e  using "cackey_en
5840: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20  d_transaction". 
5850: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
5860: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62  key_ret cackey_b
5870: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
5880: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
5890: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
58a0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
58b0: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20  conn_ret;..LONG 
58c0: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b  scard_trans_ret;
58d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
58e0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
58f0: 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e  );...cackey_conn
5900: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
5910: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
5920: 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f  ;..if (cackey_co
5930: 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nn_ret != CACKEY
5940: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
5950: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5960: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
5970: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
5980: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
5990: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
59a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
59b0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  NERIC);..}...slo
59c0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
59d0: 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c  epth++;...if (sl
59e0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
59f0: 64 65 70 74 68 20 3e 20 31 29 20 7b 0a 09 09 43  depth > 1) {...C
5a00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5a10: 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61  TF("Already in a
5a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65   transaction, pe
5a30: 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69  rforming no acti
5a40: 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20  on (new depth = 
5a50: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
5a60: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
5a70: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5a80: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
5a90: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  ..scard_trans_re
5aa0: 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72  t = SCardBeginTr
5ab0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
5ac0: 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20  pcsc_card);..if 
5ad0: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  (scard_trans_ret
5ae0: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
5af0: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
5b00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
5b10: 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72  able to begin tr
5b20: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
5b30: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
5b40: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
5b50: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5b60: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
5b70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
5b80: 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74  essfully began t
5b90: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c  ransaction on sl
5ba0: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e  ot (%s)", slot->
5bb0: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
5bc0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
5bd0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
5be0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
5bf0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
5c00: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
5c10: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
5c20: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
5c30: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
5c40: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
5c50: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
5c60: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
5c70: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
5c80: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
5c90: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
5ca0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
5cb0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
5cc0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
5cd0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
5ce0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
5cf0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
5d00: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63  tion requires "c
5d10: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
5d20: 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63  saction" to be c
5d30: 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20  alled first. *. 
5d40: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
5d50: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
5d60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
5d70: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
5d80: 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  slot) {..LONG sc
5d90: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a  ard_trans_ret;..
5da0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5db0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5dc0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63  ...if (!slot->pc
5dd0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
5de0: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
5df0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64  BUG_PRINTF("Card
5e00: 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65   is not connecte
5e10: 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64  d, unable to end
5e20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
5e30: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
5e40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
5e50: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
5e60: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
5e70: 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  th == 0) {...CAC
5e80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5e90: 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20  ("Terminating a 
5ea0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
5eb0: 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22   has not begun!"
5ec0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
5ed0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
5ee0: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
5ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5f00: 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h--;...if (slot-
5f10: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
5f20: 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b  th > 0) {...CACK
5f30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5f40: 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74  "Transactions st
5f50: 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ill in progress,
5f60: 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67   not terminating
5f70: 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63   on-card Transac
5f80: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
5f90: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
5fa0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
5fb0: 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pth);....return(
5fc0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
5fd0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 63 61  NERIC);..}...sca
5fe0: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53  rd_trans_ret = S
5ff0: 43 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69  CardEndTransacti
6000: 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  on(slot->pcsc_ca
6010: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
6020: 43 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72  CARD);..if (scar
6030: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53  d_trans_ret != S
6040: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6050: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6060: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
6070: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
6080: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
6090: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
60a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
60b0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
60c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
60d0: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
60e0: 79 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61  y terminated tra
60f0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74  nsaction on slot
6100: 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63   (%s)", slot->pc
6110: 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65  sc_reader);...re
6120: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6130: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50  _S_OK);.}../* AP
6140: 44 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  DU Related Funct
6150: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
6160: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
6170: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6180: 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74  send_apdu(struct
6190: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
61a0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
61b0: 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65  r class, unsigne
61c0: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
61d0: 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  on, unsigned cha
61e0: 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p1, unsigned c
61f0: 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64  har p2, unsigned
6200: 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e   char lc, unsign
6210: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
6220: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c  nsigned char le,
6230: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
6240: 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ode, unsigned ch
6250: 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69  ar *respdata, si
6260: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
6270: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
6280: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
6290: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
62a0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
62b0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
62c0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
62d0: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a  gned char class.
62e0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
62f0: 43 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41  Class (GSCIS_CLA
6300: 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53  SS_ISO7816 or GS
6310: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
6320: 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20  _PLATFORM. *    
6330: 20 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28       usually), (
6340: 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  CLA). *. *     u
6350: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
6360: 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20  truction. *     
6370: 20 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63      APDU Instruc
6380: 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a  tion (INS). *. *
6390: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
63a0: 61 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20  ar p1. *        
63b0: 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20   APDU Parameter 
63c0: 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20  1 (P1). *. *    
63d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
63e0: 32 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  2. *         APD
63f0: 55 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50  U Parameter 2 (P
6400: 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  2). *. *     uns
6410: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a  igned char lc. *
6420: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65           APDU Le
6430: 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20  ngth of Content 
6440: 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20  (Lc) -- this is 
6450: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64  the length of "d
6460: 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20  ata". *         
6470: 70 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22  parameter.  If "
6480: 64 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69  data" is specifi
6490: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73  ed as NULL, this
64a0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
64b0: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67   *         be ig
64c0: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
64d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
64e0: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
64f0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
6500: 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73  r to send.  It s
6510: 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79  hould be "Lc" by
6520: 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a  tes long.  If. *
6530: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
6540: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22  ed as NULL, "Lc"
6550: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e   will not be sen
6560: 74 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66  t, and this buff
6570: 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20  er will be. *   
6580: 20 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20        ignored.. 
6590: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
65a0: 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20  d char le. *    
65b0: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
65c0: 20 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20   of Expectation 
65d0: 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20  (Le) -- this is 
65e0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
65f0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70  e. *         exp
6600: 65 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66  ected reply.  If
6610: 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69   this is specifi
6620: 65 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20  ed as 0 then it 
6630: 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20  will not. *     
6640: 20 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a      be sent.. *.
6650: 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20   *     uint16_t 
6660: 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20  *respcode. *    
6670: 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74       [OUT] Point
6680: 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66  er to storage of
6690: 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63   APDU response c
66a0: 6f 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  ode.  If this is
66b0: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
66c0: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
66d0: 68 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65  he response code
66e0: 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64   will be discard
66f0: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
6700: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
6710: 70 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20  pdata. *        
6720: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
6730: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
6740: 55 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e  U response data.
6750: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
6760: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
6770: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
6780: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c  esponse data wil
6790: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  l be discarded. 
67a0: 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74   If. *         t
67b0: 68 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e  he "respdata_len
67c0: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  " parameter is s
67d0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
67e0: 2c 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a  , this buffer. *
67f0: 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f           will no
6800: 74 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a  t be updated.. *
6810: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a  . *     size_t *
6820: 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20  respdata_len. * 
6830: 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54          [IN, OUT
6840: 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61  ] Pointer initia
6850: 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ling containing 
6860: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6870: 22 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20  "respdata". *   
6880: 20 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42        buffer.  B
6890: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
68a0: 20 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20   the pointed to 
68b0: 76 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64  value is updated
68c0: 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20   to the. *      
68d0: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74     number of byt
68e0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
68f0: 65 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68  e buffer.  If th
6900: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20  is is specified 
6910: 61 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55  as. *         NU
6920: 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  LL, it will not 
6930: 62 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20  be updated, and 
6940: 22 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20  "respdata" will 
6950: 62 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69  be ignored causi
6960: 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  ng. *         th
6970: 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20  e response data 
6980: 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  to be discarded.
6990: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
69a0: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
69b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
69c0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
69d0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
69e0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
69f0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
6a00: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
6a10: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f  function will co
6a20: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f  nnect to the PC/
6a30: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
6a40: 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20  nager via. *    
6a50: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
6a60: 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64  nect() if needed
6a70: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77  .. *. *     It w
6a80: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
6a90: 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72  he card in the r
6aa0: 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74  eader attached t
6ab0: 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20  o the slot. *   
6ac0: 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74    specified.  It
6ad0: 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20   will reconnect 
6ae0: 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74  to the card if t
6af0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a  he connection. *
6b00: 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a       goes away..
6b10: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6b20: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6b30: 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74  send_apdu(struct
6b40: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
6b50: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
6b60: 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65  r class, unsigne
6b70: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
6b80: 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  on, unsigned cha
6b90: 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p1, unsigned c
6ba0: 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64  har p2, unsigned
6bb0: 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e   char lc, unsign
6bc0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
6bd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c  nsigned char le,
6be0: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
6bf0: 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ode, unsigned ch
6c00: 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69  ar *respdata, si
6c10: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
6c20: 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d  en) {..uint8_t m
6c30: 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72  ajor_rc, minor_r
6c40: 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73  c;..size_t bytes
6c50: 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65  _to_copy, tmp_re
6c60: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 44 57 4f  spdata_len;..DWO
6c70: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57  RD protocol;..DW
6c80: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
6c90: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
6ca0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
6cb0: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
6cc0: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
6cd0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
6ce0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
6cf0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
6d00: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
6d10: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
6d20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6d30: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
6d40: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
6d50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6d60: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
6d70: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
6d80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6d90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
6da0: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
6db0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
6dc0: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
6dd0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
6de0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
6df0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
6e00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6e10: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
6e20: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
6e30: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
6e40: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
6e50: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6e60: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
6e70: 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78  * Transmit */..x
6e80: 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d  mit_len = 0;..xm
6e90: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
6ea0: 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69  +] = class;..xmi
6eb0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
6ec0: 5d 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b  ] = instruction;
6ed0: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
6ee0: 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d  len++] = p1;..xm
6ef0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
6f00: 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61  +] = p2;..if (da
6f10: 74 61 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66  ta) {...xmit_buf
6f20: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
6f30: 63 3b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20  c;...for (idx = 
6f40: 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78  0; idx < lc; idx
6f50: 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  ++) {....xmit_bu
6f60: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
6f70: 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09  data[idx];...}..
6f80: 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78  }...if (le != 0x
6f90: 30 30 29 20 7b 0a 09 09 78 6d 69 74 5f 62 75 66  00) {...xmit_buf
6fa0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
6fb0: 65 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  e;..}.../* Begin
6fc0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
6fd0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
6fe0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
6ff0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 43 41 43  ion(slot);...CAC
7000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
7010: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
7020: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
7030: 69 74 5f 6c 65 6e 29 3b 0a 0a 09 72 65 63 76 5f  it_len);...recv_
7040: 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63  len = sizeof(rec
7050: 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78  v_buf);..scard_x
7060: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
7070: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
7080: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 50  sc_card, SCARD_P
7090: 43 49 5f 54 30 2c 20 78 6d 69 74 5f 62 75 66 2c  CI_T0, xmit_buf,
70a0: 20 78 6d 69 74 5f 6c 65 6e 2c 20 53 43 41 52 44   xmit_len, SCARD
70b0: 5f 50 43 49 5f 54 31 2c 20 72 65 63 76 5f 62 75  _PCI_T1, recv_bu
70c0: 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  f, &recv_len);..
70d0: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
70e0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
70f0: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
7100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7110: 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
7120: 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61  PDU to card (SCa
7130: 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25  rdTransmit() = %
7140: 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f  s/%lx)", CACKEY_
7150: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
7160: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
7170: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73  _xmit_ret), (uns
7180: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72  igned long) scar
7190: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 09 09 43  d_xmit_ret);...C
71a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
71b0: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
71c0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
71d0: 72 65 73 65 74 22 29 3b 0a 0a 09 09 73 6c 6f 74  reset");....slot
71e0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
71f0: 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  pth = 0;...slot-
7200: 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b  >slot_reset = 1;
7210: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ....if (scard_xm
7220: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
7230: 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
7240: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7250: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
7260: 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
7270: 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
7280: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
7290: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
72a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
72b0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
72c0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
72d0: 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45  COL_T0, SCARD_RE
72e0: 53 45 54 5f 43 41 52 44 2c 20 26 70 72 6f 74 6f  SET_CARD, &proto
72f0: 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61  col);....if (sca
7300: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d  rd_reconn_ret ==
7310: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
7320: 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73  ) {...../* Re-es
7330: 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74  tablish transact
7340: 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70  ion, if it was p
7350: 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66  resent */.....if
7360: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
7370: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
7380: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
7390: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
73a0: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
73b0: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
73c0: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
73d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
73e0: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
73f0: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
7400: 69 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 73 63  itting");.....sc
7410: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
7420: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
7430: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7440: 41 52 44 5f 50 43 49 5f 54 30 2c 20 78 6d 69 74  ARD_PCI_T0, xmit
7450: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20  _buf, xmit_len, 
7460: 53 43 41 52 44 5f 50 43 49 5f 54 30 2c 20 72 65  SCARD_PCI_T0, re
7470: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
7480: 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  n);......if (sca
7490: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
74a0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
74b0: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
74c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72  BUG_PRINTF("Retr
74d0: 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72  ansmit failed, r
74e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
74f0: 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e  ure after discon
7500: 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64  necting the card
7510: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20   (SCardTransmit 
7520: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
7530: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
7540: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
7550: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
7560: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
7570: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61  _ret);.......SCa
7580: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
7590: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
75a0: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b  ARD_RESET_CARD);
75b0: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ......slot->pcsc
75c0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
75d0: 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e  = 0;......./* En
75e0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
75f0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  saction */......
7600: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
7610: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
7620: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
7630: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
7640: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
7650: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7660: 49 43 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  IC);.....}....} 
7670: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
7680: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7690: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
76a0: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
76b0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
76c0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
76d0: 44 5f 52 45 53 45 54 5f 43 41 52 44 29 3b 0a 09  D_RESET_CARD);..
76e0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
76f0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
7700: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
7710: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
7720: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
7730: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
7740: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
7750: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
7760: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
7770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7780: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
7790: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
77a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
77b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
77c0: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
77d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
77e0: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
77f0: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
7800: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7810: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7820: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
7830: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
7840: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7850: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
7860: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7870: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
7880: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
7890: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
78a0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
78b0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
78c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
78d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
78e0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
78f0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7900: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7910: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
7920: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52  EBUG_PRINTBUF("R
7930: 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c  eturned Value:",
7940: 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f   recv_buf, recv_
7950: 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76  len);...if (recv
7960: 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a  _len < 2) {.../*
7970: 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73   Minimal respons
7980: 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79  e length is 2 by
7990: 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  tes, returning i
79a0: 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43  n failure */...C
79b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
79c0: 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f  TF("Response too
79d0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
79e0: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65  g in failure (re
79f0: 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20  cv_len = %lu)", 
7a00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
7a10: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a  recv_len);..../*
7a20: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
7a30: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
7a40: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
7a50: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
7a60: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7a70: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7a80: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
7a90: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  e result code */
7aa0: 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63  ..major_rc = rec
7ab0: 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d  v_buf[recv_len -
7ac0: 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d   2];..minor_rc =
7ad0: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
7ae0: 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65  en - 1];..if (re
7af0: 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73  spcode) {...*res
7b00: 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72  pcode = (major_r
7b10: 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f  c << 8) | minor_
7b20: 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75  rc;..}.../* Adju
7b30: 73 74 20 6d 65 73 73 61 67 65 20 62 75 66 66 65  st message buffe
7b40: 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d  r */..recv_len -
7b50: 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79  = 2;.../* Add by
7b60: 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61  tes to return va
7b70: 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70  lue */..tmp_resp
7b80: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69  data_len = 0;..i
7b90: 66 20 28 72 65 73 70 64 61 74 61 20 26 26 20 72  f (respdata && r
7ba0: 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09  espdata_len) {..
7bb0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
7bc0: 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  n = *respdata_le
7bd0: 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  n;....bytes_to_c
7be0: 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  opy = *respdata_
7bf0: 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76  len;....if (recv
7c00: 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f  _len < bytes_to_
7c10: 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73  copy) {....bytes
7c20: 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f  _to_copy = recv_
7c30: 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  len;...}....CACK
7c40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7c50: 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74  "Copying %lu byt
7c60: 65 73 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  es to the buffer
7c70: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
7c80: 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  g) bytes_to_copy
7c90: 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73  );....memcpy(res
7ca0: 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c  pdata, recv_buf,
7cb0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
7cc0: 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62  ...respdata += b
7cd0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
7ce0: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  .*respdata_len =
7cf0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
7d00: 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
7d10: 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63  en -= bytes_to_c
7d20: 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  opy;..} else {..
7d30: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d  .if (recv_len !=
7d40: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
7d50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
7d60: 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20  rowing away %lu 
7d70: 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74  bytes, nowhere t
7d80: 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75  o put them!", (u
7d90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
7da0: 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a  cv_len);...}..}.
7db0: 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  ..if (major_rc =
7dc0: 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57  = 0x61) {.../* W
7dd0: 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a  e need to READ *
7de0: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
7df0: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
7e00: 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b  read required");
7e10: 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70  ....pcsc_getresp
7e20: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
7e30: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
7e40: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
7e50: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  6, GSCIS_INSTR_G
7e60: 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30  ET_RESPONSE, 0x0
7e70: 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c  0, 0x00, 0, NULL
7e80: 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70  , minor_rc, resp
7e90: 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20  code, respdata, 
7ea0: 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  &tmp_respdata_le
7eb0: 6e 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 67  n);...if (pcsc_g
7ec0: 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41  etresp_ret != CA
7ed0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
7ee0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
7ef0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
7f00: 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20 52   read failed!  R
7f10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
7f20: 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e  ure");...../* En
7f30: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
7f40: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
7f50: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
7f60: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
7f70: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7f80: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7f90: 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61  .}....if (respda
7fa0: 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65  ta_len) {....*re
7fb0: 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d  spdata_len += tm
7fc0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a  p_respdata_len;.
7fd0: 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d  ..}..../* End Sm
7fe0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
7ff0: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
8000: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8010: 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  slot);....CACKEY
8020: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
8030: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
8040: 65 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64  ess (buffer read
8050: 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09   complete)");...
8060: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8070: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f  SC_S_OK);..}.../
8080: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
8090: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
80a0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
80b0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
80c0: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
80d0: 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63  0x90) {.../* Suc
80e0: 63 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59  cess */...CACKEY
80f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
8100: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
8110: 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20  ess (major_rc = 
8120: 30 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75  0x90)");....retu
8130: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
8140: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  _OK);..}....CACK
8150: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8160: 22 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61  "APDU Returned a
8170: 6e 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69  n error, returni
8180: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8190: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
81a0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
81b0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
81c0: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65  SIS. *     ssize
81d0: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
81e0: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
81f0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
8200: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
8210: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
8220: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
8230: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
8240: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
8250: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8260: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
8270: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8280: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
8290: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
82a0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
82b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
82c0: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
82d0: 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20    [OUT] Buffer. 
82e0: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
82f0: 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20  count. *        
8300: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8310: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72   to attempt to r
8320: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ead. *. *     un
8330: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
8340: 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65  _v. *         Se
8350: 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 65  lect the T-buffe
8360: 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66  r (01) or V-buff
8370: 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 20  er (02) to read 
8380: 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20  from.  . *. *   
8390: 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c    size_t initial
83a0: 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20  _offset. *      
83b0: 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20 6f     Specify the o
83c0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74  ffset to begin t
83d0: 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a  he read from. *.
83e0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
83f0: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
8400: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
8410: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8420: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
8430: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
8440: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
8450: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
8460: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
8470: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
8480: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
8490: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
84a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
84b0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
84c0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
84d0: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
84e0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20  initial_offset) 
84f0: 7b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74  {..size_t offset
8500: 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74   = 0, max_offset
8510: 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e  , max_count;..un
8520: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
8530: 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  2];..uint16_t re
8540: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
8550: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
8560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
8570: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 6d 61 78 5f 6f  lled.");...max_o
8580: 66 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  ffset = count;..
8590: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 32 35 32 3b  max_count = 252;
85a0: 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d  ...if (t_or_v !=
85b0: 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20   1 && t_or_v != 
85c0: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
85d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
85e0: 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d  lid T or V param
85f0: 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20  eter specified, 
8600: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
8610: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
8620: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b  n(-1);..}...cmd[
8630: 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77  0] = t_or_v;...w
8640: 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20  hile (1) {...if 
8650: 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f  (offset >= max_o
8660: 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  ffset) {....CACK
8670: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8680: 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c  "Buffer too smal
8690: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61  l, returning wha
86a0: 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a  t we got...");..
86b0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
86c0: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66  .count = max_off
86d0: 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09  set - offset;...
86e0: 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f  if (count > max_
86f0: 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e  count) {....coun
8700: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  t = max_count;..
8710: 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63  .}....cmd[1] = c
8720: 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65  ount;....send_re
8730: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
8740: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
8750: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
8760: 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
8770: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c  STR_READ_BUFFER,
8780: 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65   ((initial_offse
8790: 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38  t + offset) >> 8
87a0: 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69  ) & 0xff, (initi
87b0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
87c0: 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65  et) & 0xff, size
87d0: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78  of(cmd), cmd, 0x
87e0: 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62  00, &respcode, b
87f0: 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20  uffer + offset, 
8800: 26 63 6f 75 6e 74 29 3b 0a 09 09 69 66 20 28 73  &count);...if (s
8810: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
8820: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
8830: 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
8840: 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09  = 0x6A86) {.....
8850: 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d  if (max_count ==
8860: 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   1) {......break
8870: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78  ;.....}......max
8880: 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  _count = max_cou
8890: 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e  nt / 2;......con
88a0: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
88b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
88c0: 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64  NTF("cackey_send
88d0: 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20  _apdu() failed, 
88e0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
88f0: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75  lure");.....retu
8900: 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f  rn(-1);...}....o
8910: 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a  ffset += count;.
8920: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d  ...if (count < m
8930: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ax_count) {....C
8940: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8950: 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d  TF("Short read -
8960: 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d  - count = %i, cm
8970: 64 5b 31 5d 20 3d 20 25 69 22 2c 20 63 6f 75 6e  d[1] = %i", coun
8980: 74 2c 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09  t, cmd[1]);.....
8990: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
89a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
89b0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
89c0: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
89d0: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
89e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
89f0: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66  et);...return(of
8a00: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  fset);.}../*. * 
8a10: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
8a20: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8a30: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
8a40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8a50: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
8a60: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
8a70: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20  ze_t aid_len);. 
8a80: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8a90: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
8aa0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8ab0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8ac0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8ad0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
8ae0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a  igned char *aid.
8af0: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65   *         Buffe
8b00: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70  r containing App
8b10: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74  let ID to select
8b20: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
8b30: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20  t aid_len. *    
8b40: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
8b50: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64  ytes in the "aid
8b60: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61  " (Applet ID) pa
8b70: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45  rameter. *. * RE
8b80: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8b90: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
8ba0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
8bb0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
8bc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8bd0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
8be0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
8bf0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
8c00: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
8c10: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
8c20: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
8c30: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
8c40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
8c50: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
8c60: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  n) {..int send_r
8c70: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8c80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8c90: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
8ca0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
8cb0: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a  electing applet:
8cc0: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  ", aid, aid_len)
8cd0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
8ce0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
8cf0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
8d00: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
8d10: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47  _INSTR_SELECT, G
8d20: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
8d30: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 43 2c 20  T_APPLET, 0x0C, 
8d40: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78  aid_len, aid, 0x
8d50: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
8d60: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64  NULL);..if (send
8d70: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
8d80: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
8d90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8da0: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  F("Failed to ope
8db0: 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e  n applet, return
8dc0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
8dd0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8de0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8df0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
8e00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
8e10: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
8e20: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
8e30: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8e40: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
8e50: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
8e60: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
8e70: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
8e80: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8e90: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
8ea0: 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  t ef);. *. * ARG
8eb0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
8ec0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8ed0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
8ee0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
8ef0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
8f00: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66       uint16_t ef
8f10: 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d  . *         Elem
8f20: 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65  ental File to se
8f30: 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52  lect. *. * RETUR
8f40: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
8f50: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
8f60: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
8f70: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
8f80: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
8f90: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
8fa0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
8fb0: 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45  his selects an E
8fc0: 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28  lementary File (
8fd0: 45 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75  EF) under the cu
8fe0: 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64  rrently selected
8ff0: 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65  . *     Dedicate
9000: 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20  d File (DF). *. 
9010: 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20  *     Typically 
9020: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  this is called a
9030: 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74  fter selecting t
9040: 68 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65  he correct Apple
9050: 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20  t (using. *     
9060: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
9070: 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72  plet) for VM car
9080: 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ds. *. */.static
9090: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
90a0: 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73  ey_select_file(s
90b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
90c0: 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f  t *slot, uint16_
90d0: 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65  t ef) {..unsigne
90e0: 64 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32  d char fid_buf[2
90f0: 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  ];..int send_ret
9100: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
9110: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
9120: 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68  ");.../* Open th
9130: 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c  e elementary fil
9140: 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d  e */..fid_buf[0]
9150: 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30   = (ef >> 8) & 0
9160: 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d  xff;..fid_buf[1]
9170: 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09   = ef & 0xff;...
9180: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9190: 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66  NTF("Selecting f
91a0: 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e  ile: %04lx", (un
91b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29  signed long) ef)
91c0: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
91d0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
91e0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
91f0: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
9200: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30  _INSTR_SELECT, 0
9210: 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f  x02, 0x0C, sizeo
9220: 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f  f(fid_buf), fid_
9230: 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c  buf, 0x00, NULL,
9240: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
9250: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
9260: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9270: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
9280: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
9290: 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72   to open file, r
92a0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
92b0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
92c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
92d0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
92e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
92f0: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
9300: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
9310: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9320: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
9330: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
9340: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
9350: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
9360: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
9370: 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20  ity *root);. *. 
9380: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
9390: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
93a0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
93b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f  t. *         Roo
93c0: 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73  t of the TLV lis
93d0: 74 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69  t to start freei
93e0: 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ng. *. * RETURN 
93f0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
9400: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
9410: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
9420: 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56  on frees the TLV
9430: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72   linked listed r
9440: 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20  eturned from. * 
9450: 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64      "cackey_read
9460: 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  _tlv". *. */.sta
9470: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
9480: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
9490: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
94a0: 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75  y *root) {..stru
94b0: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
94c0: 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78  tity *curr, *nex
94d0: 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d  t;...if (root ==
94e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
94f0: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72  n;..}...for (cur
9500: 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20  r = root; curr; 
9510: 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09  curr = next) {..
9520: 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e  .next = curr->_n
9530: 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ext;....switch (
9540: 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09  curr->tag) {....
9550: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
9560: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73  CR_TABLE:....cas
9570: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
9580: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20  IFICATE:.....if 
9590: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a  (curr->value) {.
95a0: 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e  .....free(curr->
95b0: 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09  value);.....}...
95c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
95d0: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55   GSCIS_TAG_CARDU
95e0: 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  RL:.....if (curr
95f0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
9600: 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72   {......free(cur
9610: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
9620: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
9630: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28  ak;...}....free(
9640: 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  curr);..}...retu
9650: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
9660: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
9670: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
9680: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
9690: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
96a0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
96b0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
96c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
96d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
96e0: 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  _entity *cackey_
96f0: 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20  read_tlv(struct 
9700: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
9710: 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
9720: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
9730: 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f  curr_entity, *ro
9740: 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74  ot = NULL, *last
9750: 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e   = NULL;..unsign
9760: 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66  ed char tlen_buf
9770: 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30  [2], tval_buf[10
9780: 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73  24], *tval;..uns
9790: 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f  igned char vlen_
97a0: 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66  buf[2], vval_buf
97b0: 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09  [8192], *vval;..
97c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
97d0: 6d 70 62 75 66 3b 0a 09 73 73 69 7a 65 5f 74 20  mpbuf;..ssize_t 
97e0: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
97f0: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
9800: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
9810: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
9820: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
9830: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
9840: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
9850: 56 45 5f 4c 49 42 5a 0a 09 75 4c 6f 6e 67 66 20  VE_LIBZ..uLongf 
9860: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  tmpbuflen;..int 
9870: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a  uncompress_ret;.
9880: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
9890: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
98a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f  lled.");...read_
98b0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
98c0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74  d_buffer(slot, t
98d0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
98e0: 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66  tlen_buf), 1, of
98f0: 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65  fset_t);..if (re
9900: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9910: 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (tlen_buf)) {...
9920: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9930: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9940: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9950: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9960: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9970: 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66  tlen = (tlen_buf
9980: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e  [1] << 8) | tlen
9990: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f  _buf[0];...read_
99a0: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ret = cackey_rea
99b0: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76  d_buffer(slot, v
99c0: 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  len_buf, sizeof(
99d0: 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66  vlen_buf), 2, of
99e0: 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65  fset_v);..if (re
99f0: 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66  ad_ret != sizeof
9a00: 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09  (vlen_buf)) {...
9a10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9a20: 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64  NTF("Read failed
9a30: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9a40: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9a50: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
9a60: 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66  vlen = (vlen_buf
9a70: 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e  [1] << 8) | vlen
9a80: 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45  _buf[0];...CACKE
9a90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9aa0: 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 69 2c  Tag Length = %i,
9ab0: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20   Value Length = 
9ac0: 25 69 22 2c 20 74 6c 65 6e 2c 20 76 6c 65 6e 29  %i", tlen, vlen)
9ad0: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
9ae0: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
9af0: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
9b00: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
9b10: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9b20: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
9b30: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
9b40: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
9b50: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
9b60: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
9b70: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
9b80: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
9b90: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9ba0: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
9bb0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
9bc0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
9bd0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
9be0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
9bf0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
9c00: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
9c10: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
9c20: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
9c30: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
9c40: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
9c50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9c60: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
9c70: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
9c80: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
9c90: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
9ca0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
9cb0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
9cc0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
9cd0: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
9ce0: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
9cf0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
9d00: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
9d10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9d20: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
9d30: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
9d40: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
9d50: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
9d60: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
9d70: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
9d80: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
9d90: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
9da0: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
9db0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
9dc0: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
9dd0: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
9de0: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
9df0: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
9e00: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
9e10: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
9e20: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
9e30: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
9e40: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
9e50: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
9e60: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
9e70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9e80: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
9e90: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
9ea0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
9eb0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
9ec0: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
9ed0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
9ee0: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
9ef0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
9f00: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
9f10: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
9f20: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
9f30: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
9f40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
9f50: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
9f60: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
9f70: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
9f80: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
9f90: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
9fa0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
9fb0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
9fc0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
9fd0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
9fe0: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
9ff0: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
a000: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
a010: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
a020: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
a030: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
a040: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
a050: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
a060: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
a070: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
a080: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
a090: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
a0a0: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
a0b0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
a0c0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
a0d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a0e0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a0f0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
a100: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
a110: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
a120: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
a130: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
a140: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
a150: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
a160: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
a170: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
a180: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
a190: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
a1a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a1b0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
a1c0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a1d0: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
a1e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
a1f0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
a200: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
a210: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
a220: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
a230: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
a240: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
a250: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  r_entity));.....
a260: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a270: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
a280: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
a290: 62 75 66 6c 65 6e 29 3b 0a 0a 23 69 66 64 65 66  buflen);..#ifdef
a2a0: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 75   HAVE_LIBZ.....u
a2b0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
a2c0: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
a2d0: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
a2e0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
a2f0: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
a300: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
a310: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a320: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a330: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
a340: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
a350: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
a360: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
a370: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
a380: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
a390: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
a3a0: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
a3b0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
a3c0: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
a3d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a3e0: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
a3f0: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
a400: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
a410: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
a420: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
a430: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
a440: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
a450: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
a460: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
a470: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
a480: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
a490: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
a4a0: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
a4b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
a4c0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
a4d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
a4e0: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
a4f0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
a500: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
a510: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
a520: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
a530: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
a540: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
a550: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
a560: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
a570: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
a580: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
a590: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
a5a0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
a5b0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
a5c0: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
a5d0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
a5e0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
a5f0: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
a600: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
a610: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
a620: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
a630: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
a640: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
a650: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
a660: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
a670: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
a680: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
a690: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
a6a0: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
a6b0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
a6c0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
a6d0: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
a6e0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
a6f0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
a700: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
a710: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
a720: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
a730: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
a740: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
a750: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
a760: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
a770: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
a780: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
a790: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
a7a0: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
a7b0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
a7c0: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
a7d0: 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  x < count; idx++
a7e0: 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b  ) {...if (start[
a7f0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
a800: 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72  ) {....free(star
a810: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
a820: 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  te);...}..}...if
a830: 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a   (free_start) {.
a840: 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09  ..free(start);..
a850: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
a860: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
a870: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
a880: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
a890: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
a8a0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
a8b0: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
a8c0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
a8d0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
a8e0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
a8f0: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
a900: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
a910: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
a920: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
a930: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
a940: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
a950: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
a960: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
a970: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
a980: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
a990: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
a9a0: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
a9b0: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
a9c0: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
a9d0: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
a9e0: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
a9f0: 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
aa00: 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09  r curr_aid[7];..
aa10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
aa20: 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63 6b 65  tidx = 0;..cacke
aa30: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
aa40: 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 63 65 72 74  n_ret;..int cert
aa50: 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e  s_resizable;..in
aa60: 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65  t send_ret, sele
aa70: 63 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ct_ret;...CACKEY
aa80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
aa90: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
aaa0: 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  count == NULL) {
aab0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aac0: 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73  PRINTF("count is
aad0: 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67   NULL, returning
aae0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
aaf0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ab00: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21  .}...if (certs !
ab10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
ab20: 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  *count == 0) {..
ab30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ab40: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64  RINTF("Requested
ab50: 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a   we return 0 obj
ab60: 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63  ects, short-circ
ab70: 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  uit");.....retur
ab80: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
ab90: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
aba0: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
abb0: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
abc0: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
abd0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
abe0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
abf0: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
ac00: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
ac10: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
ac20: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
ac30: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
ac40: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
ac50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
ac60: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ac70: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
ac80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
ac90: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
aca0: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
acb0: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
acc0: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
acd0: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
ace0: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
acf0: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
ad00: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
ad10: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
ad20: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
ad30: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
ad40: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
ad50: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
ad60: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
ad70: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
ad80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ad90: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73  NTF("Unable to s
ada0: 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74  elect CCC Applet
adb0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
adc0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 2f 2a 20  ailure");..../* 
add0: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
ade0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
adf0: 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  */...cackey_end_
ae00: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
ae10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
ae20: 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 61 64  L);..}.../* Read
ae30: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
ae40: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
ae50: 54 4c 56 20 2a 2f 0a 09 63 63 63 5f 74 6c 76 20  TLV */..ccc_tlv 
ae60: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c  = cackey_read_tl
ae70: 76 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 4c 6f  v(slot);.../* Lo
ae80: 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c 73 20  ok for CARDURLs 
ae90: 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e 64 20  that coorespond 
aea0: 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73 20 2a  to PKI applets *
aeb0: 2f 0a 09 66 6f 72 20 28 63 63 63 5f 63 75 72 72  /..for (ccc_curr
aec0: 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f   = ccc_tlv; ccc_
aed0: 63 75 72 72 3b 20 63 63 63 5f 63 75 72 72 20 3d  curr; ccc_curr =
aee0: 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74   ccc_curr->_next
aef0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
af00: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
af10: 20 74 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20   tag: %s ... ", 
af20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
af30: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63  C_TAG_TO_STR(ccc
af40: 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09  _curr->tag));...
af50: 09 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74  .if (ccc_curr->t
af60: 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
af70: 43 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 43 41  CARDURL) {....CA
af80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
af90: 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
afa0: 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
afb0: 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
afc0: 73 29 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e  s)");.....contin
afd0: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  ue;...}....if ((
afe0: 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
aff0: 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
b000: 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
b010: 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
b020: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
b030: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b040: 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
b050: 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
b060: 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b  ly care about PK
b070: 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20  I applets, this 
b080: 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a  applet supports:
b090: 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b   %s/%02x)", CACK
b0a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50  EY_DEBUG_FUNC_AP
b0b0: 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63  PTYPE_TO_STR(ccc
b0c0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b0d0: 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20  durl->apptype), 
b0e0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63  (unsigned int) c
b0f0: 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
b100: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
b110: 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ;.....continue;.
b120: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b130: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
b140: 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
b150: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
b160: 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
b170: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b180: 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 43 41 43 4b  l->rid));...CACK
b190: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b1a0: 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
b1b0: 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
b1c0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
b1d0: 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
b1e0: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
b1f0: 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
b200: 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
b210: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
b220: 69 64 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  id);...CACKEY_DE
b230: 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65  BUG_PRINTF("Obje
b240: 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ctID = %s/%04lx"
b250: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
b260: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
b270: 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
b280: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
b290: 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
b2a0: 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
b2b0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
b2c0: 6a 65 63 74 69 64 29 3b 0a 0a 09 09 6d 65 6d 63  jectid);....memc
b2d0: 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
b2e0: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b2f0: 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
b300: 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
b310: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
b320: 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69 7a  ;...curr_aid[siz
b330: 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d 20  eof(curr_aid) - 
b340: 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d 3e  2] = (ccc_curr->
b350: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b360: 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78 66  ppid >> 8) & 0xf
b370: 66 3b 0a 09 09 63 75 72 72 5f 61 69 64 5b 73 69  f;...curr_aid[si
b380: 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
b390: 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e   1] = ccc_curr->
b3a0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
b3b0: 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a 09 09  ppid & 0xff;....
b3c0: 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75 6e 64 20  /* Select found 
b3d0: 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09  applet ... */...
b3e0: 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63  select_ret = cac
b3f0: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
b400: 74 28 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64  t(slot, curr_aid
b410: 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  , sizeof(curr_ai
b420: 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6c 65 63  d));...if (selec
b430: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
b440: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
b450: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b460: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
b470: 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
b480: 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
b490: 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
b4a0: 22 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  ");.....continue
b4b0: 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 2e 2e 2e 20  ;...}..../* ... 
b4c0: 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
b4d0: 29 20 2a 2f 0a 09 09 73 65 6c 65 63 74 5f 72 65  ) */...select_re
b4e0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
b4f0: 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63  t_file(slot, ccc
b500: 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
b510: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b  durl->objectid);
b520: 0a 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
b530: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
b540: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
b550: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b560: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63  "Failed to selec
b570: 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67  t file, skipping
b580: 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
b590: 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  his object");...
b5a0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
b5b0: 0a 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .../* Process th
b5c0: 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f  is file's TLV lo
b5d0: 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66  oking for certif
b5e0: 69 63 61 74 65 73 20 2a 2f 0a 09 09 61 70 70 5f  icates */...app_
b5f0: 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
b600: 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
b610: 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20 3d 20  for (app_curr = 
b620: 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63 75 72  app_tlv; app_cur
b630: 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20 61 70  r; app_curr = ap
b640: 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  p_curr->_next) {
b650: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b660: 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
b670: 61 67 3a 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ag: %s", CACKEY_
b680: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
b690: 4f 5f 53 54 52 28 61 70 70 5f 63 75 72 72 2d 3e  O_STR(app_curr->
b6a0: 74 61 67 29 29 3b 0a 09 09 09 69 66 20 28 61 70  tag));....if (ap
b6b0: 70 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47  p_curr->tag != G
b6c0: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
b6d0: 43 41 54 45 29 20 7b 0a 09 09 09 09 43 41 43 4b  CATE) {.....CACK
b6e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b6f0: 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
b700: 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
b710: 20 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41   about CERTIFICA
b720: 54 45 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e  TEs)");......con
b730: 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
b740: 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
b750: 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74  [outidx];....out
b760: 69 64 78 2b 2b 3b 0a 0a 09 09 09 6d 65 6d 63 70  idx++;.....memcp
b770: 79 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65  y(curr_id->apple
b780: 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
b790: 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
b7a0: 6c 65 74 29 29 3b 0a 09 09 09 63 75 72 72 5f 69  let));....curr_i
b7b0: 64 2d 3e 66 69 6c 65 20 3d 20 63 63 63 5f 63 75  d->file = ccc_cu
b7c0: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
b7d0: 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09 09  l->objectid;....
b7e0: 63 75 72 72 5f 69 64 2d 3e 6c 61 62 65 6c 20 3d  curr_id->label =
b7f0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 75 72 72 5f   NULL;.....curr_
b800: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
b810: 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e  len = app_curr->
b820: 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 63 75 72 72  length;.....curr
b830: 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
b840: 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69   = malloc(curr_i
b850: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
b860: 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63  en);....memcpy(c
b870: 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
b880: 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76  ate, app_curr->v
b890: 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63  alue, curr_id->c
b8a0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
b8b0: 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20  .....if (outidx 
b8c0: 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
b8d0: 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a  .if (certs_resiz
b8e0: 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 2a 63 6f  able) {......*co
b8f0: 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 63  unt *= 2;......c
b900: 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63  erts = realloc(c
b910: 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65  erts, sizeof(*ce
b920: 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29  rts) * (*count))
b930: 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
b940: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
b950: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63  ....}...}....cac
b960: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
b970: 5f 74 6c 76 29 3b 0a 0a 09 09 69 66 20 28 6f 75  _tlv);....if (ou
b980: 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20  tidx >= *count) 
b990: 7b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  {....break;...}.
b9a0: 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 66 72 65 65  .}...cackey_free
b9b0: 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 0a  _tlv(ccc_tlv);..
b9c0: 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78  .*count = outidx
b9d0: 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65  ;...if (certs_re
b9e0: 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72  sizable) {...cer
b9f0: 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
ba00: 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
ba10: 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
ba20: 09 7d 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74  .}.../* Terminat
ba30: 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e  e SmartCard Tran
ba40: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
ba50: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
ba60: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75  on(slot);...retu
ba70: 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a  rn(certs);.}../*
ba80: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ba90: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
baa0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
bab0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
bac0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
bad0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
bae0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
baf0: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
bb00: 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
bb10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
bb20: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63  lot *slot, struc
bb30: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
bb40: 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
bb50: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
bb60: 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20   size_t buflen, 
bb70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
bb80: 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75  utbuf, size_t ou
bb90: 74 62 75 66 6c 65 6e 29 20 7b 0a 09 63 61 63 6b  tbuflen) {..cack
bba0: 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b  ey_ret send_ret;
bbb0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bbc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
bbd0: 29 3b 0a 0a 09 69 66 20 28 62 75 66 6c 65 6e 20  );...if (buflen 
bbe0: 3e 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45  > 255) {...CACKE
bbf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bc00: 45 72 72 6f 72 2e 20 20 62 75 66 6c 65 6e 20 69  Error.  buflen i
bc10: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  s greater than 2
bc20: 35 35 20 28 62 75 66 6c 65 6e 20 3d 20 25 6c 75  55 (buflen = %lu
bc30: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
bc40: 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09  ng) buflen);....
bc50: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
bc60: 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
bc70: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   255) {...CACKEY
bc80: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
bc90: 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 6c 65 6e  rror.  outbuflen
bca0: 20 69 73 20 67 72 61 74 65 72 20 74 68 61 6e 20   is grater than 
bcb0: 32 35 35 20 28 6f 75 74 62 75 66 6c 65 6e 20 3d  255 (outbuflen =
bcc0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
bcd0: 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65  d long) outbufle
bce0: 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  n);....return(-1
bcf0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
bd00: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
bd10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
bd20: 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
bd30: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
bd40: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
bd50: 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
bd60: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bd70: 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
bd80: 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
bd90: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
bda0: 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
bdb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
bdc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bdd0: 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
bde0: 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
bdf0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f  turn(-1);..}.../
be00: 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74  * Begin transact
be10: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
be20: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
be30: 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c  (slot);.../* Sel
be40: 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c  ect correct appl
be50: 65 74 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 73 65  et */..cackey_se
be60: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
be70: 2c 20 69 64 65 6e 74 69 74 79 2d 3e 69 64 65 6e  , identity->iden
be80: 74 69 74 79 2d 3e 61 70 70 6c 65 74 2c 20 73 69  tity->applet, si
be90: 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 69  zeof(identity->i
bea0: 64 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 29  dentity->applet)
beb0: 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
bec0: 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
bed0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
bee0: 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
bef0: 79 2d 3e 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c  y->identity->fil
bf00: 65 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  e);...send_ret =
bf10: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
bf20: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
bf30: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
bf40: 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
bf50: 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 30 78  _SIGNDECRYPT, 0x
bf60: 30 30 2c 20 30 78 30 30 2c 20 62 75 66 6c 65 6e  00, 0x00, buflen
bf70: 2c 20 62 75 66 2c 20 6f 75 74 62 75 66 6c 65 6e  , buf, outbuflen
bf80: 2c 20 4e 55 4c 4c 2c 20 6f 75 74 62 75 66 2c 20  , NULL, outbuf, 
bf90: 26 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 69 66  &outbuflen);..if
bfa0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
bfb0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
bfc0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bfd0: 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65  _PRINTF("ADPU Se
bfe0: 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20  nding Failed -- 
bff0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
c000: 6f 72 2e 22 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64  or.");..../* End
c010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
c020: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
c030: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
c040: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c050: 7d 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  }.../* End trans
c060: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
c070: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
c080: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 43 41 43 4b 45  n(slot);...CACKE
c090: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c0a0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
c0b0: 63 65 73 73 2e 22 29 3b 0a 0a 09 72 65 74 75 72  cess.");...retur
c0c0: 6e 28 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 7d 0a  n(outbuflen);.}.
c0d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c0e0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c0f0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c100: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
c110: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c120: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
c130: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c140: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
c150: 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
c160: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
c170: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
c180: 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
c190: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
c1a0: 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
c1b0: 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
c1c0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
c1d0: 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
c1e0: 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
c1f0: 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
c200: 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
c210: 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65  int16_t response
c220: 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65  _code;..int trie
c230: 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
c240: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a  t send_ret;.../*
c250: 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77   Indicate that w
c260: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62  e do not know ab
c270: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69  out how many tri
c280: 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67  es are remaining
c290: 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72   */..if (tries_r
c2a0: 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
c2b0: 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
c2c0: 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a  _p = -1;..}.../*
c2d0: 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43   Apparently, CAC
c2e0: 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54   PINs are *EXACT
c2f0: 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67  LY* 8 bytes long
c300: 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46   -- pad with 0xF
c310: 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a  F if too short *
c320: 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e  /..if (pin_len >
c330: 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  = 8) {...memcpy(
c340: 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29  cac_pin, pin, 8)
c350: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
c360: 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
c370: 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a  n, pin_len);..}.
c380: 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
c390: 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
c3a0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
c3b0: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
c3c0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
c3d0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
c3e0: 49 46 59 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  IFY, 0x00, 0x00,
c3f0: 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29   sizeof(cac_pin)
c400: 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c  , cac_pin, 0x00,
c410: 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c   &response_code,
c420: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69   NULL, NULL);..i
c430: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
c440: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c450: 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
c460: 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
c470: 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
c480: 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
c490: 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
c4a0: 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
c4b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c4c0: 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
c4d0: 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
c4e0: 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
c4f0: 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
c500: 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  g);.....if (trie
c510: 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
c520: 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61  .....*tries_rema
c530: 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f  ining_p = tries_
c540: 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a  remaining;....}.
c550: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
c560: 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
c570: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
c580: 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78  ponse_code == 0x
c590: 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45  6983) {....CACKE
c5a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c5b0: 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
c5c0: 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20   failed, device 
c5d0: 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09  is locked");....
c5e0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
c5f0: 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09  CSC_E_LOCKED);..
c600: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
c610: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
c620: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
c630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
c640: 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
c650: 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
c660: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c670: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
c680: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
c690: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
c6a0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
c6b0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
c6c0: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
c6d0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c6e0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
c6f0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
c700: 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
c710: 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  ent(struct cacke
c720: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
c730: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
c740: 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49  cc_aid[] = {GSCI
c750: 53 5f 41 49 44 5f 43 43 43 7d 3b 0a 09 69 6e 74  S_AID_CCC};..int
c760: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 2f 2a 20   send_ret;.../* 
c770: 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41  Select the CCC A
c780: 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72  pplet */..send_r
c790: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
c7a0: 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
c7b0: 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  ccc_aid, sizeof(
c7c0: 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28  ccc_aid));..if (
c7d0: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
c7e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
c7f0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
c800: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_S_TOKENABSE
c810: 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  NT);..}...return
c820: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  (CACKEY_PCSC_S_T
c830: 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a  OKENPRESENT);.}.
c840: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c850: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c860: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
c870: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
c880: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c890: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
c8a0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
c8b0: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
c8c0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
c8d0: 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73  ntity_to_label(s
c8e0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
c8f0: 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
c900: 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
c910: 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20  har *label_buf, 
c920: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61  unsigned long la
c930: 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  bel_buf_len) {..
c940: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
c950: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
c960: 63 68 61 72 20 2a 6c 61 62 65 6c 5f 61 73 6e 31  char *label_asn1
c970: 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69  ;..void *certifi
c980: 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f  cate;..int x509_
c990: 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74  read_ret;...cert
c9a0: 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
c9b0: 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
c9c0: 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
c9d0: 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
c9e0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
c9f0: 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
ca00: 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65  _len < 0) {...re
ca10: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
ca20: 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
ca30: 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
ca40: 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
ca50: 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f  ificate_len, (vo
ca60: 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73  id **) &label_as
ca70: 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  n1);..if (x509_r
ca80: 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
ca90: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
caa0: 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
cab0: 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
cac0: 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
cad0: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
cae0: 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
caf0: 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
cb00: 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35  , "CN");..if (x5
cb10: 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
cb20: 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f  ) {...x509_read_
cb30: 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
cb40: 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
cb50: 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
cb60: 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
cb70: 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
cb80: 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  _len, NULL);....
cb90: 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
cba0: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t <= 0) {....ret
cbb0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
cbc0: 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65  ..return(x509_re
cbd0: 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52  ad_ret);.}../* R
cbe0: 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
cbf0: 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
cc00: 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63  t cackey_mutex_c
cc10: 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74  reate(void **mut
cc20: 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
cc30: 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
cc40: 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
cc50: 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
cc60: 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
cc70: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
cc80: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
cc90: 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
cca0: 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
ccb0: 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
ccc0: 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
ccd0: 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
cce0: 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c  ead_mutex = mall
ccf0: 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65  oc(sizeof(*pthre
cd00: 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66  ad_mutex));...if
cd10: 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78   (!pthread_mutex
cd20: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
cd30: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
cd40: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
cd50: 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65  emory.");.....re
cd60: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
cd70: 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  .pthread_retval 
cd80: 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  = pthread_mutex_
cd90: 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74  init(pthread_mut
cda0: 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20  ex, NULL);...if 
cdb0: 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
cdc0: 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
cdd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cde0: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
cdf0: 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  it() returned er
ce00: 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
ce10: 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
ce20: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
ce30: 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68  ....*mutex = pth
ce40: 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65  read_mutex;..} e
ce50: 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
ce60: 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
ce70: 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
ce80: 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
ce90: 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
cea0: 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
ceb0: 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
cec0: 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
ced0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cee0: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
cef0: 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20  s.CreateMutex() 
cf00: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
cf10: 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
cf20: 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
cf30: 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
cf40: 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
cf50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf60: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
cf70: 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
cf80: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
cf90: 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
cfa0: 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
cfb0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
cfc0: 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75  ex_lock(void *mu
cfd0: 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
cfe0: 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
cff0: 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
d000: 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
d010: 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
d020: 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
d030: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
d040: 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
d050: 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
d060: 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
d070: 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
d080: 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
d090: 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74  read_mutex = mut
d0a0: 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ex;....pthread_r
d0b0: 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
d0c0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65  mutex_lock(pthre
d0d0: 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
d0e0: 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
d0f0: 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
d100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d110: 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
d120: 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
d130: 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
d140: 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
d150: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
d160: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
d170: 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  (cackey_args.Loc
d180: 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  kMutex) {....cus
d190: 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
d1a0: 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
d1b0: 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
d1c0: 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
d1d0: 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
d1e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d1f0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
d200: 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72  gs.LockMutex() r
d210: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
d220: 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
d230: 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
d240: 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d250: 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
d260: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d270: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
d280: 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
d290: 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
d2a0: 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
d2b0: 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
d2c0: 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
d2d0: 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  x_unlock(void *m
d2e0: 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
d2f0: 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
d300: 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
d310: 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
d320: 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
d330: 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
d340: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d350: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
d360: 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
d370: 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
d380: 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
d390: 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
d3a0: 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
d3b0: 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
d3c0: 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
d3d0: 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74  _mutex_unlock(pt
d3e0: 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09  hread_mutex);...
d3f0: 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
d400: 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
d410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d420: 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
d430: 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  _unlock() return
d440: 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
d450: 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
d460: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
d470: 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
d480: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
d490: 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b  s.UnlockMutex) {
d4a0: 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
d4b0: 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
d4c0: 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65  UnlockMutex(mute
d4d0: 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74  x);.....if (cust
d4e0: 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52  om_retval != CKR
d4f0: 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
d500: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d510: 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
d520: 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
d530: 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
d540: 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
d550: 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
d560: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
d570: 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
d580: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
d590: 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
d5a0: 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
d5b0: 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn(0);.}..static
d5c0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
d5d0: 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  e_identities(str
d5e0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
d5f0: 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
d600: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
d610: 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
d620: 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
d630: 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e   *curr_attr;..un
d640: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69  signed long id_i
d650: 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09  dx, attr_idx;...
d660: 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
d670: 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69  = NULL || identi
d680: 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29  ties_count == 0)
d690: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
d6a0: 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20  ..for (id_idx = 
d6b0: 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e  0; id_idx < iden
d6c0: 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64  tities_count; id
d6d0: 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28  _idx++) {...if (
d6e0: 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
d6f0: 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b  x].attributes) {
d700: 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64  ....for (attr_id
d710: 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20  x = 0; attr_idx 
d720: 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  < identities[id_
d730: 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
d740: 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  count; attr_idx+
d750: 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74  +) {.....curr_at
d760: 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73  tr = &identities
d770: 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
d780: 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  tes[attr_idx];..
d790: 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
d7a0: 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  r->pValue) {....
d7b0: 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72  ..free(curr_attr
d7c0: 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  ->pValue);.....}
d7d0: 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 69  ....}.....free(i
d7e0: 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
d7f0: 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
d800: 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65  .}..}...free(ide
d810: 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61  ntities);.}..sta
d820: 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45  tic CK_ATTRIBUTE
d830: 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f  _PTR cackey_get_
d840: 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42  attributes(CK_OB
d850: 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
d860: 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63  tclass, struct c
d870: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
d880: 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
d890: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
d8a0: 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c  ntity_num, CK_UL
d8b0: 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
d8c0: 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
d8d0: 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31  BOOL ck_true = 1
d8e0: 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  ;..static CK_BBO
d8f0: 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b  OL ck_false = 0;
d900: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
d910: 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
d920: 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
d930: 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
d940: 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
d950: 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
d960: 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
d970: 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
d980: 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
d990: 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
d9a0: 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
d9b0: 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
d9c0: 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
d9d0: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
d9e0: 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
d9f0: 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
da00: 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
da10: 75 66 5b 31 30 32 34 5d 3b 0a 09 75 6e 73 69 67  uf[1024];..unsig
da20: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
da30: 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
da40: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
da50: 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
da60: 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
da70: 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
da80: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
da90: 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
daa0: 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
dab0: 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
dac0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
dad0: 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
dae0: 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 69 66  ntity_num);...if
daf0: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
db00: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
db10: 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
db20: 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
db30: 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
db40: 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
db50: 4b 45 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KEY) {...CACKEY_
db60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
db70: 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
db80: 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
db90: 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29  d object class")
dba0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
dbb0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43  );..}.../* Get C
dbc0: 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ert */..if (iden
dbd0: 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
dbe0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dbf0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
dc00: 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
dc10: 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74  ), invalid ident
dc20: 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a  iy provided");..
dc30: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dc40: 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  .}...certificate
dc50: 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
dc60: 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
dc70: 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
dc80: 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
dc90: 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
dca0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d  rtificate_len ==
dcb0: 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61   -1 || certifica
dcc0: 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
dcd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dce0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
dcf0: 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
dd00: 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64   this identity d
dd10: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
dd20: 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
dd30: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
dd40: 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f  h it and will no
dd50: 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74  t work");....ret
dd60: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
dd70: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63  /* Verify that c
dd80: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53  ertificate is AS
dd90: 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30  N.1 encoded X.50
dda0: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  9 certificate */
ddb0: 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65  ..if (x509_to_se
ddc0: 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
ddd0: 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
dde0: 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a  n, NULL) < 0) {.
ddf0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
de00: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
de10: 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
de20: 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72  ), the X.509 cer
de30: 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
de40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64  ted with this id
de50: 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61  entity is not va
de60: 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lid");....return
de70: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74  (NULL);..}...ret
de80: 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 31 36 3b 0a  val_count = 16;.
de90: 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
dea0: 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20  (retval_count * 
deb0: 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
dec0: 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ;...for (curr_at
ded0: 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72  tr_type = 0; cur
dee0: 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78  r_attr_type < 0x
def0: 63 65 35 33 36 33 35 66 3b 20 63 75 72 72 5f 61  ce53635f; curr_a
df00: 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  ttr_type++) {...
df10: 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  if (curr_attr_ty
df20: 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09  pe == 0x800) {..
df30: 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ..curr_attr_type
df40: 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09   = 0xce536300;..
df50: 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65  .}....pValue_fre
df60: 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20  e = 0;...pValue 
df70: 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
df80: 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
df90: 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28   -1;....switch (
dfa0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20  curr_attr_type) 
dfb0: 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c  {....case CKA_CL
dfc0: 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASS:.....CACKEY_
dfd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
dfe0: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
dff0: 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78  te CKA_CLASS (0x
e000: 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
e010: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
e020: 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
e030: 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  ...ck_object_cla
e040: 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73  ss = objectclass
e050: 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
e060: 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  &ck_object_class
e070: 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
e080: 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a   = sizeof(ck_obj
e090: 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09  ect_class);.....
e0a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e0b0: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
e0c0: 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
e0d0: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
e0e0: 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54  ng) *((CK_OBJECT
e0f0: 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65  _CLASS *) pValue
e100: 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
e110: 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
e120: 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
e130: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
e140: 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45  TOKEN:.....CACKE
e150: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e160: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
e170: 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28  bute CKA_TOKEN (
e180: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
e190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
e1a0: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
e1b0: 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
e1c0: 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
e1d0: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
e1e0: 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
e1f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e200: 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
e210: 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
e220: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e230: 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
e240: 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
e250: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e260: 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
e270: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
e280: 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
e290: 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
e2a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
e2b0: 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
e2c0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20   CKA_MODIFIABLE 
e2d0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
e2e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e2f0: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
e300: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
e310: 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
e320: 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
e330: 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
e340: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e350: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
e360: 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
e370: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
e380: 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
e390: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
e3a0: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
e3b0: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
e3c0: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
e3d0: 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
e3e0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e3f0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
e400: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
e410: 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c  KA_LABEL (0x%08l
e420: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
e430: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
e440: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f  tr_type);....../
e450: 2a 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65  * Determine name
e460: 20 2a 2f 0a 09 09 09 09 78 35 30 39 5f 72 65 61   */.....x509_rea
e470: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  d_ret = cackey_p
e480: 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
e490: 6c 61 62 65 6c 28 69 64 65 6e 74 69 74 79 2c 20  label(identity, 
e4a0: 75 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66  ucTmpBuf, sizeof
e4b0: 28 75 63 54 6d 70 42 75 66 29 29 3b 0a 09 09 09  (ucTmpBuf));....
e4c0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
e4d0: 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 70  et > 0) {......p
e4e0: 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66  Value = ucTmpBuf
e4f0: 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
e500: 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
e510: 74 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  t;.....}......CA
e520: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e530: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
e540: 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
e550: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
e560: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
e570: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
e580: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a  .case CKA_VALUE:
e590: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e5a0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
e5b0: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
e5c0: 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c  KA_VALUE (0x%08l
e5d0: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
e5e0: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
e5f0: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73  tr_type);......s
e600: 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61  witch (objectcla
e610: 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  ss) {......case 
e620: 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a  CKO_PRIVATE_KEY:
e630: 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
e640: 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
e650: 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
e660: 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
e670: 72 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79  re a private key
e680: 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  .");........brea
e690: 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
e6a0: 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09  _PUBLIC_KEY:....
e6b0: 09 09 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 20  .../* XXX: TODO 
e6c0: 2a 2f 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  */........break;
e6d0: 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43  ......case CKO_C
e6e0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
e6f0: 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69  ..pValue = certi
e700: 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c  ficate;.......ul
e710: 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69  ValueLen = certi
e720: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09  ficate_len;.....
e730: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
e740: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
e750: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
e760: 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
e770: 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
e780: 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
e790: 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
e7a0: 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49  k;....case CKA_I
e7b0: 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  SSUER:.....CACKE
e7c0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e7d0: 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
e7e0: 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20  bute CKA_ISSUER 
e7f0: 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
e800: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e810: 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
e820: 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
e830: 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
e840: 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
e850: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e860: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
e870: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
e880: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
e890: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22   a certificate."
e8a0: 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
e8b0: 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
e8c0: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
e8d0: 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
e8e0: 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
e8f0: 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69  _to_issuer(certi
e900: 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
e910: 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
e920: 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
e930: 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
e940: 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
e950: 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
e960: 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
e970: 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
e980: 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
e990: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
e9a0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
e9b0: 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
e9c0: 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
e9d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
e9e0: 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
e9f0: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
ea00: 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
ea10: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
ea20: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
ea30: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
ea40: 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
ea50: 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
ea60: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ea70: 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
ea80: 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
ea90: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
eaa0: 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
eab0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eac0: 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
ead0: 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
eae0: 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
eaf0: 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
eb00: 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
eb10: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
eb20: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
eb30: 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
eb40: 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
eb50: 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
eb60: 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
eb70: 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
eb80: 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
eb90: 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
eba0: 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
ebb0: 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
ebc0: 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
ebd0: 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
ebe0: 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
ebf0: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
ec00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
ec10: 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
ec20: 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
ec30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ec40: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
ec50: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
ec60: 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09   CKA_SUBJECT:...
ec70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ec80: 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
ec90: 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
eca0: 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78  SUBJECT (0x%08lx
ecb0: 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
ecc0: 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
ecd0: 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
ece0: 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
ecf0: 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
ed00: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
ed10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
ed20: 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
ed30: 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
ed40: 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
ed50: 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
ed60: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
ed70: 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
ed80: 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
ed90: 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
eda0: 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a  t = x509_to_subj
edb0: 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ect(certificate,
edc0: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
edd0: 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
ede0: 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
edf0: 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
ee00: 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
ee10: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
ee20: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
ee30: 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
ee40: 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
ee50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ee60: 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
ee70: 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
ee80: 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
ee90: 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
eea0: 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
eeb0: 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
eec0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eed0: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
eee0: 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
eef0: 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  _ID (0x%08lx) ..
ef00: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
ef10: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
ef20: 70 65 29 3b 0a 0a 09 09 09 09 75 63 54 6d 70 42  pe);......ucTmpB
ef30: 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69  uf[0] = ((identi
ef40: 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38  ty_num + 1) >> 8
ef50: 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63  ) & 0xff;.....uc
ef60: 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64  TmpBuf[1] =  (id
ef70: 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
ef80: 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61  & 0xff;......pVa
ef90: 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b  lue = &ucTmpBuf;
efa0: 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
efb0: 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  = 2;......CACKEY
efc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
efd0: 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
efe0: 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
eff0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
f000: 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
f010: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
f020: 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f  CKA_CERTIFICATE_
f030: 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
f040: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
f050: 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
f060: 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ute CKA_CERTIFIC
f070: 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c  ATE_TYPE (0x%08l
f080: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
f090: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
f0a0: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
f0b0: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
f0c0: 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
f0d0: 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
f0e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
f0f0: 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
f100: 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
f110: 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
f120: 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09  ificate.");.....
f130: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
f140: 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
f150: 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69  upport one certi
f160: 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09  ficate type */..
f170: 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74  ...ck_certificat
f180: 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35  e_type = CKC_X_5
f190: 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  09;......pValue 
f1a0: 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74  = &ck_certificat
f1b0: 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  e_type;.....ulVa
f1c0: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
f1d0: 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
f1e0: 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
f1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
f200: 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
f210: 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28  KC_X_509 (%lu) (
f220: 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
f230: 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
f240: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
f250: 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
f260: 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
f270: 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
f280: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f290: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
f2a0: 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PE:.....CACKEY_D
f2b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
f2c0: 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
f2d0: 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28  e CKA_KEY_TYPE (
f2e0: 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
f2f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
f300: 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
f310: 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
f320: 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
f330: 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  ATE_KEY && objec
f340: 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55  tclass != CKO_PU
f350: 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
f360: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f370: 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
f380: 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
f390: 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
f3a0: 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09   a key.");......
f3b0: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
f3c0: 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
f3d0: 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79  pport one key ty
f3e0: 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79  pe */.....ck_key
f3f0: 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b  _type = CKK_RSA;
f400: 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
f410: 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09  ck_key_type;....
f420: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
f430: 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65  zeof(ck_key_type
f440: 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
f450: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
f460: 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f  . returning CKK_
f470: 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  RSA (%lu) (%p/%l
f480: 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
f490: 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
f4a0: 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
f4b0: 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
f4c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
f4d0: 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
f4e0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f4f0: 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43   CKA_SIGN:.....C
f500: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f510: 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
f520: 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47  ttribute CKA_SIG
f530: 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
f540: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
f550: 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
f560: 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
f570: 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
f580: 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
f590: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
f5a0: 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
f5b0: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
f5c0: 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
f5d0: 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
f5e0: 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
f5f0: 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
f600: 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
f610: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
f620: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f630: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
f640: 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
f650: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f660: 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
f670: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
f680: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
f690: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
f6a0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f6b0: 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09  e CKA_DECRYPT:..
f6c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f6d0: 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
f6e0: 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
f6f0: 5f 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c  _DECRYPT (0x%08l
f700: 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
f710: 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
f720: 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
f730: 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
f740: 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
f750: 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y || objectclass
f760: 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   == CKO_PUBLIC_K
f770: 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
f780: 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
f790: 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
f7a0: 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
f7b0: 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
f7c0: 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
f7d0: 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
f7e0: 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
f7f0: 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
f800: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f810: 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
f820: 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
f830: 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
f840: 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
f850: 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
f860: 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
f870: 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
f880: 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
f890: 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  ;....case CKA_TR
f8a0: 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a  UST_SERVER_AUTH:
f8b0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f8c0: 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
f8d0: 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
f8e0: 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f  KA_TRUST_SERVER_
f8f0: 41 55 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e  AUTH (0x%08lx) .
f900: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
f910: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
f920: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
f930: 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
f940: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
f950: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
f960: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f970: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
f980: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
f990: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
f9a0: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
f9b0: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
f9c0: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
f9d0: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
f9e0: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
f9f0: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
fa00: 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a  ST_CLIENT_AUTH:.
fa10: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fa20: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
fa30: 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
fa40: 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41  A_TRUST_CLIENT_A
fa50: 55 54 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  UTH (0x%08lx) ..
fa60: 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
fa70: 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
fa80: 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
fa90: 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
faa0: 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
fab0: 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
fac0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fad0: 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
fae0: 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
faf0: 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
fb00: 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
fb10: 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
fb20: 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
fb30: 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
fb40: 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
fb50: 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
fb60: 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a  T_CODE_SIGNING:.
fb70: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fb80: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
fb90: 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
fba0: 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
fbb0: 4e 49 4e 47 20 28 30 78 25 30 38 6c 78 29 20 2e  NING (0x%08lx) .
fbc0: 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
fbd0: 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
fbe0: 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
fbf0: 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
fc00: 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
fc10: 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
fc20: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
fc30: 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
fc40: 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
fc50: 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
fc60: 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
fc70: 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
fc80: 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
fc90: 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
fca0: 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
fcb0: 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
fcc0: 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54  ST_EMAIL_PROTECT
fcd0: 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ION:.....CACKEY_
fce0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
fcf0: 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
fd00: 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41  te CKA_TRUST_EMA
fd10: 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 20 28 30  IL_PROTECTION (0
fd20: 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
fd30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
fd40: 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
fd50: 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
fd60: 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
fd70: 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
fd80: 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
fd90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fda0: 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
fdb0: 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
fdc0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fdd0: 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
fde0: 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
fdf0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
fe00: 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
fe10: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
fe20: 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65  ault:.....pValue
fe30: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56   = NULL;.....ulV
fe40: 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
fe50: 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61  NG) -1;.....brea
fe60: 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28  k;...}....if (((
fe70: 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65  CK_LONG) ulValue
fe80: 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e  Len) != ((CK_LON
fe90: 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20  G) -1)) {..../* 
fea0: 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f  Push curr_attr o
feb0: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f  nto the stack */
fec0: 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79  ....curr_attr.ty
fed0: 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74  pe = curr_attr_t
fee0: 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74  ype;....curr_att
fef0: 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  r.ulValueLen = u
ff00: 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63  lValueLen;.....c
ff10: 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20  urr_attr.pValue 
ff20: 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74  = malloc(curr_at
ff30: 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
ff40: 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
ff50: 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c  ttr.pValue, pVal
ff60: 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c  ue, curr_attr.ul
ff70: 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69  ValueLen);.....i
ff80: 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26  f (pValue_free &
ff90: 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  & pValue) {.....
ffa0: 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09  free(pValue);...
ffb0: 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74  .}.....if (numat
ffc0: 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f  trs >= retval_co
ffd0: 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61  unt) {.....retva
ffe0: 6c 5f 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09  l_count *= 2;...
fff0: 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
10000 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
10010 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
10020 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d  (*retval));....}
10030 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74  .....memcpy(&ret
10040 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26  val[numattrs], &
10050 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f  curr_attr, sizeo
10060 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09  f(curr_attr));..
10070 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09  ..numattrs++;...
10080 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74  }..}...if (numat
10090 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65  trs != 0) {...re
100a0 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d  tval_count = num
100b0 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20  attrs;...retval 
100c0 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c  = realloc(retval
100d0 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  , retval_count *
100e0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
100f0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66  );..} else {...f
10100 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ree(retval);....
10110 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  retval = NULL;..
10120 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
10130 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b  numattrs;...CACK
10140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10150 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f  "Returning %lu o
10160 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e  bjects (%p).", n
10170 75 6d 61 74 74 72 73 2c 20 72 65 74 76 61 6c 29  umattrs, retval)
10180 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
10190 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
101a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
101b0 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
101c0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
101d0 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
101e0 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
101f0 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
10200 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
10210 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a  utex_init_ret;..
10220 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10230 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
10240 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
10250 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
10260 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
10270 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
10280 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
10290 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
102a0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
102b0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
102c0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
102d0 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
102e0 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
102f0 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
10300 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
10310 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
10320 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
10330 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
10340 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
10350 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
10360 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
10370 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
10380 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
10390 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
103a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
103b0 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
103c0 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
103d0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
103e0 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
103f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
10400 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
10410 09 09 7d 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ..}....if (args-
10420 3e 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  >pReserved != NU
10430 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
10440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
10450 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
10460 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
10470 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
10480 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
10490 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
104a0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
104b0 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
104c0 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
104d0 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
104e0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
104f0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
10500 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
10510 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
10520 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
10530 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
10540 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
10550 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
10560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10570 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
10580 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
10590 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
105a0 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
105b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
105c0 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
105d0 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
105e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
105f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
10600 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
10610 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
10620 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
10630 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
10640 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
10650 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
10660 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
10670 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
10680 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
10690 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
106a0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
106b0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
106c0 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
106d0 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
106e0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
106f0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
10700 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
10710 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
10720 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  t = 0;..}...cack
10730 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
10740 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
10750 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
10760 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
10770 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
10780 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
10790 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
107a0 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
107b0 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
107c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
107d0 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
107e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
107f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
10800 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
10810 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
10820 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
10830 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   1;..}...CACKEY_
10840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10850 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
10860 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
10870 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
10880 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
10890 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
108a0 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
108b0 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
108c0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
108d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
108e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
108f0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
10900 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
10910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10920 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
10930 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
10940 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
10950 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
10960 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
10970 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
10980 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
10990 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
109a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
109b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
109c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
109d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
109e0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
109f0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
10a00 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
10a10 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
10a20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
10a30 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
10a40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
10a50 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
10a60 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
10a70 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
10a80 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
10a90 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
10aa0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
10ab0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
10ac0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
10ad0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
10ae0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
10af0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
10b00 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
10b10 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
10b20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
10b30 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
10b40 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
10b50 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
10b60 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  );...cackey_init
10b70 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
10b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10b90 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
10ba0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
10bb0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
10bc0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
10bd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
10be0 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
10bf0 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
10c00 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
10c10 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
10c20 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
10c30 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
10c40 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
10c50 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
10c60 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
10c70 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
10c80 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
10c90 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
10ca0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10cc0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
10cd0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
10ce0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
10cf0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
10d00 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
10d10 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
10d20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10d30 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
10d40 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
10d50 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
10d60 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
10d70 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
10d80 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
10d90 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
10da0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
10db0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
10dc0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
10dd0 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
10de0 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
10df0 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
10e00 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
10e10 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
10e20 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
10e30 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
10e40 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
10e50 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
10e60 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
10e70 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
10e80 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
10e90 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
10ea0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
10eb0 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
10ec0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
10ed0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
10ee0 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
10ef0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
10f00 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
10f10 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
10f20 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
10f30 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
10f40 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
10f50 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
10f60 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
10f70 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
10f80 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
10f90 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
10fa0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
10fb0 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
10fc0 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
10fd0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
10fe0 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
10ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11000 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
11010 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
11020 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
11030 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
11040 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
11050 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
11060 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
11070 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
11080 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
11090 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
110a0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
110b0 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
110c0 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
110d0 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
110e0 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
110f0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
11100 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
11110 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
11120 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
11130 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
11140 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
11150 6c 6f 74 3b 0a 09 63 68 61 72 20 2a 70 63 73 63  lot;..char *pcsc
11160 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f  _readers, *pcsc_
11170 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63  readers_s, *pcsc
11180 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f  _readers_e;..DWO
11190 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
111a0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
111b0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
111c0 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
111d0 65 61 64 65 72 5f 6c 65 6e 3b 0a 0a 09 43 41 43  eader_len;...CAC
111e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
111f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
11200 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
11210 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11230 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
11240 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
11250 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
11260 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
11270 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
11280 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
11290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
112a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
112b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
112c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
112d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
112e0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
112f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
11300 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
11310 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
11320 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
11330 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
11340 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11350 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
11360 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
11370 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
11380 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
11390 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
113a0 20 2a 2f 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69   */..if (pSlotLi
113b0 73 74 29 20 7b 0a 09 09 2f 2a 20 4f 6e 6c 79 20  st) {.../* Only 
113c0 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20  update the list 
113d0 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61  of slots if we a
113e0 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  re actually bein
113f0 67 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  g supply the slo
11400 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
11410 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
11420 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
11430 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c  ;....for (currsl
11440 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
11450 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
11460 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
11470 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
11480 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
11490 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
114a0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
114b0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
114c0 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
114d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
114e0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
114f0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
11500 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
11510 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
11520 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  .}.....cackey_sl
11530 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
11540 74 69 76 65 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d  tive = 0;...}..}
11550 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
11560 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73 20  list of readers 
11570 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  */..pcsc_connect
11580 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
11590 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69  sc_connect();..i
115a0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
115b0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
115c0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
115d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
115e0 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  ("Connection to 
115f0 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73  PC/SC failed, as
11600 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22  suming no slots"
11610 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  );....slot_count
11620 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 0;..} else {.
11630 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  ..pcsc_readers_l
11640 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64  en = 0;....scard
11650 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
11660 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
11670 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
11680 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
11690 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
116a0 72 73 5f 6c 65 6e 29 3b 0a 09 09 69 66 20 28 73  rs_len);...if (s
116b0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
116c0 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
116d0 53 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f  SUCCESS && pcsc_
116e0 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30  readers_len != 0
116f0 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64  ) {....pcsc_read
11700 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ers = malloc(pcs
11710 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
11720 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
11730 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  s = pcsc_readers
11740 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74  ;.....scard_list
11750 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
11760 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
11770 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
11780 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72  le, NULL, pcsc_r
11790 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65  eaders, &pcsc_re
117a0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69  aders_len);....i
117b0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
117c0 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
117d0 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
117e0 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
117f0 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73  e = pcsc_readers
11800 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   + pcsc_readers_
11810 6c 65 6e 3b 0a 0a 09 09 09 09 63 75 72 72 73 6c  len;......currsl
11820 6f 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  ot = 0;.....whil
11830 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
11840 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
11850 29 20 7b 0a 09 09 09 09 09 63 75 72 72 5f 72 65  ) {......curr_re
11860 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65  ader_len = strle
11870 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  n(pcsc_readers);
11880 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63  .......if ((pcsc
11890 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f  _readers + curr_
118a0 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63  reader_len) > pc
118b0 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a  sc_readers_e) {.
118c0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
118d0 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75  ..}.......if (cu
118e0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d  rr_reader_len ==
118f0 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61   0) {.......brea
11900 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
11910 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20  if (currslot >= 
11920 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
11930 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
11940 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
11950 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ) {.......CACKEY
11960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11970 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72  ound more reader
11980 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65  s than slots are
11990 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a   available!");..
119a0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
119b0 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59  ..}.......CACKEY
119c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
119d0 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22  ound reader: %s"
119e0 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  , pcsc_readers);
119f0 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
11a00 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
11a10 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
11a20 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
11a30 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
11a40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
11a50 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69  .....if (pSlotLi
11a60 73 74 29 20 7b 0a 09 09 09 09 09 09 63 61 63 6b  st) {.......cack
11a70 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
11a80 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  t].active = 1;..
11a90 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
11aa0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
11ab0 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75 70  _reader = strdup
11ac0 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
11ad0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
11ae0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
11af0 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
11b00 20 3d 20 30 3b 0a 09 09 09 09 09 09 63 61 63 6b   = 0;.......cack
11b10 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
11b20 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
11b30 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
11b40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
11b50 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
11b60 74 20 3d 20 31 3b 0a 09 09 09 09 09 7d 0a 09 09  t = 1;......}...
11b70 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
11b80 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
11b90 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
11ba0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
11bb0 0a 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
11bc0 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c  t > 0) {......sl
11bd0 6f 74 5f 63 6f 75 6e 74 20 3d 20 63 75 72 72 73  ot_count = currs
11be0 6c 6f 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  lot;.....}....} 
11bf0 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
11c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11c10 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53  Second call to S
11c20 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20  CardListReaders 
11c30 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25  failed, return %
11c40 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44  s/%li", CACKEY_D
11c50 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
11c60 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
11c70 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
11c80 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c  , (long) scard_l
11c90 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b  istreaders_ret);
11ca0 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70  ....}.....free(p
11cb0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a  csc_readers_s);.
11cc0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
11cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11ce0 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f  F("First call to
11cf0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
11d00 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
11d10 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
11d20 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
11d30 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
11d40 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
11d50 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
11d60 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
11d70 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
11d80 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
11d90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
11da0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
11db0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
11dc0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
11dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11de0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
11df0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
11e00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
11e10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
11e20 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d  .if (pSlotList =
11e30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c  = NULL) {...*pul
11e40 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
11e50 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  nt;....CACKEY_DE
11e60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
11e70 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
11e80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
11e90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
11ea0 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75  .}...count = *pu
11eb0 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75  lCount;..if (cou
11ec0 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  nt < slot_count)
11ed0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11ee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11ef0 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20   User allocated 
11f00 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74  %lu entries, but
11f10 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74   we have %lu ent
11f20 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73  ries.", count, s
11f30 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
11f40 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
11f50 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
11f60 0a 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
11f70 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
11f80 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 20 63 75 72   slot_count; cur
11f90 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 70 53 6c  rslot++) {...pSl
11fa0 6f 74 4c 69 73 74 5b 63 75 72 72 73 6c 6f 74 5d  otList[currslot]
11fb0 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 7d 0a   = currslot;..}.
11fc0 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
11fd0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
11fe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11ff0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
12000 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
12010 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
12020 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
12030 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
12040 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
12050 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
12060 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
12070 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
12080 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
12090 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
120a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
120b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
120c0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
120d0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
120e0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
120f0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
12100 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
12110 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
12120 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
12130 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
12140 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
12150 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12160 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
12170 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
12180 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
12190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
121a0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
121b0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
121c0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
121d0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
121e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
121f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
12200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12210 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
12220 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
12230 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
12240 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
12250 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
12260 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
12270 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
12280 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
12290 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
122a0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
122b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
122c0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
122d0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
122e0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
122f0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
12300 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
12310 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
12320 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
12330 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
12340 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
12350 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
12360 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
12370 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
12380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
12390 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
123a0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
123b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
123c0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
123d0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
123e0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
123f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
12400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
12410 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
12420 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
12430 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
12440 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
12450 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
12460 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
12470 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
12480 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
12490 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
124a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
124b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
124c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
124d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
124e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
124f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
12510 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
12520 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
12530 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
12540 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
12550 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
12560 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
12570 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65  of(pInfo->slotDe
12580 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65  scription));..me
12590 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mcpy(pInfo->slot
125a0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f  Description, slo
125b0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69  tDescription, si
125c0 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70  zeof(slotDescrip
125d0 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  tion) - 1);...me
125e0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
125f0 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
12600 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
12610 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
12620 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
12630 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79   = strlen(cackey
12640 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
12650 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66  csc_reader);..if
12660 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e   (sizeof(pInfo->
12670 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
12680 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
12690 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f   {...bytes_to_co
126a0 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66  py = sizeof(pInf
126b0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
126c0 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70  D);..}..memcpy(p
126d0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
126e0 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f  erID, cackey_slo
126f0 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
12700 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f  reader, bytes_to
12710 5f 63 6f 70 79 29 3b 0a 0a 09 70 49 6e 66 6f 2d  _copy);...pInfo-
12720 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 0a 09 69 66  >flags = 0;...if
12730 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
12740 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
12750 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
12760 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
12770 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
12780 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
12790 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
127a0 4e 54 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  NT;..}...pInfo->
127b0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
127c0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
127d0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
127e0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
127f0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
12800 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
12810 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
12820 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
12830 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
12840 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
12850 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
12860 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
12870 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...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 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
128a0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
128b0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
128c0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
128d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
128e0 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
128f0 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
12900 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
12910 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
12920 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
12930 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
12940 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
12950 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
12960 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
12970 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
12980 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
12990 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
129a0 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
129b0 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
129c0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
129d0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
129e0 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
129f0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
12a00 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
12a10 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
12a20 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
12a30 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
12a40 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
12a50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
12a60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
12a70 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
12a80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12a90 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
12aa0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
12ab0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
12ac0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
12ad0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
12ae0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
12af0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12b00 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
12b10 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
12b20 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
12b30 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
12b40 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
12b50 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
12b60 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
12b70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
12b80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
12b90 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
12ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12bb0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
12bc0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
12bd0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
12be0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
12bf0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
12c00 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
12c10 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
12c20 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
12c30 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
12c40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
12c50 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
12c60 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
12c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12c80 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
12c90 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
12ca0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
12cb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
12cc0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
12cd0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
12ce0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...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 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
12d10 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
12d20 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
12d30 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
12d40 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
12d50 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
12d60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
12d70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
12d80 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
12d90 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
12da0 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
12db0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
12dc0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
12dd0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
12de0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
12df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
12e00 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
12e10 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
12e20 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
12e30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
12e40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
12e50 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
12e60 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
12e70 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
12e80 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
12e90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
12ea0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
12eb0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
12ec0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
12ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12ee0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
12ef0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
12f00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
12f10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
12f20 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
12f30 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
12f40 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
12f50 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
12f60 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
12f70 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
12f80 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
12f90 62 65 6c 20 3d 20 31 3b 0a 0a 09 70 63 73 63 5f  bel = 1;...pcsc_
12fa0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
12fb0 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26  key_read_certs(&
12fc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
12fd0 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  tID], NULL, &num
12fe0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
12ff0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
13000 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 6e   NULL) {...if (n
13010 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
13020 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63  ...label_ret = c
13030 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
13040 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73  ity_to_label(pcs
13050 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49  c_identities, pI
13060 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
13070 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
13080 29 3b 0a 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  );....if (label_
13090 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 75  ret > 0) {.....u
130a0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
130b0 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a   = 0;....}...}..
130c0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
130d0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
130e0 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
130f0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  1);..}...if (use
13100 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
13110 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
13120 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
13130 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
13140 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
13150 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
13160 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
13170 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
13180 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
13190 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
131a0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
131b0 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
131c0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
131d0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
131e0 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
131f0 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
13200 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
13210 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
13220 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
13230 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
13240 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
13250 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
13260 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
13270 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
13280 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
13290 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
132a0 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
132b0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
132c0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
132d0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
132e0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
132f0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
13300 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
13310 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
13320 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
13330 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
13340 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
13350 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
13360 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
13370 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
13380 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
13390 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
133a0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
133b0 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
133c0 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
133d0 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
133e0 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
133f0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
13400 52 45 44 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c  RED;...pInfo->ul
13410 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  MaxSessionCount 
13420 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
13430 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
13440 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
13450 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70  ons[0])) - 1;..p
13460 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43  Info->ulSessionC
13470 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
13480 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
13490 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
134a0 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
134b0 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77   0;..pInfo->ulRw
134c0 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
134d0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
134e0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
134f0 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d  o->ulMaxPinLen =
13500 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   128;..pInfo->ul
13510 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09  MinPinLen = 0;..
13520 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75  pInfo->ulTotalPu
13530 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
13540 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
13550 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
13560 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d  >ulFreePublicMem
13570 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
13580 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
13590 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
135a0 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  lPrivateMemory =
135b0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
135c0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
135d0 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61  nfo->ulFreePriva
135e0 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
135f0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
13600 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ATION;...CACKEY_
13610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
13620 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
13630 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
13640 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
13650 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
13660 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
13670 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
13680 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  )(CK_FLAGS flags
13690 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
136a0 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49   pSlotID, CK_VOI
136b0 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
136c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
136d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
136e0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
136f0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
13700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13710 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
13720 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
13730 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
13740 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
13750 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
13760 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
13770 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
13780 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13790 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
137a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
137b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
137c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
137d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
137e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
137f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
13800 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
13810 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
13820 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
13830 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
13840 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
13850 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
13860 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
13870 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
13880 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
13890 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
138a0 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
138b0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
138c0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
138d0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
138e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
138f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
13900 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
13910 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
13920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13930 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
13940 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
13950 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
13960 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
13970 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
13980 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
13990 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
139a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
139b0 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
139c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
139d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
139e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
139f0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
13a00 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
13a10 6f 75 6e 74 20 3d 20 33 3b 0a 0a 09 09 43 41 43  ount = 3;....CAC
13a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13a30 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
13a40 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
13a50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
13a60 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
13a70 70 75 6c 43 6f 75 6e 74 20 3c 20 33 29 20 7b 0a  pulCount < 3) {.
13a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
13aa0 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
13ab0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
13ac0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
13ad0 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
13ae0 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
13af0 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 70 4d 65  M_RSA_PKCS;..pMe
13b00 63 68 61 6e 69 73 6d 4c 69 73 74 5b 31 5d 20 3d  chanismList[1] =
13b10 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
13b20 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  CS;..*pulCount =
13b30 20 32 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   2;...CACKEY_DEB
13b40 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
13b50 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
13b60 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
13b70 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
13b80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
13b90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
13ba0 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43  MechanismInfo)(C
13bb0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
13bc0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
13bd0 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43  YPE type, CK_MEC
13be0 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20  HANISM_INFO_PTR 
13bf0 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75  pInfo) {..int mu
13c00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
13c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13c20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
13c30 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
13c40 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
13c50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
13c60 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
13c70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13c80 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
13c90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
13ca0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
13cb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13cc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13cd0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
13ce0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
13cf0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
13d00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
13d10 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
13d20 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
13d30 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
13d40 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
13d50 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
13d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13d80 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
13d90 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
13da0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
13db0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
13dc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
13dd0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
13de0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
13df0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
13e00 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
13e10 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
13e20 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
13e30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13e40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13e50 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
13e60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
13e70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
13e80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
13e90 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
13ea0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
13eb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13ec0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
13ed0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
13ee0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
13ef0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
13f00 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
13f10 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
13f20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
13f30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
13f40 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
13f50 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
13f60 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
13f70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
13f80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
13f90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
13fa0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
13fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13fc0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
13fd0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
13fe0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
13ff0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
14000 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 68 69 73 20  .../* XXX: This 
14010 69 73 20 75 6e 74 65 73 74 65 64 2c 20 61 6e 64  is untested, and
14020 20 66 75 72 74 68 65 72 20 49 27 6d 20 6e 6f 74   further I'm not
14030 20 72 65 61 6c 6c 79 20 73 75 72 65 20 69 66 20   really sure if 
14040 74 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 2e  this is correct.
14050 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 74 79 70   */..switch (typ
14060 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
14070 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
14080 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
14090 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
140a0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
140b0 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
140c0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
140d0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
140e0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
140f0 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
14100 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
14110 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 58 5f  .case CKM_RSA_X_
14120 35 30 39 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  509:....pInfo->u
14130 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31  lMinKeySize = 51
14140 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  2;....pInfo->ulM
14150 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32  axKeySize = 8192
14160 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  ;....pInfo->flag
14170 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46  s = CKF_HW | CKF
14180 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44  _ENCRYPT | CKF_D
14190 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47  ECRYPT | CKF_SIG
141a0 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a  N | CKF_VERIFY;.
141b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
141c0 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b   CKM_SHA1_RSA_PK
141d0 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  CS:....pInfo->ul
141e0 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
141f0 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
14200 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
14210 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
14220 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
14230 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46  SIGN | CKF_VERIF
14240 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y;....break;..}.
14250 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14260 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14270 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
14280 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
14290 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20  (CKR_OK);.}../* 
142a0 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
142b0 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
142c0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
142d0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
142e0 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f  tToken)(CK_SLOT_
142f0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54  ID slotID, CK_UT
14300 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
14310 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
14320 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  en, CK_UTF8CHAR_
14330 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43  PTR pLabel) {..C
14340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14350 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
14360 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
14370 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
14380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14390 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
143a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
143b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
143c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
143d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
143e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
143f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
14400 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
14410 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ECTED (%i)", CKR
14420 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
14430 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  TECTED);...retur
14440 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  n(CKR_TOKEN_WRIT
14450 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a  E_PROTECTED);.}.
14460 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
14470 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
14480 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
14490 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
144a0 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53  _InitPIN)(CK_SES
144b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
144c0 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
144d0 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
144e0 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
144f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14500 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
14510 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
14520 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
14530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
14550 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
14560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
14570 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
14580 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
14590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
145a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
145b0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
145c0 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20  ROTECTED (%i)", 
145d0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
145e0 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65  PROTECTED);...re
145f0 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57  turn(CKR_TOKEN_W
14600 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
14610 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
14620 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
14630 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
14640 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
14650 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53  , C_SetPIN)(CK_S
14660 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
14670 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
14680 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c  HAR_PTR pOldPin,
14690 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50   CK_ULONG ulOldP
146a0 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48  inLen, CK_UTF8CH
146b0 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20  AR_PTR pNewPin, 
146c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69  CK_ULONG ulNewPi
146d0 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
146e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
146f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
14700 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
14710 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
14720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
14730 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
14740 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
14750 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
14760 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
14770 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
14780 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14790 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
147a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
147b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
147c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
147d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
147e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
147f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
14800 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
14810 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65  (CK_RV, C_OpenSe
14820 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  ssion)(CK_SLOT_I
14830 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41  D slotID, CK_FLA
14840 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49  GS flags, CK_VOI
14850 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69  D_PTR pApplicati
14860 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f  on, CK_NOTIFY no
14870 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  tify, CK_SESSION
14880 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65  _HANDLE_PTR phSe
14890 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  ssion) {..unsign
148a0 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e  ed long idx;..in
148b0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
148c0 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69  .int found_sessi
148d0 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59  on = 0;...CACKEY
148e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
148f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
14900 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52  (flags & CKF_SER
14910 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20  IAL_SESSION) != 
14920 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
14930 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  ON) {...return(C
14940 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c  KR_SESSION_PARAL
14950 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  LEL_NOT_SUPPORTE
14960 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
14970 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
14980 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14990 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
149a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
149b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
149c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
149d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
149e0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
149f0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
14a00 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
14a10 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
14a20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
14a30 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
14a40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14a50 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
14a60 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
14a70 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
14a80 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
14a90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
14aa0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
14ab0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
14ac0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
14ad0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
14ae0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
14af0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
14b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14b10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
14b20 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
14b30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
14b40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
14b50 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
14b60 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
14b70 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
14b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
14ba0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
14bb0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
14bc0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
14bd0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
14be0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
14bf0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
14c00 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
14c10 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
14c20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f  INVALID);..}.../
14c30 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
14c40 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c  e card is actual
14c50 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20  ly in the slot. 
14c60 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  */..if (cackey_t
14c70 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
14c80 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
14c90 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
14ca0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
14cb0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
14cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
14cd0 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65  r.  Card not pre
14ce0 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
14cf0 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
14d00 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  VED");....cackey
14d10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
14d20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
14d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56  ..return(CKR_DEV
14d40 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d  ICE_REMOVED);..}
14d50 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b  ...for (idx = 1;
14d60 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
14d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
14d80 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
14d90 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
14da0 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  dx++) {...if (!c
14db0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
14dc0 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
14dd0 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d  .found_session =
14de0 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69   1;.....*phSessi
14df0 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61  on = idx;.....ca
14e00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14e10 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  x].active = 1;..
14e20 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
14e30 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20  s[idx].slotID = 
14e40 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65  slotID;....cacke
14e50 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
14e60 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
14e70 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
14e80 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
14e90 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66  s[idx].flags = f
14ea0 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f  lags;....cackey_
14eb0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c  sessions[idx].ul
14ec0 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b  DeviceError = 0;
14ed0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
14ee0 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63  ons[idx].pApplic
14ef0 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61  ation = pApplica
14f00 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  tion;....cackey_
14f10 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f  sessions[idx].No
14f20 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a  tify = notify;..
14f30 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
14f40 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
14f50 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
14f60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
14f70 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
14f80 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  unt = 0;.....cac
14f90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
14fa0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
14fb0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
14fc0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69  sessions[idx].si
14fd0 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
14fe0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
14ff0 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f  ns[idx].decrypt_
15000 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
15010 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
15020 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
15030 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
15040 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
15050 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
15060 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
15070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15080 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
15090 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
150a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
150b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
150c0 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f  .}...if (!found_
150d0 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43  session) {...CAC
150e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
150f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
15100 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25  SESSION_COUNT (%
15110 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e  i)", CKR_SESSION
15120 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75  _COUNT);....retu
15130 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  rn(CKR_SESSION_C
15140 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  OUNT);..}...CACK
15150 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15160 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
15170 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
15180 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
15190 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
151a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
151b0 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29   C_CloseSession)
151c0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
151d0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
151e0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
151f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15200 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15210 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
15220 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
15230 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15240 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
15250 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
15260 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
15270 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
15280 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
15290 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
152a0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
152b0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
152c0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
152d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
152e0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
152f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15300 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
15310 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
15320 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
15330 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
15340 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
15350 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
15360 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
15370 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
15380 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
15390 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
153a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
153b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
153c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
153d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
153e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
153f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
15400 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
15410 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
15420 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
15430 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
15440 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
15450 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15460 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
15470 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
15480 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
15490 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
154a0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
154b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
154c0 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  n].active = 0;..
154d0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
154e0 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
154f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
15500 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
15510 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
15520 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
15530 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65  s_count);...mute
15540 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
15550 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
15560 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
15570 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
15580 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
15590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
155a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
155b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
155c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
155d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
155e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
155f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15600 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
15610 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
15620 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
15630 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
15640 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c  K_RV, C_CloseAll
15650 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f  Sessions)(CK_SLO
15660 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09  T_ID slotID) {..
15670 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
15680 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
15690 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
156a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
156b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
156c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
156d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
156e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
156f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
15700 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
15710 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
15720 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
15730 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
15740 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
15750 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
15760 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
15770 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
15780 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15790 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
157a0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
157b0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
157c0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
157d0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
157e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
157f0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
15800 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
15810 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
15820 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15830 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
15840 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
15850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15860 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
15870 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
15880 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
15890 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
158a0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
158b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
158c0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
158d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
158e0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
158f0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
15900 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
15910 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
15920 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
15930 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
15940 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
15950 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
15960 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
15970 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  LID);..}...for (
15980 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
15990 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
159a0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
159b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
159c0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
159d0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
159e0 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
159f0 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  e) {....if (cack
15a00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
15a10 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49  .slotID != slotI
15a20 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  D) {.....continu
15a30 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  e;....}.....cack
15a40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
15a50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
15a60 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
15a70 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b  on(idx);....cack
15a80 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
15a90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
15aa0 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
15ab0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
15ac0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
15ad0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
15ae0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
15af0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
15b00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
15b10 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
15b20 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
15b30 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
15b40 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
15b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15b60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
15b70 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
15b80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
15b90 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
15ba0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
15bb0 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  , C_GetSessionIn
15bc0 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fo)(CK_SESSION_H
15bd0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
15be0 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f  CK_SESSION_INFO_
15bf0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
15c00 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
15c10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15c20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15c30 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
15c40 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
15c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15c60 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
15c70 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
15c80 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
15c90 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
15ca0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
15cb0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
15cc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
15cd0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
15ce0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
15cf0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
15d00 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
15d10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
15d20 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
15d30 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
15d40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
15d50 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
15d60 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
15d70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15d80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
15d90 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
15da0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
15db0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
15dc0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
15dd0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
15de0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
15df0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
15e00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
15e10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
15e20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
15e30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
15e40 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
15e50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
15e60 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
15e70 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
15e80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
15e90 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
15ea0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
15eb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
15ec0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
15ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15ee0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
15ef0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
15f00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
15f10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
15f20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
15f30 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63  Info->slotID = c
15f40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
15f50 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
15f60 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d  ..pInfo->state =
15f70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
15f80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
15f90 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ;..pInfo->flags 
15fa0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
15fb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67  s[hSession].flag
15fc0 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76  s;..pInfo->ulDev
15fd0 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65  iceError = cacke
15fe0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
15ff0 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  ion].ulDeviceErr
16000 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  or;...mutex_retv
16010 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
16020 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
16030 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
16040 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
16050 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16060 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16070 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
16080 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
16090 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
160a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
160b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
160d0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
160e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
160f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
16100 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
16110 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
16120 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
16130 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
16140 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
16150 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
16160 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70  _ULONG_PTR pulOp
16170 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29  erationStateLen)
16180 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
16190 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
161a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
161b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
161c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
161d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
161e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
161f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
16200 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
16210 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
16220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16230 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
16240 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
16250 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
16260 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
16270 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
16280 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
16290 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
162a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
162b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
162c0 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  V, C_SetOperatio
162d0 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
162e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
162f0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
16300 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
16310 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72   CK_ULONG ulOper
16320 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43  ationStateLen, C
16330 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
16340 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20  hEncryptionKey, 
16350 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
16360 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   hAuthentication
16370 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
16380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16390 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
163a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
163b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
163c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
163d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
163e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
163f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
16400 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
16410 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
16420 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
16430 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
16440 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
16450 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
16460 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
16470 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
16480 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
16490 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
164a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
164b0 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
164c0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
164d0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
164e0 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
164f0 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
16500 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
16510 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 69  G ulPinLen) {..i
16520 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
16530 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b  ..int login_ret;
16540 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16550 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
16560 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
16570 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
16580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
165a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
165b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
165c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
165d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
165e0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
165f0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
16600 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
16610 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
16620 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
16630 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
16640 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16650 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
16660 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
16670 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
16680 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
16690 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
166a0 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21  ..if (userType !
166b0 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09  = CKU_USER) {...
166c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
166d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
166e0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45  only support USE
166f0 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f  R mode, asked fo
16700 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75  r %lu mode.", (u
16710 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73  nsigned long) us
16720 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72  erType)....retur
16730 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f  n(CKR_USER_TYPE_
16740 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
16750 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
16760 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
16770 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
16780 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
16790 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
167a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
167b0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
167c0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
167d0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
167e0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
167f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
16800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
16810 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
16820 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
16830 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
16840 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16850 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
16860 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
16870 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
16880 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
16890 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
168a0 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d  .}...login_ret =
168b0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63   cackey_login(&c
168c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 61 63 6b  ackey_slots[cack
168d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
168e0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 5d 2c 20 70  sion].slotID], p
168f0 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 4e  Pin, ulPinLen, N
16900 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  ULL);..if (login
16910 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
16920 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61  CSC_S_OK) {...ca
16930 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
16940 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
16950 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f  );....if (login_
16960 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
16970 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09  SC_E_LOCKED) {..
16980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16990 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54  RINTF("Error.  T
169a0 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22  oken is locked."
169b0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
169c0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09  R_PIN_LOCKED);..
169d0 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69  .} else if (logi
169e0 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
169f0 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b  PCSC_E_BADPIN) {
16a00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16a10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16a20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b   Invalid PIN.");
16a30 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
16a40 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
16a50 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
16a60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16a70 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r.  Unknown erro
16a80 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  r returned from 
16a90 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28  cackey_login() (
16aa0 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29  %i)", login_ret)
16ab0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16ac0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
16ad0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
16ae0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
16af0 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53  tate = CKS_RO_US
16b00 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09  ER_FUNCTIONS;...
16b10 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
16b20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
16b30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
16b40 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
16b50 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
16b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
16b80 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
16b90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
16ba0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
16bb0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
16bc0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16bd0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
16be0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
16bf0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
16c00 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
16c10 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
16c20 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
16c30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
16c40 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
16c50 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
16c60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16c70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
16c80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
16c90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16ca0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
16cb0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
16cc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
16cd0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
16ce0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
16cf0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
16d00 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
16d10 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
16d20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
16d30 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
16d40 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
16d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
16d70 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
16d80 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
16d90 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
16da0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
16db0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
16dc0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
16dd0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
16de0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
16df0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
16e00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16e10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
16e20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
16e30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
16e40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
16e50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
16e60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
16e70 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
16e80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
16e90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
16ea0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
16eb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
16ec0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
16ed0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
16ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
16ef0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
16f00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
16f10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
16f20 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
16f30 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
16f40 49 4f 4e 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ION;...mutex_ret
16f50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
16f60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
16f70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
16f80 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
16f90 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16fa0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
16fb0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
16fc0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
16fd0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
16fe0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
16ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17000 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
17010 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
17020 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
17030 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
17040 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
17050 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
17060 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
17070 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
17080 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
17090 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
170a0 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
170b0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
170c0 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
170d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
170e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
170f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
17100 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
17110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17120 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
17130 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
17140 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
17150 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
17160 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
17170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17180 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
17190 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
171a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
171b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
171c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
171d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
171e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
171f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
17200 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
17210 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
17220 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
17230 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
17240 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
17250 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
17260 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
17270 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
17280 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
17290 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
172a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
172b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
172c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
172d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
172e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
172f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
17300 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
17310 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
17320 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
17330 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
17340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17350 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17360 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
17370 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
17380 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
17390 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
173a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
173b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
173c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
173d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
173e0 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
173f0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
17400 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
17410 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
17420 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
17430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17440 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
17450 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
17460 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
17470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17480 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
17490 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
174a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
174b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
174c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
174d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
174e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
174f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
17500 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
17510 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
17520 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
17530 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
17540 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
17550 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
17560 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
17570 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
17580 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
17590 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
175a0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
175b0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
175c0 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
175d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
175e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
175f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
17600 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
17610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17620 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
17630 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
17640 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
17650 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
17660 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
17670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17680 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
17690 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
176a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
176b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
176c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
176d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
176e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
176f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
17700 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
17710 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
17720 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
17730 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
17740 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
17750 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
17760 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
17770 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
17780 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
17790 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
177a0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
177b0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
177c0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
177d0 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
177e0 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
177f0 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
17800 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
17810 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
17820 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
17830 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
17840 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
17850 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
17860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
17870 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
17880 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
17890 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
178a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
178b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
178c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
178d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
178e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
178f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
17900 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
17910 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
17920 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
17930 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
17940 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
17950 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
17960 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
17970 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
17980 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
17990 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
179a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
179b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
179c0 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
179d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
179e0 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
179f0 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
17a00 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
17a10 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
17a20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
17a30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
17a40 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
17a50 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
17a60 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
17a70 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
17a80 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
17a90 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
17aa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17ab0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
17ac0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
17ad0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
17ae0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
17af0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
17b00 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
17b10 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
17b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
17b30 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
17b40 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
17b50 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
17b60 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
17b70 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
17b80 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
17b90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
17ba0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
17bb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
17bc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
17bd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
17be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17bf0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
17c00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
17c10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
17c20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
17c30 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
17c40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
17c50 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
17c60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
17c70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
17c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
17ca0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
17cb0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
17cc0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
17cd0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
17ce0 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
17cf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
17d00 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
17d10 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
17d20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
17d30 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
17d40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
17d50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
17d60 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
17d70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
17d80 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
17d90 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
17da0 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
17db0 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
17dc0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17dd0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
17de0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17df0 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
17e00 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
17e10 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
17e20 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
17e30 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
17e40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
17e50 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
17e60 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
17e70 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
17e80 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
17e90 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
17ea0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
17eb0 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
17ec0 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
17ed0 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
17ee0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
17ef0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17f00 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
17f10 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
17f20 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
17f30 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
17f40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17f50 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
17f60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
17f70 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
17f80 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
17f90 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
17fa0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
17fb0 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
17fc0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
17fd0 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
17fe0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
17ff0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
18000 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
18010 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
18020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18030 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
18040 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
18050 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
18060 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
18070 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
18080 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
18090 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
180a0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
180b0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
180c0 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
180d0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
180e0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
180f0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
18100 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
18110 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
18120 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
18130 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
18140 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
18150 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
18160 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
18170 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
18180 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
18190 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
181a0 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
181b0 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
181c0 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
181d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
181e0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
181f0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
18200 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
18210 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
18220 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
18230 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
18240 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
18250 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
18260 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
18270 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
18280 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
18290 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
182a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
182b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
182c0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
182d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
182e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
182f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
18300 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
18310 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
18320 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
18330 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
18340 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
18350 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
18360 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
18370 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
18380 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
18390 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
183a0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
183b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
183c0 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
183d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
183e0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
183f0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
18400 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
18410 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18420 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
18430 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
18440 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
18450 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
18460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18470 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
18480 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
18490 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
184a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
184b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
184c0 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
184d0 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
184e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
184f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
18500 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
18510 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
18520 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
18530 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
18540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18550 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
18560 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
18570 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
18580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18590 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
185a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
185b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
185c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
185d0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
185e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
185f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
18600 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
18610 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
18620 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
18630 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
18640 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
18650 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
18660 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
18670 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
18680 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
18690 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
186a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
186b0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
186c0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
186d0 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  lCount) {..struc
186e0 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
186f0 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
18700 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
18710 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
18720 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
18730 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
18740 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
18750 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
18760 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
18770 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a  erts, cert_idx;.
18780 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
18790 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
187a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
187b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
187c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
187d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
187e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
187f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
18800 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
18810 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
18820 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
18830 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
18840 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
18850 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
18860 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
18870 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
18880 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
18890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
188a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
188b0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
188c0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
188d0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
188e0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
188f0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
18900 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
18910 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
18920 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
18930 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
18940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
18960 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
18970 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
18980 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
18990 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
189a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
189b0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
189c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
189d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
189e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
189f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
18a00 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
18a10 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
18a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
18a30 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
18a40 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
18a50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18a60 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
18a70 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
18a80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
18a90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
18aa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
18ac0 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61  Search already a
18ad0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
18ae0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
18af0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
18b00 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
18b10 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
18b20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
18b30 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  tID].slot_reset)
18b40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
18b50 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c  G_PRINTF("The sl
18b60 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65  ot has been rese
18b70 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20  t since we last 
18b80 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74  looked for ident
18b90 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e  ities -- rescann
18ba0 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61  ing");....if (ca
18bb0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18bc0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
18bd0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
18be0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
18bf0 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
18c00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
18c10 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
18c20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18c30 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
18c40 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63  es_count);.....c
18c50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
18c60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
18c70 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63  ies = NULL;....c
18c80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
18c90 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
18ca0 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ies_count = 0;..
18cb0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
18cc0 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ts[cackey_sessio
18cd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
18ce0 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  tID].slot_reset 
18cf0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  = 0;..}...if (ca
18d00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
18d10 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
18d20 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
18d30 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
18d40 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
18d50 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
18d60 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  s[cackey_session
18d70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
18d80 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  ID], NULL, &num_
18d90 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63  certs);...if (pc
18da0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
18db0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 43   NULL) {..../* C
18dc0 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66  onvert number of
18dd0 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72   Certs to number
18de0 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09   of objects */..
18df0 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
18e00 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
18e10 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
18e20 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
18e30 0a 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  .....identities 
18e40 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
18e50 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
18e60 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 69 64 5f  ities));.....id_
18e70 69 64 78 20 3d 20 30 3b 0a 09 09 09 66 6f 72 20  idx = 0;....for 
18e80 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63  (cert_idx = 0; c
18e90 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65  ert_idx < num_ce
18ea0 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
18eb0 20 7b 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72   {.....for (curr
18ec0 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43  _id_type = CKO_C
18ed0 45 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72  ERTIFICATE; curr
18ee0 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f  _id_type <= CKO_
18ef0 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72  PRIVATE_KEY; cur
18f00 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  r_id_type++) {..
18f10 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
18f20 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
18f30 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
18f40 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f 69  ttributes(curr_i
18f50 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64  d_type, &pcsc_id
18f60 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
18f70 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  x], cert_idx, &i
18f80 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
18f90 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
18fa0 6e 74 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 69  nt);.......if (i
18fb0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
18fc0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 3d 20  ].attributes == 
18fd0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 64  NULL) {.......id
18fe0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
18ff0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
19000 74 20 3d 20 30 3b 0a 09 09 09 09 09 7d 0a 0a 09  t = 0;......}...
19010 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
19020 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
19030 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
19040 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
19050 73 20 3d 20 69 64 65 6e 74 69 74 69 65 73 3b 0a  s = identities;.
19060 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
19070 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
19080 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
19090 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 09 63 61 63  num_ids;.....cac
190a0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
190b0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
190c0 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
190d0 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  .}..}...if (pTem
190e0 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  plate != NULL) {
190f0 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21  ...if (ulCount !
19100 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  = 0) {....cackey
19110 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19120 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
19130 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74  _count = ulCount
19140 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
19150 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
19160 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61  earch_query = ma
19170 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73  lloc(ulCount * s
19180 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65  izeof(*pTemplate
19190 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ));.....memcpy(c
191a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
191b0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
191c0 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65  query, pTemplate
191d0 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65  , ulCount * size
191e0 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b  of(*pTemplate));
191f0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63  ...} else {....c
19200 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19210 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
19220 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
19230 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
19240 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
19250 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
19260 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  L;...}..} else {
19270 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21  ...if (ulCount !
19280 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  = 0) {....cackey
19290 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
192a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
192b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
192c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
192d0 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70 65  Search query spe
192e0 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
192f0 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75  but number of qu
19300 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70  ery terms not sp
19310 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b  ecified as 0.");
19320 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
19330 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
19340 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ..}....cackey_se
19350 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19360 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
19370 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  unt = 0;...cacke
19380 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19390 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
193a0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63  y = NULL;..}...c
193b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
193c0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
193d0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63  active = 1;..cac
193e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
193f0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
19400 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74  rr_id = 0;...mut
19410 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
19420 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19430 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19440 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
19450 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
19460 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19470 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
19480 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
19490 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
194a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
194b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
194c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
194d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
194e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
194f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
19500 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
19510 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
19520 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
19530 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
19540 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
19550 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
19560 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
19570 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
19580 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
19590 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
195a0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
195b0 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
195c0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
195d0 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
195e0 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
195f0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
19600 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
19610 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
19620 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
19630 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
19640 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
19650 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
19660 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19670 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
19680 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
19690 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
196a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
196b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
196c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
196d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
196e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
196f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
19700 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  (pulObjectCount 
19710 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
19720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19730 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a  ("Error.  pulObj
19740 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  ectCount is NULL
19750 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
19760 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
19770 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
19780 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  ject == NULL && 
19790 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
197a0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
197b0 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
197c0 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
197d0 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
197e0 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
197f0 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a  mediately */...*
19800 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
19810 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   0;....CACKEY_DE
19820 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
19830 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
19840 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
19850 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
19860 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
19870 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
19880 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
19890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
198a0 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62  TF("Error.  phOb
198b0 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ject is NULL.");
198c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
198d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
198e0 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a  }...if (ulMaxObj
198f0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
19900 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19910 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19920 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
19930 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66  f objects specif
19940 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a  ied as zero.");.
19950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
19960 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
19970 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
19980 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
19990 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
199a0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
199b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
199c0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
199d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
199e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
199f0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
19a00 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
19a10 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
19a20 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
19a30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
19a40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
19a50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
19a60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
19a70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
19a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19a90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
19aa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
19ab0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
19ac0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
19ad0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
19ae0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
19af0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
19b00 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19b10 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
19b20 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
19b30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
19b40 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
19b50 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
19b60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
19b70 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
19b80 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
19b90 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
19ba0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
19bb0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
19bc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
19bd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
19be0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19bf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
19c00 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
19c10 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
19c20 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
19c30 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
19c40 29 3b 0a 09 7d 0a 0a 09 63 75 72 72 5f 6f 75 74  );..}...curr_out
19c50 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
19c60 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
19c70 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
19c80 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
19c90 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
19ca0 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
19cb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
19cc0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
19cd0 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
19ce0 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
19cf0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
19d00 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
19d10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
19d20 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
19d30 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
19d40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19d50 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
19d60 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
19d70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19d80 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
19d90 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
19da0 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
19db0 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
19dc0 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
19dd0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
19de0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
19df0 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
19e00 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
19e10 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
19e20 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
19e30 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
19e40 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
19e50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
19e60 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
19e70 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....C
19e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19e90 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
19ea0 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
19eb0 30 38 6c 78 20 69 6e 20 69 64 65 6e 74 69 74 79  08lx in identity
19ec0 3a 25 69 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  :%i...", (unsign
19ed0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
19ee0 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20  tr->type, (int) 
19ef0 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09  curr_id_idx);...
19f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19f10 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75  INTBUF("    Valu
19f20 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c  e looking for:",
19f30 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c   curr_attr->pVal
19f40 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75  ue, curr_attr->u
19f50 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19f60 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
19f70 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
19f80 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d  r_idx < curr_id-
19f90 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
19fa0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
19fb0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 75  ++) {.....if (cu
19fc0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
19fd0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
19fe0 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
19ff0 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
1a000 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a010 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f  INTF("    ... fo
1a020 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70  und matching typ
1a030 65 20 2e 2e 2e 22 29 3b 0a 09 09 09 09 09 43 41  e ...");......CA
1a040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a050 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72  BUF("    ... our
1a060 20 76 61 6c 75 65 3a 22 2c 20 63 75 72 72 5f 69   value:", curr_i
1a070 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
1a080 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
1a090 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61 74  lue, curr_id->at
1a0a0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
1a0b0 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  tr_idx].ulValueL
1a0c0 65 6e 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 63  en);.......if (c
1a0d0 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1a0e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
1a0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a100 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
1a110 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64  . found wildcard
1a120 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 09   match");.......
1a130 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
1a140 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1a150 09 09 09 09 09 7d 0a 0a 20 09 09 09 09 09 69 66  .....}.. .....if
1a160 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56   (curr_attr->ulV
1a170 61 6c 75 65 4c 65 6e 20 3d 3d 20 63 75 72 72 5f  alueLen == curr_
1a180 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
1a190 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
1a1a0 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63  ValueLen && memc
1a1b0 6d 70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  mp(curr_attr->pV
1a1c0 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 61  alue, curr_id->a
1a1d0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
1a1e0 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
1a1f0 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62   curr_id->attrib
1a200 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
1a210 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 20  dx].ulValueLen) 
1a220 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 43 41  == 0) {.......CA
1a230 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a240 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
1a250 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22  und exact match"
1a260 29 3b 0a 0a 09 09 09 09 09 09 6d 61 74 63 68 65  );........matche
1a270 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
1a280 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1a290 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
1a2a0 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75  * If the attribu
1a2b0 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  te could not be 
1a2c0 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20  matched, do not 
1a2d0 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64  try to match add
1a2e0 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74  itional attribut
1a2f0 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65  es */....if (pre
1a300 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
1a310 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  == matched_count
1a320 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
1a330 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
1a340 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
1a350 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a360 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
1a370 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a  _query_count) {.
1a380 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a390 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c  PRINTF("  ... Al
1a3a0 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20  l %i attributes 
1a3b0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
1a3c0 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  d, adding identi
1a3d0 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65  ty:%i to returne
1a3e0 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63  d list", (int) c
1a3f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1a400 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
1a410 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
1a420 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
1a430 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75  .....phObject[cu
1a440 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d  rr_out_id_idx] =
1a450 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31   curr_id_idx + 1
1a460 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63  ;.....ulMaxObjec
1a470 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75  tCount--;.....cu
1a480 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b  rr_out_id_idx++;
1a490 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
1a4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a4b0 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c  TF("  ... Not al
1a4c0 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64  l %i (only found
1a4d0 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20   %i) attributes 
1a4e0 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
1a4f0 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64  d, not adding id
1a500 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74  entity:%i", (int
1a510 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
1a520 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
1a530 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
1a540 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f  (int) matched_co
1a550 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
1a560 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  id_idx);...}..}.
1a570 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1a580 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
1a590 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72  h_curr_id = curr
1a5a0 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62  _id_idx;..*pulOb
1a5b0 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72  jectCount = curr
1a5c0 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 09 6d  _out_id_idx;...m
1a5d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1a5e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1a5f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1a600 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1a610 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1a620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a630 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1a640 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1a650 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1a660 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1a670 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1a680 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a690 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20  ng CKR_OK (%i), 
1a6a0 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c  num objects = %l
1a6b0 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c  u", CKR_OK, *pul
1a6c0 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09  ObjectCount);...
1a6d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1a6e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1a6f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1a700 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29  indObjectsFinal)
1a710 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1a720 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
1a730 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1a740 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a750 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1a760 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1a770 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1a780 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a790 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a7a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1a7b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1a7c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1a7d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1a7e0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
1a7f0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
1a800 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1a810 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1a820 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1a830 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
1a840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a850 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1a860 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
1a870 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
1a880 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
1a890 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
1a8a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1a8b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1a8c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1a8d0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1a8e0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1a8f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a900 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1a910 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1a920 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1a930 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1a940 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1a950 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1a960 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
1a970 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1a980 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1a990 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
1a9a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a9b0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
1a9c0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
1a9d0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1a9e0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1a9f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1aa00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1aa10 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
1aa20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1aa30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1aa40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1aa50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aa60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1aa70 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
1aa80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1aa90 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1aaa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1aab0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
1aac0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1aad0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
1aae0 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f   0;..if (cackey_
1aaf0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ab00 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29  n].search_query)
1ab10 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
1ab20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ab30 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
1ab40 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1ab50 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ab60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ab70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ab80 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1ab90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1aba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1abb0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1abc0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1abd0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1abe0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1abf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ac00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1ac10 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1ac20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1ac30 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1ac40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1ac50 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29  , C_EncryptInit)
1ac60 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1ac70 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1ac80 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1ac90 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1aca0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1acb0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1acc0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1acd0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ace0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1acf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ad00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ad10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ad20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ad30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ad40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ad50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ad60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ad70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ad80 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1ad90 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1ada0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1adb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1adc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1add0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1ade0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1adf0 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b  V, C_Encrypt)(CK
1ae00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1ae10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
1ae20 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
1ae30 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
1ae40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
1ae50 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
1ae60 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
1ae70 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b  ryptedDataLen) {
1ae80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ae90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1aea0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1aeb0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1aec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1aed0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1aee0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1aef0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1af00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1af10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1af20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1af30 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1af40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1af50 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
1af60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1af70 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
1af80 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
1af90 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1afa0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
1afb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1afc0 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
1afd0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1afe0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1aff0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
1b000 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
1b010 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1b020 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
1b030 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1b040 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
1b050 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1b060 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1b070 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1b080 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b090 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b0a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b0b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b0c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b0d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b0e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b0f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1b100 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1b110 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1b120 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1b130 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1b140 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1b150 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1b160 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1b170 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1b180 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1b190 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69  _RV, C_EncryptFi
1b1a0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
1b1b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
1b1c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
1b1d0 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c  stEncryptedPart,
1b1e0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1b1f0 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  lLastEncryptedPa
1b200 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
1b210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b220 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b230 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1b240 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b260 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1b270 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1b280 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1b290 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1b2a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1b2b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b2c0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1b2d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1b2e0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1b2f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1b300 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1b310 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1b320 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1b330 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1b340 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
1b350 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
1b360 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1b370 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1b380 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
1b390 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
1b3a0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
1b3b0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
1b3c0 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
1b3d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b3e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
1b3f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b400 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b420 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1b430 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1b440 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1b450 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1b460 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
1b470 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
1b480 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b490 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1b4a0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
1b4b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1b4c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1b4d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1b4e0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
1b4f0 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
1b500 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
1b510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b520 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
1b530 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
1b540 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
1b550 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
1b560 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
1b570 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
1b580 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
1b590 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
1b5a0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
1b5b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1b5c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b5d0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
1b5e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b5f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b600 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
1b610 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
1b620 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
1b630 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
1b640 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1b650 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1b660 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1b670 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1b680 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1b690 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1b6a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b6b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1b6c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1b6d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1b6e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
1b6f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1b700 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
1b710 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
1b720 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1b730 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
1b740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b750 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1b760 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
1b770 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
1b780 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
1b790 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1b7a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1b7b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1b7c0 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
1b7d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1b7e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1b7f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1b800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b810 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c  ror.  Decrypt al
1b820 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
1b830 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
1b840 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
1b850 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
1b860 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
1b870 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1b880 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1b890 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
1b8a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1b8b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1b8c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b8d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
1b8e0 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
1b8f0 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
1b900 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
1b910 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
1b920 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
1b930 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
1b940 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
1b950 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
1b960 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
1b970 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
1b980 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
1b990 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
1b9a0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
1b9b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b9c0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
1b9d0 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1b9e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1b9f0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
1ba00 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
1ba10 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61  ->mechanism;..ca
1ba20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1ba30 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
1ba40 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63  mech_parm = pMec
1ba50 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74  hanism->pParamet
1ba60 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  er;..cackey_sess
1ba70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
1ba80 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
1ba90 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  len = pMechanism
1baa0 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e  ->ulParameterLen
1bab0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
1bac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1bad0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20  rypt_identity = 
1bae0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1baf0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1bb00 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
1bb10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1bb20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1bb30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1bb40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1bb50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1bb60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bb70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1bb80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1bb90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1bba0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1bbb0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1bbc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1bbd0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1bbe0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1bbf0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1bc00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1bc10 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
1bc20 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
1bc30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1bc40 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
1bc50 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55  ryptedData, CK_U
1bc60 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
1bc70 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
1bc80 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
1bc90 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
1bca0 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  Len) {..CK_ULONG
1bcb0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c   datalen_update,
1bcc0 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a   datalen_final;.
1bcd0 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72  .CK_RV decrypt_r
1bce0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
1bcf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1bd00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1bd10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1bd20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1bd30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1bd40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1bd50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1bd60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1bd70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1bd80 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c  }...if (pulDataL
1bd90 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
1bda0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bdb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44  NTF("Error. pulD
1bdc0 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  ataLen is NULL."
1bdd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1bde0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1bdf0 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70  ..}...datalen_up
1be00 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c  date = *pulDataL
1be10 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  en;...decrypt_re
1be20 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64  t = C_DecryptUpd
1be30 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45  ate(hSession, pE
1be40 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c  ncryptedData, ul
1be50 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
1be60 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
1be70 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28  n_update);..if (
1be80 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
1be90 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
1bea0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1beb0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55  Error.  DecryptU
1bec0 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
1bed0 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
1bee0 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
1bef0 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72   long) decrypt_r
1bf00 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64  et);....return(d
1bf10 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a  ecrypt_ret);..}.
1bf20 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09  ..if (pData) {..
1bf30 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65  .pData += datale
1bf40 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61  n_update;..}..da
1bf50 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70  talen_final = *p
1bf60 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61  ulDataLen - data
1bf70 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65  len_update;...de
1bf80 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65  crypt_ret = C_De
1bf90 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73  cryptFinal(hSess
1bfa0 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74  ion, pData, &dat
1bfb0 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66  alen_final);..if
1bfc0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
1bfd0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
1bfe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bff0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
1c000 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  tFinal() returne
1c010 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
1c020 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
1c030 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f  d long) decrypt_
1c040 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
1c050 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d  decrypt_ret);..}
1c060 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d  ...*pulDataLen =
1c070 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20   datalen_update 
1c080 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  + datalen_final;
1c090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c0a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c0b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c0c0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c0d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c0e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c0f0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
1c100 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
1c110 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1c120 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1c130 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
1c140 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
1c150 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
1c160 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
1c170 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1c180 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61  lPartLen) {..sta
1c190 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b  tic CK_BYTE buf[
1c1a0 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  16384];..ssize_t
1c1b0 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20   buflen;..CK_RV 
1c1c0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
1c1d0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
1c1e0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
1c1f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c200 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c210 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1c220 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1c230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c240 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c250 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c260 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c270 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c280 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1c290 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
1c2a0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
1c2b0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c2c0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1c2d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c2e0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
1c2f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c300 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
1c310 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
1c320 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1c330 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
1c340 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1c350 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
1c360 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
1c370 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
1c380 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
1c390 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
1c3a0 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64  e are asked to d
1c3b0 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e  ecrypt nothing..
1c3c0 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
1c3d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1c3e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1c3f0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
1c400 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
1c410 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1c420 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
1c430 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  tedPart == NULL)
1c440 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c450 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c460 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20   pEncryptedPart 
1c470 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45  is NULL, but ulE
1c480 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
1c490 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
1c4a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1c4b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1c4c0 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50  if (ulEncryptedP
1c4d0 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
1c4e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45  INTF("Error. ulE
1c500 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
1c510 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
1c520 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1c530 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1c540 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1c550 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65  ...if (pulPartLe
1c560 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
1c570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c580 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61  TF("Error. pulPa
1c590 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
1c5a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c5b0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1c5c0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1c5d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1c5e0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1c5f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1c600 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1c610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c630 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1c640 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c650 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1c660 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1c670 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1c680 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
1c690 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1c6a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1c6b0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1c6c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c6d0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
1c6e0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
1c6f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
1c700 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
1c710 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
1c720 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c730 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
1c740 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
1c750 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c760 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c770 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
1c780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c790 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
1c7a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1c7b0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1c7c0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
1c7d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
1c7e0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
1c7f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
1c800 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
1c810 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
1c820 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
1c830 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
1c840 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
1c850 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
1c860 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
1c870 5b 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  [cackey_sessions
1c880 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
1c890 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
1c8a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
1c8b0 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
1c8c0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
1c8d0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
1c8e0 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
1c8f0 62 75 66 29 29 3b 0a 0a 09 09 09 69 66 20 28 62  buf));.....if (b
1c900 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
1c910 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66  ./* Decryption f
1c920 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65  ailed. */.....re
1c930 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
1c940 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65  AL_ERROR;....} e
1c950 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
1c960 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29  ed long) buflen)
1c970 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26   > *pulPartLen &
1c980 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f  & pPart) {...../
1c990 2a 20 44 65 63 72 79 70 74 65 64 20 64 61 74 61  * Decrypted data
1c9a0 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
1c9b0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
1c9c0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
1c9d0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1c9e0 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09  .if (pPart) {...
1c9f0 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c  ...memcpy(pPart,
1ca00 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09   buf, buflen);..
1ca10 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61  ...}......*pulPa
1ca20 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  rtLen = buflen;.
1ca30 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
1ca40 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  R_OK;....}.....b
1ca50 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
1ca60 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ca70 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ca80 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1ca90 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1caa0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1cab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cac0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1cad0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1cae0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1caf0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
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 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
1cb20 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
1cb30 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
1cb40 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
1cb50 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1cb60 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  , C_DecryptFinal
1cb70 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1cb80 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1cb90 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50  _BYTE_PTR pLastP
1cba0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
1cbb0 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  R pulLastPartLen
1cbc0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1cbd0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d  etval;..int term
1cbe0 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
1cbf0 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
1cc00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1cc10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1cc20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1cc30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cc40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cc50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1cc60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cc70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1cc80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1cc90 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
1cca0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
1ccb0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1ccc0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1ccd0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1cce0 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
1ccf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cd00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
1cd10 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
1cd20 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1cd30 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1cd40 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1cd50 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50  }...if (pulLastP
1cd60 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  artLen == NULL) 
1cd70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cd80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cd90 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69  pulLastPartLen i
1cda0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1cdb0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1cdc0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
1cdd0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1cde0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1cdf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ce00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1ce10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1ce20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ce30 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1ce40 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1ce50 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1ce60 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1ce70 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
1ce80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
1ce90 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
1cea0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ceb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1cec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ced0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1cee0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
1cef0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
1cf00 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
1cf10 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
1cf20 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1cf30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1cf40 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
1cf50 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1cf60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1cf70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1cf80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cf90 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
1cfa0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
1cfb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1cfc0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
1cfd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1cfe0 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74  }...*pulLastPart
1cff0 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70  Len = 0;...if (p
1d000 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  LastPart == NULL
1d010 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f  ) {...terminate_
1d020 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a  decrypt = 0;..}.
1d030 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
1d040 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63  decrypt) {...cac
1d050 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1d060 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
1d070 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
1d080 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1d090 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1d0a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d0b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d0c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d0d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d0e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1d0f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1d100 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d110 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1d120 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1d130 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d140 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1d150 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1d160 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1d170 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1d180 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
1d190 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  stInit)(CK_SESSI
1d1a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1d1b0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
1d1c0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29  _PTR pMechanism)
1d1d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1d1e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1d1f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1d200 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1d210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d220 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1d230 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1d240 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d250 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1d260 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1d270 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d280 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1d290 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1d2a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1d2b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1d2c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1d2d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1d2e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1d2f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1d300 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1d310 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f  V, C_Digest)(CK_
1d320 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1d330 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
1d340 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
1d350 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
1d360 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
1d370 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
1d380 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
1d390 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1d3a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d3b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1d3c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d3d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d3e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d3f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d400 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d410 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d420 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d440 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d450 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1d460 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
1d470 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
1d480 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
1d490 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
1d4a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1d4b0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
1d4c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1d4d0 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  , C_DigestUpdate
1d4e0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1d4f0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1d500 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
1d510 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
1d520 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
1d530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d540 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
1d550 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1d560 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1d570 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d580 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1d590 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1d5a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1d5b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1d5c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1d5d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d5e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1d5f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1d600 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1d610 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1d620 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1d630 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1d640 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1d650 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1d660 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b  CK_RV, C_DigestK
1d670 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
1d680 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
1d690 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
1d6a0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
1d6b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d6c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1d6d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1d6e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1d6f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d700 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1d710 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1d720 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1d730 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1d740 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1d750 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1d760 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1d770 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1d780 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1d790 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1d7a0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1d7b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1d7c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1d7d0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1d7e0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
1d7f0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
1d800 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1d810 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
1d820 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
1d830 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
1d840 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1d850 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1d860 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1d870 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1d880 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d890 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d8a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1d8b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d8c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1d8d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1d8e0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1d8f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1d900 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1d910 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1d920 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1d930 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1d940 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1d950 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1d960 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1d970 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1d980 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74  K_RV, C_SignInit
1d990 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1d9a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1d9b0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
1d9c0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
1d9d0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
1d9e0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1d9f0 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
1da00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1da10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1da20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1da30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1da40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1da50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1da60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1da70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1da80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1da90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1daa0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
1dab0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1dac0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dad0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
1dae0 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
1daf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1db00 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1db10 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
1db20 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
1db30 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20 26 26 20  CKM_RSA_PKCS && 
1db40 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
1db50 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 53 48 41  anism != CKM_SHA
1db60 31 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  1_RSA_PKCS) {...
1db70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1db80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
1db90 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
1dba0 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
1dbb0 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 20  as CKM_RSA_PKCS 
1dbc0 6f 72 20 43 4b 4d 5f 53 48 41 31 5f 52 53 41 5f  or CKM_SHA1_RSA_
1dbd0 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72  PKCS");....retur
1dbe0 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f  n(CKR_MECHANISM_
1dbf0 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a  PARAM_INVALID);.
1dc00 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
1dc10 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
1dc20 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
1dc30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1dc40 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1dc50 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
1dc60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dc70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
1dc80 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
1dc90 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
1dca0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
1dcb0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
1dcc0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1dcd0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1dce0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1dcf0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1dd00 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1dd10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dd20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dd30 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1dd40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1dd50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1dd60 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1dd70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1dd80 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
1dd90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1dda0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ddb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
1ddc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ddd0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
1dde0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
1ddf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
1de00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
1de10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1de20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1de30 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
1de40 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
1de50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1de60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1de70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1de80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1de90 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20  Sign already in 
1dea0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
1deb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
1dec0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
1ded0 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
1dee0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
1def0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
1df00 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
1df10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1df20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1df30 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1df40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1df50 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
1df60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
1df70 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
1df80 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
1df90 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
1dfa0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1dfb0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
1dfc0 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
1dfd0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1dfe0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
1dff0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
1e000 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
1e010 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
1e020 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e030 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
1e040 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
1e050 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1e060 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
1e070 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
1e080 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09  m->mechanism;...
1e090 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1e0a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1e0b0 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61  uflen = 128;..ca
1e0c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e0d0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
1e0e0 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65  used = 0;..cacke
1e0f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1e100 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
1e110 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
1e120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1e130 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1e140 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73  f) * cackey_sess
1e150 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
1e160 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 63 61  ign_buflen);..ca
1e170 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
1e180 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
1e190 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
1e1a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1e1b0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
1e1c0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
1e1d0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e1e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e1f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e200 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e210 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e230 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1e240 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e250 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e260 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1e270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e280 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e290 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1e2a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e2b0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1e2c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e2d0 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
1e2e0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
1e2f0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
1e300 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
1e310 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
1e320 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
1e330 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
1e340 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1e350 29 20 7b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f  ) {..CK_RV sign_
1e360 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
1e370 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1e380 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1e390 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e3a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e3b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e3c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e3d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e3e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e3f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e400 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1e410 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
1e420 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
1e430 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
1e440 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
1e450 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1e460 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e470 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
1e480 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
1e490 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
1e4a0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1e4b0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
1e4c0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
1e4d0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
1e4e0 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
1e4f0 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
1e500 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
1e510 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
1e520 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
1e530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
1e550 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
1e560 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
1e570 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
1e580 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
1e590 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69  t);....return(si
1e5a0 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41  gn_ret);..}...CA
1e5b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e5c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e5d0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1e5e0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1e5f0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1e600 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1e610 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29  V, C_SignUpdate)
1e620 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1e630 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1e640 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
1e650 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
1e660 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
1e670 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
1e680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e690 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1e6a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1e6b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1e6c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e6d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1e6e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1e6f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1e700 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1e710 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
1e720 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
1e730 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
1e740 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e750 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e760 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1e770 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e780 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e790 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
1e7a0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
1e7b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
1e7c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
1e7d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  ID);..}...if (pP
1e7e0 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
1e7f0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  lPartLen == 0) {
1e800 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
1e810 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
1e820 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68  ked to sign noth
1e830 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b  ing... */...CACK
1e840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e850 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e860 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69  K (%i) (short ci
1e870 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29  rcuit)", CKR_OK)
1e880 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e890 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50  OK);..}...if (pP
1e8a0 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
1e8b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e8c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61  INTF("Error. pPa
1e8d0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
1e8e0 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  ulPartLen is not
1e8f0 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
1e900 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1e910 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
1e920 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
1e930 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e940 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
1e950 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
1e960 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
1e970 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1e980 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1e990 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
1e9a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e9b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e9c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e9d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e9e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e9f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ea00 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1ea10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ea20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ea30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1ea40 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
1ea50 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
1ea60 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1ea70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ea80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1ea90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eaa0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
1eab0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
1eac0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ead0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1eae0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1eaf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
1eb00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1eb10 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
1eb20 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1eb30 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1eb40 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
1eb50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eb60 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
1eb70 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
1eb80 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
1eb90 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
1eba0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ZED);..}...switc
1ebb0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
1ebc0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
1ebd0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
1ebe0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
1ebf0 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75  CS:..../* Accumu
1ec00 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f  late directly */
1ec10 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ....if ((cackey_
1ec20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1ec30 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
1ec40 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63  + ulPartLen) > c
1ec50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
1ec60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
1ec70 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b  flen) {.....cack
1ec80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ec90 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1eca0 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63  n *= 2;......cac
1ecb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1ecc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
1ecd0 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79  = realloc(cackey
1ece0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
1ecf0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69  on].sign_buf, si
1ed00 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
1ed10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
1ed20 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
1ed30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1ed40 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
1ed50 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  n);....}.....mem
1ed60 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
1ed70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1ed80 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
1ed90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1eda0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
1edb0 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
1edc0 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
1edd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
1ede0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
1edf0 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
1ee00 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
1ee10 4b 4d 5f 53 48 41 31 5f 52 53 41 5f 50 4b 43 53  KM_SHA1_RSA_PKCS
1ee20 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
1ee30 74 65 20 69 6e 74 6f 20 61 20 53 48 41 31 20 68  te into a SHA1 h
1ee40 61 73 68 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ash */....cackey
1ee50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1ee60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1ee70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ee90 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1eea0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1eeb0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1eec0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1eed0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1eee0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1eef0 50 4f 52 54 45 44 29 3b 0a 09 09 09 62 72 65 61  PORTED);....brea
1ef00 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
1ef10 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ef20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ef30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ef40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1ef50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ef60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ef70 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1ef80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ef90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1efa0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
1efb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1efc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1efd0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1efe0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1eff0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f000 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f010 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
1f020 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1f030 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
1f040 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
1f050 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
1f060 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
1f070 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
1f080 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
1f090 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
1f0a0 6c 65 6e 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  len;..CK_RV retv
1f0b0 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
1f0c0 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72  _ERROR;..int ter
1f0d0 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
1f0e0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1f0f0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1f100 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f110 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f120 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f130 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f140 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f150 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f160 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f170 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f180 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f190 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61  }...if (pulSigna
1f1a0 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  tureLen == NULL)
1f1b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f1c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f1d0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
1f1e0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1f1f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1f200 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1f210 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1f220 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1f230 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f240 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1f250 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f260 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1f270 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f280 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1f290 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1f2a0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1f2b0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1f2c0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1f2d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1f2e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1f2f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f300 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f310 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f320 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f330 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1f340 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1f350 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f360 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f370 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1f380 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f390 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1f3a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f3b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f3c0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1f3d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f3e0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
1f3f0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
1f400 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
1f410 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
1f420 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1f430 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
1f440 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
1f450 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
1f460 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f470 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
1f480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f490 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
1f4a0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
1f4b0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1f4c0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
1f4d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f4e0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
1f4f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
1f500 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
1f510 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
1f520 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
1f530 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
1f540 20 2a 2f 0a 09 09 09 73 69 67 62 75 66 6c 65 6e   */....sigbuflen
1f550 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
1f560 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
1f570 6f 74 73 5b 63 61 63 6b 65 79 5f 73 65 73 73 69  ots[cackey_sessi
1f580 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
1f590 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65  otID], cackey_se
1f5a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f5b0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
1f5c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f5d0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
1f5e0 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uf, cackey_sessi
1f5f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
1f600 67 6e 5f 62 75 66 6c 65 6e 2c 20 73 69 67 62 75  gn_buflen, sigbu
1f610 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66  f, sizeof(sigbuf
1f620 29 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  ));.....if (sigb
1f630 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
1f640 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
1f650 65 64 2e 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  ed. */.....retva
1f660 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
1f670 45 52 52 4f 52 3b 0a 09 09 09 7d 20 65 6c 73 65  ERROR;....} else
1f680 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
1f690 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
1f6a0 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
1f6b0 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
1f6c0 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
1f6d0 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
1f6e0 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
1f6f0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
1f700 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72  _SMALL;......ter
1f710 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
1f720 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1f730 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
1f740 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53  = 0;......if (pS
1f750 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09  ignature) {.....
1f760 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75  .memcpy(pSignatu
1f770 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62  re, sigbuf, sigb
1f780 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65  uflen);.......te
1f790 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
1f7a0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
1f7b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20  lSignatureLen = 
1f7c0 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09  sigbuflen;......
1f7d0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b  retval = CKR_OK;
1f7e0 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b  ....}.....break;
1f7f0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 53 48 41 31  ...case CKM_SHA1
1f800 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
1f810 20 41 63 63 75 6d 75 6c 61 74 65 20 69 6e 74 6f   Accumulate into
1f820 20 61 20 53 48 41 31 20 68 61 73 68 20 2a 2f 0a   a SHA1 hash */.
1f830 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f840 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f850 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
1f860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f870 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1f880 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1f890 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1f8a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f8b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 09 09 72 65  PPORTED);.....re
1f8c0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
1f8d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1f8e0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
1f8f0 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73  .if (terminate_s
1f900 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63  ign) {...if (cac
1f910 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
1f920 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
1f930 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
1f940 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
1f950 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a  ion].sign_buf);.
1f960 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65  ..}....cackey_se
1f970 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1f980 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
1f990 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1f9a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1f9b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f9c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1f9d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1f9e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1f9f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fa00 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1fa10 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1fa20 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1fa30 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
1fa40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fa50 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
1fa60 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a  (int) retval);..
1fa70 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1fa80 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1fa90 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1faa0 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29  SignRecoverInit)
1fab0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
1fac0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
1fad0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
1fae0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
1faf0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
1fb00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1fb10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1fb20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1fb30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1fb40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fb50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fb60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1fb70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fb80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1fb90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1fba0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fbb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1fbc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1fbd0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1fbe0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1fbf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1fc00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1fc10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1fc20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1fc30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1fc40 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  V, C_SignRecover
1fc50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
1fc60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
1fc70 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
1fc80 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
1fc90 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
1fca0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
1fcb0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
1fcc0 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
1fcd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fce0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fcf0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1fd00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1fd10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fd20 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1fd30 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1fd40 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1fd50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1fd60 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1fd70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fd80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1fd90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1fda0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1fdb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1fdc0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1fdd0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1fde0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1fdf0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1fe00 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
1fe10 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45  erifyInit)(CK_SE
1fe20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1fe30 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
1fe40 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
1fe50 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
1fe60 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
1fe70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fe80 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fe90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1fea0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1feb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fec0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1fed0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1fee0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1fef0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ff00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1ff10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ff20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1ff30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ff40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1ff50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ff60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1ff70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1ff80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ff90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1ffa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
1ffb0 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f  erify)(CK_SESSIO
1ffc0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
1ffd0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
1ffe0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
1fff0 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
20000 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
20010 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
20020 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41  natureLen) {..CA
20030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20040 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20050 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20060 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20080 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20090 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
200a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
200b0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
200c0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
200d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
200e0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
200f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20100 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20110 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20120 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20130 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20140 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20150 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
20160 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
20170 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
20180 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
20190 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
201a0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
201b0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
201c0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
201d0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
201e0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
201f0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20210 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20220 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20240 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20250 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20270 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20280 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20290 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
202a0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
202b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
202c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
202d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
202e0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
202f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20300 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29  , C_VerifyFinal)
20310 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
20320 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
20330 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
20340 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
20350 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
20360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20370 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20380 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20390 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
203a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
203b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
203c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
203d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
203e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
203f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20400 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20410 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20420 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20430 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20440 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20450 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20460 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20470 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20480 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20490 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
204a0 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
204b0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
204c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
204d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
204e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
204f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
20500 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
20510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20520 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20530 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20540 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20560 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20570 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20580 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20590 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
205a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
205b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
205c0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
205d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
205e0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
205f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20600 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20610 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20620 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
20630 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20640 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
20650 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
20660 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
20670 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
20680 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
20690 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
206a0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
206b0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
206c0 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29  _PTR pulDataLen)
206d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
206e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
206f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20700 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20710 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20720 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20730 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20740 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20750 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20760 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20770 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20780 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20790 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
207a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
207b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
207c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
207d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
207e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
207f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
20800 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20810 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79  V, C_DigestEncry
20820 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
20830 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
20840 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
20850 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
20860 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
20870 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
20880 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
20890 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
208a0 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
208b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
208c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
208d0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
208e0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
208f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20900 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20910 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20920 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20930 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20940 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20950 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20960 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20970 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20980 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20990 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
209a0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
209b0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
209c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
209d0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
209e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
209f0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
20a00 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
20a10 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20a20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
20a30 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
20a40 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
20a50 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
20a60 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
20a70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
20a80 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
20a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20aa0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20ab0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20ac0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20ae0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20af0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20b00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20b10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20b20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20b30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20b40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
20b50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
20b60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
20b70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20b80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20b90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20ba0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
20bb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20bc0 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63  CK_RV, C_SignEnc
20bd0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
20be0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
20bf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
20c00 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
20c10 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
20c20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
20c30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
20c40 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
20c50 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
20c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20c70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20c80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20c90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20cb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20cc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20cd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20ce0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20cf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
20d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20d10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20d20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20d30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
20d40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20d50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
20d60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
20d70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
20d80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
20d90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
20da0 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
20db0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
20dc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
20dd0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
20de0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
20df0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
20e00 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
20e10 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
20e20 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
20e30 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
20e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20e50 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20e60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20e70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20e80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20e90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20ea0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20eb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20ec0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20ed0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20ef0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
20f00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20f10 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
20f20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20f30 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
20f40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20f50 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
20f60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20f70 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
20f80 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  ateKey)(CK_SESSI
20f90 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
20fa0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
20fb0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
20fc0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
20fd0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
20fe0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
20ff0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
21000 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
21010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21020 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21030 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21040 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21060 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21070 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21080 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21090 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
210a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
210b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
210c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
210d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
210e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
210f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21100 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21110 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21120 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21130 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21140 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
21150 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28  enerateKeyPair)(
21160 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21170 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
21180 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
21190 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
211a0 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69  IBUTE_PTR pPubli
211b0 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  cKeyTemplate, CK
211c0 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b  _ULONG ulPublicK
211d0 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  eyAttributeCount
211e0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
211f0 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65  TR pPrivateKeyTe
21200 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
21210 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74   ulPrivateKeyAtt
21220 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
21230 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
21240 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43  R phPublicKey, C
21250 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
21260 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79  PTR phPrivateKey
21270 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
21280 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
21290 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
212a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
212b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
212c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
212d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
212e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
212f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
21300 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21310 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21320 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
21330 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
21340 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
21350 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
21360 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
21370 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
21380 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21390 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
213a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
213b0 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43  RV, C_WrapKey)(C
213c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
213d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
213e0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
213f0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
21400 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69  T_HANDLE hWrappi
21410 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  ngKey, CK_OBJECT
21420 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b  _HANDLE hKey, CK
21430 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
21440 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  edKey, CK_ULONG_
21450 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65  PTR pulWrappedKe
21460 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  yLen) {..CACKEY_
21470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
21480 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
21490 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
214a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
214b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
214c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
214d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
214e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
214f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
21500 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
21510 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21520 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
21530 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21540 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
21550 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21560 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
21570 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21580 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
21590 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
215a0 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70  (CK_RV, C_Unwrap
215b0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
215c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
215d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
215e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
215f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
21600 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43  UnwrappingKey, C
21610 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
21620 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
21630 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e   ulWrappedKeyLen
21640 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
21650 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
21660 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75  _ULONG ulAttribu
21670 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  teCount, CK_OBJE
21680 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
21690 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
216a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
216b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
216c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
216d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
216e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
216f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21700 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21710 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21720 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21730 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21740 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21750 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21760 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21770 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21780 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21790 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
217a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
217b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
217c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
217d0 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b  CK_RV, C_DeriveK
217e0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
217f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
21800 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
21810 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
21820 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42  OBJECT_HANDLE hB
21830 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49  aseKey, CK_ATTRI
21840 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
21850 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
21860 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
21870 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
21880 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
21890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
218a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
218b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
218c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
218d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
218e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
218f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21900 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21910 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21920 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21930 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21940 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21950 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21960 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21970 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21980 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21990 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
219a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
219b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
219c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
219d0 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  eedRandom)(CK_SE
219e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
219f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
21a00 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f  TR pSeed, CK_ULO
21a10 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a  NG ulSeedLen) {.
21a20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21a30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21a40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21a50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21a60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21a70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21a80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21a90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21aa0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21ab0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
21ac0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21ad0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21ae0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21af0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
21b00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21b10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
21b20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
21b30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21b40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21b50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21b60 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
21b70 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
21b80 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
21b90 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f  _BYTE_PTR pRando
21ba0 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  mData, CK_ULONG 
21bb0 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09  ulRandomLen) {..
21bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21bd0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21be0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21bf0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21c00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21c10 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21c20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21c30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21c40 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21c50 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
21c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21c70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21c80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21c90 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
21ca0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21cb0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
21cc0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
21cd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21ce0 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74  ;.}../* Deprecat
21cf0 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43  ed Function */.C
21d00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21d10 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
21d20 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b  nctionStatus)(CK
21d30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21d40 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
21d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21d60 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
21d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21d80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21d90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
21da0 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
21db0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21dc0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
21dd0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
21de0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
21df0 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
21e00 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
21e10 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
21e20 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
21e30 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
21e40 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
21e50 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
21e60 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  RV, C_CancelFunc
21e70 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tion)(CK_SESSION
21e80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21e90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
21ea0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
21eb0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
21ec0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21ed0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
21ee0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
21ef0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21f00 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
21f10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21f20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
21f30 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
21f40 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
21f50 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
21f60 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
21f70 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  g */.}..CK_DEFIN
21f80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
21f90 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  , C_GetFunctionL
21fa0 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e  ist)(CK_FUNCTION
21fb0 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70  _LIST_PTR_PTR pp
21fc0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a  FunctionList) {.
21fd0 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53  .CK_FUNCTION_LIS
21fe0 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c  T_PTR pFunctionL
21ff0 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
22000 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22010 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46  ed.");...if (ppF
22020 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e  unctionList == N
22030 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
22040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22050 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c  ror. ppFunctionL
22060 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ist is NULL.");.
22070 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
22080 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
22090 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
220a0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
220b0 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29  (*pFunctionList)
220c0 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  );...pFunctionLi
220d0 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f  st->version.majo
220e0 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
220f0 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
22100 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  DE) >> 16) & 0xf
22110 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f;..pFunctionLis
22120 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  t->version.minor
22130 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
22140 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
22150 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  E) >> 8) & 0xff;
22160 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
22170 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d  ->C_Initialize =
22180 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09   C_Initialize;..
22190 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
221a0 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69  _Finalize = C_Fi
221b0 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  nalize;..pFuncti
221c0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66  onList->C_GetInf
221d0 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09  o = C_GetInfo;..
221e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
221f0 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43  _GetSlotList = C
22200 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70  _GetSlotList;..p
22210 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22220 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f  GetSlotInfo = C_
22230 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46  GetSlotInfo;..pF
22240 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
22250 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f  etTokenInfo = C_
22260 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70  GetTokenInfo;..p
22270 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22280 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
22290 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74   = C_WaitForSlot
222a0 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f  Event;..pFunctio
222b0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
222c0 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65  anismList = C_Ge
222d0 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a  tMechanismList;.
222e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
222f0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
22300 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  fo = C_GetMechan
22310 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ismInfo;..pFunct
22320 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54  ionList->C_InitT
22330 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b  oken = C_InitTok
22340 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  en;..pFunctionLi
22350 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20  st->C_InitPIN = 
22360 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e  C_InitPIN;..pFun
22370 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
22380 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a  PIN = C_SetPIN;.
22390 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
223a0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20  C_OpenSession = 
223b0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09  C_OpenSession;..
223c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
223d0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20  _CloseSession = 
223e0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a  C_CloseSession;.
223f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
22400 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
22410 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53  ns = C_CloseAllS
22420 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74  essions;..pFunct
22430 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65  ionList->C_GetSe
22440 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  ssionInfo = C_Ge
22450 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70  tSessionInfo;..p
22460 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22470 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
22480 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69  e = C_GetOperati
22490 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74  onState;..pFunct
224a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70  ionList->C_SetOp
224b0 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
224c0 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
224d0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
224e0 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f  st->C_Login = C_
224f0 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  Login;..pFunctio
22500 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20  nList->C_Logout 
22510 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75  = C_Logout;..pFu
22520 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72  nctionList->C_Cr
22530 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43  eateObject = C_C
22540 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46  reateObject;..pF
22550 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
22560 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f  opyObject = C_Co
22570 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63  pyObject;..pFunc
22580 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74  tionList->C_Dest
22590 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65  royObject = C_De
225a0 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46  stroyObject;..pF
225b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
225c0 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43  etObjectSize = C
225d0 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a  _GetObjectSize;.
225e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
225f0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
22600 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69  lue = C_GetAttri
22610 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e  buteValue;..pFun
22620 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74  ctionList->C_Set
22630 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
22640 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
22650 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
22660 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
22670 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64  ctsInit = C_Find
22680 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46  ObjectsInit;..pF
22690 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
226a0 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46  indObjects = C_F
226b0 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75  indObjects;..pFu
226c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
226d0 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d  ndObjectsFinal =
226e0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
226f0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
22700 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e  ist->C_EncryptIn
22710 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e  it = C_EncryptIn
22720 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
22730 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20  st->C_Encrypt = 
22740 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e  C_Encrypt;..pFun
22750 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
22760 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45  ryptUpdate = C_E
22770 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
22780 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22790 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43  EncryptFinal = C
227a0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09  _EncryptFinal;..
227b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
227c0 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43  _DecryptInit = C
227d0 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70  _DecryptInit;..p
227e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
227f0 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72  Decrypt = C_Decr
22800 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ypt;..pFunctionL
22810 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70  ist->C_DecryptUp
22820 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
22830 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
22840 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
22850 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79  tFinal = C_Decry
22860 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  ptFinal;..pFunct
22870 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
22880 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74  tInit = C_Digest
22890 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
228a0 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d  List->C_Digest =
228b0 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e   C_Digest;..pFun
228c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
228d0 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69  estUpdate = C_Di
228e0 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
228f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
22900 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65  gestKey = C_Dige
22910 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  stKey;..pFunctio
22920 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46  nList->C_DigestF
22930 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46  inal = C_DigestF
22940 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
22950 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74  List->C_SignInit
22960 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09   = C_SignInit;..
22970 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22980 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a  _Sign = C_Sign;.
22990 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
229a0 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43  C_SignUpdate = C
229b0 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46  _SignUpdate;..pF
229c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
229d0 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67  ignFinal = C_Sig
229e0 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  nFinal;..pFuncti
229f0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
22a00 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69  coverInit = C_Si
22a10 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  gnRecoverInit;..
22a20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
22a30 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43  _SignRecover = C
22a40 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70  _SignRecover;..p
22a50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22a60 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56  VerifyInit = C_V
22a70 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e  erifyInit;..pFun
22a80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
22a90 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a  ify = C_Verify;.
22aa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
22ab0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d  C_VerifyUpdate =
22ac0 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b   C_VerifyUpdate;
22ad0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
22ae0 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d  >C_VerifyFinal =
22af0 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a   C_VerifyFinal;.
22b00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
22b10 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49  C_VerifyRecoverI
22b20 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65  nit = C_VerifyRe
22b30 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e  coverInit;..pFun
22b40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
22b50 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56  ifyRecover = C_V
22b60 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70  erifyRecover;..p
22b70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22b80 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
22b90 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e  ate = C_DigestEn
22ba0 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
22bb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
22bc0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
22bd0 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69  te = C_DecryptDi
22be0 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75  gestUpdate;..pFu
22bf0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
22c00 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20  gnEncryptUpdate 
22c10 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  = C_SignEncryptU
22c20 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
22c30 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
22c40 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
22c50 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
22c60 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
22c70 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
22c80 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65  Key = C_Generate
22c90 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
22ca0 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
22cb0 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72  eyPair = C_Gener
22cc0 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75  ateKeyPair;..pFu
22cd0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72  nctionList->C_Wr
22ce0 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65  apKey = C_WrapKe
22cf0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
22d00 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d  t->C_UnwrapKey =
22d10 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70   C_UnwrapKey;..p
22d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
22d30 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65  DeriveKey = C_De
22d40 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  riveKey;..pFunct
22d50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52  ionList->C_SeedR
22d60 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61  andom = C_SeedRa
22d70 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
22d80 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
22d90 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72  Random = C_Gener
22da0 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e  ateRandom;..pFun
22db0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
22dc0 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d  FunctionStatus =
22dd0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
22de0 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  atus;..pFunction
22df0 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75  List->C_CancelFu
22e00 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65  nction = C_Cance
22e10 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e  lFunction;..pFun
22e20 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
22e30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43  FunctionList = C
22e40 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
22e50 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c  ;...*ppFunctionL
22e60 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c  ist = pFunctionL
22e70 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ist;...CACKEY_DE
22e80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22e90 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
22ea0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
22eb0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
22ec0 0a 0a                                            ..