Hex Artifact Content

Artifact e8309dfff80dd2bc189d4aafd137454a5e255020:


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 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.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 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 48  #endif.#define H
0270: 41 56 45 5f 45 52 52 4e 4f 5f 48 20 31 0a 23 69  AVE_ERRNO_H 1.#i
0280: 66 64 65 66 20 48 41 56 45 5f 45 52 52 4e 4f 5f  fdef HAVE_ERRNO_
0290: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 65 72  H.#  include <er
02a0: 72 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  rno.h>.#endif.#i
02b0: 66 64 65 66 20 48 41 56 45 5f 5a 4c 49 42 5f 48  fdef HAVE_ZLIB_H
02c0: 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f 4c  .#  ifdef HAVE_L
02d0: 49 42 5a 0a 23 20 20 20 20 69 6e 63 6c 75 64 65  IBZ.#    include
02e0: 20 3c 7a 6c 69 62 2e 68 3e 0a 23 20 20 65 6e 64   <zlib.h>.#  end
02f0: 69 66 0a 23 65 6c 73 65 0a 23 20 20 69 66 64 65  if.#else.#  ifde
0300: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 20  f HAVE_LIBZ.#   
0310: 20 75 6e 64 65 66 20 48 41 56 45 5f 4c 49 42 5a   undef HAVE_LIBZ
0320: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
0330: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
0340: 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
0350: 44 54 45 53 54 0a 23 20 20 69 6e 63 6c 75 64 65  DTEST.#  include
0360: 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 65   <sys/time.h>.#e
0370: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 43 4b  ndif..#define CK
0380: 5f 50 54 52 20 2a 0a 23 64 65 66 69 6e 65 20 43  _PTR *.#define C
0390: 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
03a0: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
03b0: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e  me) returnType n
03c0: 61 6d 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44  ame.#define CK_D
03d0: 45 43 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 28  ECLARE_FUNCTION(
03e0: 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65  returnType, name
03f0: 29 20 72 65 74 75 72 6e 54 79 70 65 20 6e 61 6d  ) returnType nam
0400: 65 0a 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 43  e.#define CK_DEC
0410: 4c 41 52 45 5f 46 55 4e 43 54 49 4f 4e 5f 50 4f  LARE_FUNCTION_PO
0420: 49 4e 54 45 52 28 72 65 74 75 72 6e 54 79 70 65  INTER(returnType
0430: 2c 20 6e 61 6d 65 29 20 72 65 74 75 72 6e 54 79  , name) returnTy
0440: 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23 64 65 66  pe (* name).#def
0450: 69 6e 65 20 43 4b 5f 43 41 4c 4c 42 41 43 4b 5f  ine CK_CALLBACK_
0460: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
0470: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
0480: 6e 54 79 70 65 20 28 2a 20 6e 61 6d 65 29 0a 23  nType (* name).#
0490: 69 66 6e 64 65 66 20 4e 55 4c 4c 5f 50 54 52 0a  ifndef NULL_PTR.
04a0: 23 20 20 64 65 66 69 6e 65 20 4e 55 4c 4c 5f 50  #  define NULL_P
04b0: 54 52 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 6e  TR 0.#endif..#in
04c0: 63 6c 75 64 65 20 22 70 6b 63 73 31 31 2e 68 22  clude "pkcs11.h"
04d0: 0a 23 69 6e 63 6c 75 64 65 20 22 70 6b 63 73 31  .#include "pkcs1
04e0: 31 6e 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  1n.h".#include "
04f0: 61 73 6e 31 2d 78 35 30 39 2e 68 22 0a 23 69 6e  asn1-x509.h".#in
0500: 63 6c 75 64 65 20 22 73 68 61 2e 68 22 0a 23 69  clude "sha.h".#i
0510: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a 0a  nclude "md5.h"..
0520: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
0530: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
0540: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
0550: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
0560: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0570: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0580: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0590: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
05a0: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
05b0: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
05c0: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
05d0: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
05e0: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
05f0: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0600: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
0610: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
0620: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
0630: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
0640: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0650: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
0660: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0670: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0680: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0690: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
06a0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
06b0: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
06c0: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
06d0: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
06e0: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
06f0: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0700: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
0710: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
0720: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
0730: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
0740: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
0750: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
0760: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0770: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0780: 54 52 5f 43 48 41 4e 47 45 5f 52 45 46 45 52 45  TR_CHANGE_REFERE
0790: 4e 43 45 20 20 30 78 32 34 0a 23 64 65 66 69 6e  NCE  0x24.#defin
07a0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49  e GSCIS_INSTR_SI
07b0: 47 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  GN              
07c0: 30 78 32 41 0a 23 64 65 66 69 6e 65 20 47 53 43  0x2A.#define GSC
07d0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 50 52 4f  IS_INSTR_GET_PRO
07e0: 50 20 20 20 20 20 20 20 20 20 20 30 78 35 36 0a  P          0x56.
07f0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0800: 53 54 52 5f 47 45 54 5f 41 43 52 20 20 20 20 20  STR_GET_ACR     
0810: 20 20 20 20 20 20 30 78 34 43 0a 23 64 65 66 69        0x4C.#defi
0820: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  ne GSCIS_INSTR_R
0830: 45 41 44 5f 42 55 46 46 45 52 20 20 20 20 20 20  EAD_BUFFER      
0840: 20 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53   0x52.#define GS
0850: 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
0860: 43 52 59 50 54 20 20 20 20 20 20 20 30 78 34 32  CRYPT       0x42
0870: 0a 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  ..#define GSCIS_
0880: 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50  PARAM_SELECT_APP
0890: 4c 45 54 20 20 20 20 20 30 78 30 34 0a 0a 2f 2a  LET     0x04../*
08a0: 2a 20 54 61 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20  * Tags **/./*** 
08b0: 43 43 43 20 54 61 67 73 20 2a 2a 2a 2f 0a 23 64  CCC Tags ***/.#d
08c0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
08d0: 43 41 52 44 49 44 20 20 20 20 20 20 20 20 20 20  CARDID          
08e0: 20 20 20 20 30 78 46 30 0a 23 64 65 66 69 6e 65      0xF0.#define
08f0: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56   GSCIS_TAG_CCC_V
0900: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
0910: 78 46 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF1.#define GSCI
0920: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 20 20 20  S_TAG_CCG_VER   
0930: 20 20 20 20 20 20 20 20 20 20 30 78 46 32 0a 23            0xF2.#
0940: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0950: 5f 43 41 52 44 55 52 4c 20 20 20 20 20 20 20 20  _CARDURL        
0960: 20 20 20 20 20 30 78 46 33 0a 23 64 65 66 69 6e       0xF3.#defin
0970: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
0980: 31 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20  15              
0990: 30 78 46 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF4.#define GSC
09a0: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
09b0: 4d 4f 44 45 4c 20 20 20 20 20 20 30 78 46 35 0a  MODEL      0xF5.
09c0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
09d0: 47 5f 41 43 52 5f 54 41 42 4c 45 20 20 20 20 20  G_ACR_TABLE     
09e0: 20 20 20 20 20 20 30 78 46 36 0a 23 64 65 66 69        0xF6.#defi
09f0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
0a00: 44 5f 41 50 44 55 20 20 20 20 20 20 20 20 20 20  D_APDU          
0a10: 20 30 78 46 37 0a 23 64 65 66 69 6e 65 20 47 53   0xF7.#define GS
0a20: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
0a30: 49 4f 4e 20 20 20 20 20 20 20 20 20 30 78 46 41  ION         0xFA
0a40: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0a50: 41 47 5f 43 54 20 20 20 20 20 20 20 20 20 20 20  AG_CT           
0a60: 20 20 20 20 20 20 20 30 78 46 42 0a 23 64 65 66         0xFB.#def
0a70: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ine GSCIS_TAG_ST
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 30 78 46 43 0a 23 64 65 66 69 6e 65 20 47    0xFC.#define G
0aa0: 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43  SCIS_TAG_NEXTCCC
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46               0xF
0ac0: 44 0a 0a 2f 2a 2a 2a 20 47 65 6e 65 72 61 6c 20  D../*** General 
0ad0: 2d 20 45 46 20 32 32 30 30 20 2a 2a 2a 2f 0a 23  - EF 2200 ***/.#
0ae0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0af0: 5f 46 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _FNAME          
0b00: 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e       0x01.#defin
0b10: 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d  e GSCIS_TAG_MNAM
0b20: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0b30: 30 78 30 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x02.#define GSC
0b40: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 20 20 20 20  IS_TAG_LNAME    
0b50: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 33 0a             0x03.
0b60: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0b70: 47 5f 53 55 46 46 49 58 20 20 20 20 20 20 20 20  G_SUFFIX        
0b80: 20 20 20 20 20 20 30 78 30 34 0a 23 64 65 66 69        0x04.#defi
0b90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56  ne GSCIS_TAG_GOV
0ba0: 54 5f 41 47 45 4e 43 59 20 20 20 20 20 20 20 20  T_AGENCY        
0bb0: 20 30 78 30 35 0a 23 64 65 66 69 6e 65 20 47 53   0x05.#define GS
0bc0: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 20 20  CIS_TAG_BUREAU  
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 36              0x06
0be0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0bf0: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 20 20  AG_BUREAU_CODE  
0c00: 20 20 20 20 20 20 20 30 78 30 37 0a 23 64 65 66         0x07.#def
0c10: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ine GSCIS_TAG_DE
0c20: 50 54 5f 43 4f 44 45 20 20 20 20 20 20 20 20 20  PT_CODE         
0c30: 20 20 30 78 30 38 0a 23 64 65 66 69 6e 65 20 47    0x08.#define G
0c40: 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 20 20  SCIS_TAG_TITLE  
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0c60: 39 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  9.#define GSCIS_
0c70: 54 41 47 5f 42 55 49 4c 44 49 4e 47 20 20 20 20  TAG_BUILDING    
0c80: 20 20 20 20 20 20 20 20 30 78 31 30 0a 23 64 65          0x10.#de
0c90: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0ca0: 46 46 49 43 45 5f 41 44 44 52 31 20 20 20 20 20  FFICE_ADDR1     
0cb0: 20 20 20 30 78 31 31 0a 23 64 65 66 69 6e 65 20     0x11.#define 
0cc0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0cd0: 5f 41 44 44 52 32 20 20 20 20 20 20 20 20 30 78  _ADDR2        0x
0ce0: 31 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  12.#define GSCIS
0cf0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
0d00: 20 20 20 20 20 20 20 20 20 30 78 31 33 0a 23 64           0x13.#d
0d10: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d20: 4f 46 46 49 43 45 5f 53 54 41 54 45 20 20 20 20  OFFICE_STATE    
0d30: 20 20 20 20 30 78 31 34 0a 23 64 65 66 69 6e 65      0x14.#define
0d40: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0d50: 45 5f 5a 49 50 20 20 20 20 20 20 20 20 20 20 30  E_ZIP          0
0d60: 78 31 35 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x15.#define GSCI
0d70: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55  S_TAG_OFFICE_COU
0d80: 4e 54 52 59 20 20 20 20 20 20 30 78 31 36 0a 23  NTRY      0x16.#
0d90: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0da0: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 20 20 20  _OFFICE_PHONE   
0db0: 20 20 20 20 20 30 78 31 37 0a 23 64 65 66 69 6e       0x17.#defin
0dc0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0dd0: 43 45 5f 50 48 4f 4e 45 5f 45 58 54 20 20 20 20  CE_PHONE_EXT    
0de0: 30 78 31 38 0a 23 64 65 66 69 6e 65 20 47 53 43  0x18.#define GSC
0df0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41  IS_TAG_OFFICE_FA
0e00: 58 20 20 20 20 20 20 20 20 20 20 30 78 31 39 0a  X          0x19.
0e10: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0e20: 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 20 20  G_OFFICE_EMAIL  
0e30: 20 20 20 20 20 20 30 78 31 41 0a 23 64 65 66 69        0x1A.#defi
0e40: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  ne GSCIS_TAG_OFF
0e50: 49 43 45 5f 52 4f 4f 4d 20 20 20 20 20 20 20 20  ICE_ROOM        
0e60: 20 30 78 31 42 0a 23 64 65 66 69 6e 65 20 47 53   0x1B.#define GS
0e70: 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41  CIS_TAG_NONGOV_A
0e80: 47 45 4e 43 59 20 20 20 20 20 20 20 30 78 31 43  GENCY       0x1C
0e90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ea0: 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f  AG_SSN_DESIGNATO
0eb0: 52 20 20 20 20 20 20 30 78 31 44 0a 0a 2f 2a 2a  R      0x1D../**
0ec0: 2a 20 50 49 49 20 2d 20 45 46 20 32 31 30 30 20  * PII - EF 2100 
0ed0: 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43  ***/.#define GSC
0ee0: 49 53 5f 54 41 47 5f 53 53 4e 20 20 20 20 20 20  IS_TAG_SSN      
0ef0: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a             0x20.
0f00: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0f10: 47 5f 44 4f 42 20 20 20 20 20 20 20 20 20 20 20  G_DOB           
0f20: 20 20 20 20 20 20 30 78 32 31 0a 23 64 65 66 69        0x21.#defi
0f30: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e  ne GSCIS_TAG_GEN
0f40: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
0f50: 20 30 78 32 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69   0x22../*** Logi
0f60: 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  n Information - 
0f70: 45 46 20 34 30 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 4000 ***/.#de
0f80: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 55  fine GSCIS_TAG_U
0f90: 53 45 52 49 44 20 20 20 20 20 20 20 20 20 20 20  SERID           
0fa0: 20 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20     0x40.#define 
0fb0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e  GSCIS_TAG_DOMAIN
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0fd0: 34 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  41.#define GSCIS
0fe0: 5f 54 41 47 5f 50 41 53 53 57 4f 52 44 20 20 20  _TAG_PASSWORD   
0ff0: 20 20 20 20 20 20 20 20 20 30 78 34 32 0a 0a 2f           0x42../
1000: 2a 2a 2a 20 43 61 72 64 20 49 6e 66 6f 72 6d 61  *** Card Informa
1010: 74 69 6f 6e 20 2d 20 45 46 20 35 30 30 30 20 2a  tion - EF 5000 *
1020: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
1030: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 20 20  S_TAG_ISSUERID  
1040: 20 20 20 20 20 20 20 20 20 20 30 78 35 30 0a 23            0x50.#
1050: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
1060: 5f 53 45 52 4e 4f 20 20 20 20 20 20 20 20 20 20  _SERNO          
1070: 20 20 20 20 20 30 78 35 31 0a 23 64 65 66 69 6e       0x51.#defin
1080: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
1090: 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20 20  E_DATE          
10a0: 30 78 35 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x52.#define GSC
10b0: 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f 44 41  IS_TAG_EXPIRE_DA
10c0: 54 45 20 20 20 20 20 20 20 20 20 30 78 35 33 0a  TE         0x53.
10d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
10e0: 47 5f 43 41 52 44 5f 54 59 50 45 20 20 20 20 20  G_CARD_TYPE     
10f0: 20 20 20 20 20 20 30 78 35 34 0a 23 64 65 66 69        0x54.#defi
1100: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43  ne GSCIS_TAG_SEC
1110: 55 52 49 54 59 5f 43 4f 44 45 20 20 20 20 20 20  URITY_CODE      
1120: 20 30 78 35 37 0a 23 64 65 66 69 6e 65 20 47 53   0x57.#define GS
1130: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
1140: 49 44 20 20 20 20 20 20 20 20 20 20 30 78 35 38  ID          0x58
1150: 0a 0a 2f 2a 2a 2a 20 50 49 56 20 43 6f 64 65 73  ../*** PIV Codes
1160: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49   ***/.#define NI
1170: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1180: 54 52 5f 47 45 54 5f 44 41 54 41 20 30 78 43 42  TR_GET_DATA 0xCB
1190: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
11a0: 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
11b0: 4e 41 55 54 48 20 20 30 78 38 37 0a 0a 2f 2a 2a  NAUTH  0x87../**
11c0: 2a 20 50 4b 49 20 49 6e 66 6f 72 6d 61 74 69 6f  * PKI Informatio
11d0: 6e 20 2d 20 45 46 20 37 30 30 30 20 2a 2a 2a 2f  n - EF 7000 ***/
11e0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
11f0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 20 20  AG_CERTIFICATE  
1200: 20 20 20 20 20 20 20 30 78 37 30 0a 23 64 65 66         0x70.#def
1210: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
1220: 52 54 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20  RT_ISSUE_DATE   
1230: 20 20 30 78 37 31 0a 23 64 65 66 69 6e 65 20 47    0x71.#define G
1240: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58  SCIS_TAG_CERT_EX
1250: 50 49 52 45 5f 44 41 54 45 20 20 20 20 30 78 37  PIRE_DATE    0x7
1260: 32 0a 0a 2f 2a 2a 20 41 70 70 6c 65 74 20 49 44  2../** Applet ID
1270: 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53  s **/.#define GS
1280: 43 49 53 5f 41 49 44 5f 43 43 43 20 20 20 20 20  CIS_AID_CCC     
1290: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30              0xA0
12a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
12b0: 30 31 2c 20 30 78 31 36 2c 20 30 78 44 42 2c 20  01, 0x16, 0xDB, 
12c0: 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x00.#define GSC
12d0: 49 53 5f 41 49 44 5f 49 44 30 20 20 20 20 20 20  IS_AID_ID0      
12e0: 20 20 20 20 20 20 20 20 20 20 20 30 78 41 30 2c             0xA0,
12f0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1300: 30 2c 20 30 78 37 39 2c 20 30 78 30 31 2c 20 30  0, 0x79, 0x01, 0
1310: 78 30 30 0a 23 64 65 66 69 6e 65 20 4e 49 53 54  x00.#define NIST
1320: 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41  SP800_73_3_PIV_A
1330: 49 44 20 20 20 20 20 20 20 20 30 78 41 30 2c 20  ID        0xA0, 
1340: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 33  0x00, 0x00, 0x03
1350: 2c 20 30 78 30 38 2c 20 30 78 30 30 2c 20 30 78  , 0x08, 0x00, 0x
1360: 30 30 2c 20 30 78 31 30 2c 20 30 78 30 30 2c 20  00, 0x10, 0x00, 
1370: 30 78 30 31 2c 20 30 78 30 30 0a 0a 2f 2a 20 50  0x01, 0x00../* P
1380: 49 56 20 49 44 73 20 2a 2f 0a 2f 2a 2a 20 4b 65  IV IDs */./** Ke
1390: 79 20 49 64 65 6e 74 69 66 69 65 72 73 20 28 4e  y Identifiers (N
13a0: 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33 2c  IST SP 800-78-3,
13b0: 20 54 61 62 6c 65 20 36 2d 31 20 2a 2a 2f 0a 23   Table 6-1 **/.#
13c0: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
13d0: 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54  _78_3_KEY_PIVAUT
13e0: 48 20 20 20 30 78 39 41 0a 23 64 65 66 69 6e 65  H   0x9A.#define
13f0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1400: 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 20 30 78  KEY_SIGNATURE 0x
1410: 39 43 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9C.#define NISTS
1420: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45  P800_78_3_KEY_KE
1430: 59 4d 47 54 20 20 20 20 30 78 39 44 0a 23 64 65  YMGT    0x9D.#de
1440: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
1450: 38 5f 33 5f 4b 45 59 5f 43 41 52 44 41 55 54 48  8_3_KEY_CARDAUTH
1460: 20 20 30 78 39 45 0a 0a 2f 2a 2a 20 41 6c 67 6f    0x9E../** Algo
1470: 72 69 74 68 6d 20 49 64 65 6e 74 69 66 69 65 72  rithm Identifier
1480: 73 20 28 4e 49 53 54 20 53 50 20 38 30 30 2d 37  s (NIST SP 800-7
1490: 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 32 20 2a  8-3, Table 6-2 *
14a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  */.#define NISTS
14b0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
14c0: 53 41 31 30 32 34 20 20 30 78 30 36 0a 23 64 65  SA1024  0x06.#de
14d0: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
14e0: 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38  8_3_ALGO_RSA2048
14f0: 20 20 30 78 30 37 0a 0a 2f 2a 2a 20 4f 62 6a 65    0x07../** Obje
1500: 63 74 20 49 64 65 6e 74 69 66 69 65 72 73 20 28  ct Identifiers (
1510: 4e 49 53 54 20 53 50 20 38 30 30 2d 37 33 2d 33  NIST SP 800-73-3
1520: 20 50 61 72 74 20 31 2c 20 54 61 62 6c 65 20 32   Part 1, Table 2
1530: 29 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49  ) **/.#define NI
1540: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44  STSP800_73_3_OID
1550: 5f 50 49 56 41 55 54 48 20 20 20 30 78 35 46 2c  _PIVAUTH   0x5F,
1560: 20 30 78 43 31 2c 20 30 78 30 35 0a 23 64 65 66   0xC1, 0x05.#def
1570: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1580: 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55 52 45  _3_OID_SIGNATURE
1590: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
15a0: 41 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  A.#define NISTSP
15b0: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59  800_73_3_OID_KEY
15c0: 4d 47 54 20 20 20 20 30 78 35 46 2c 20 30 78 43  MGT    0x5F, 0xC
15d0: 31 2c 20 30 78 30 42 0a 23 64 65 66 69 6e 65 20  1, 0x0B.#define 
15e0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15f0: 49 44 5f 43 41 52 44 41 55 54 48 20 20 30 78 35  ID_CARDAUTH  0x5
1600: 46 2c 20 30 78 43 31 2c 20 30 78 30 31 0a 0a 2f  F, 0xC1, 0x01../
1610: 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  * Maximum size o
1620: 66 20 64 61 74 61 20 70 6f 72 74 69 6f 6e 20 6f  f data portion o
1630: 66 20 41 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44  f APDUs */./** D
1640: 6f 20 6e 6f 74 20 73 65 74 20 74 68 69 73 20 61  o not set this a
1650: 62 6f 76 65 20 32 35 30 20 2a 2a 2f 0a 23 64 65  bove 250 **/.#de
1660: 66 69 6e 65 20 43 41 43 4b 45 59 5f 41 50 44 55  fine CACKEY_APDU
1670: 5f 4d 54 55 20 20 20 20 20 20 20 20 20 20 20 20  _MTU            
1680: 20 20 20 32 35 30 0a 0a 2f 2a 20 41 54 52 20 49     250../* ATR I
1690: 66 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  f not available 
16a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 41  */.#ifndef MAX_A
16b0: 54 52 5f 53 49 5a 45 0a 23 64 65 66 69 6e 65 20  TR_SIZE.#define 
16c0: 4d 41 58 5f 41 54 52 5f 53 49 5a 45 20 31 30 32  MAX_ATR_SIZE 102
16d0: 34 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  4.#endif..#ifdef
16e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 0a 23 20   CACKEY_DEBUG.# 
16f0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
1700: 45 42 55 47 5f 4d 49 4e 28 61 2c 20 62 29 20 28  EBUG_MIN(a, b) (
1710: 28 61 29 20 3c 20 28 62 29 20 3f 20 28 61 29 20  (a) < (b) ? (a) 
1720: 3a 20 28 62 29 29 0a 23 20 20 69 66 64 65 66 20  : (b)).#  ifdef 
1730: 48 41 56 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20  HAVE_TIME_H.#   
1740: 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68   include <time.h
1750: 3e 0a 73 74 61 74 69 63 20 74 69 6d 65 5f 74 20  >.static time_t 
1760: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1770: 72 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61  rt_time = 0;.sta
1780: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
1790: 67 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  g CACKEY_DEBUG_G
17a0: 45 54 54 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09  ETTIME(void) {..
17b0: 69 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67  if (cackey_debug
17c0: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30  _start_time == 0
17d0: 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 64 65 62  ) {...cackey_deb
17e0: 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20  ug_start_time = 
17f0: 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  time(NULL);..}..
1800: 09 72 65 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c  .return(time(NUL
1810: 4c 29 20 2d 20 63 61 63 6b 65 79 5f 64 65 62 75  L) - cackey_debu
1820: 67 5f 73 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d  g_start_time);.}
1830: 0a 23 20 20 65 6c 73 65 0a 73 74 61 74 69 63 20  .#  else.static 
1840: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41  unsigned long CA
1850: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
1860: 4d 45 28 76 6f 69 64 29 20 7b 0a 09 72 65 74 75  ME(void) {..retu
1870: 72 6e 28 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69  rn(0);.}.#  endi
1880: 66 0a 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  f..#  define CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18a0: 28 78 2e 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74  (x...) { \..stat
18b0: 69 63 20 63 68 61 72 20 62 75 66 5f 75 73 65 72  ic char buf_user
18c0: 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a  [4096] = {0}; \.
18d0: 09 73 6e 70 72 69 6e 74 66 28 62 75 66 5f 75 73  .snprintf(buf_us
18e0: 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 5f 75  er, sizeof(buf_u
18f0: 73 65 72 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66  ser), x); \..buf
1900: 5f 75 73 65 72 5b 73 69 7a 65 6f 66 28 62 75 66  _user[sizeof(buf
1910: 5f 75 73 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c  _user) - 1] = '\
1920: 30 27 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63  0'; \..fprintf(c
1930: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1940: 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25  , "[%lu]: %s():%
1950: 69 3a 20 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59  i: %s\n", CACKEY
1960: 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29  _DEBUG_GETTIME()
1970: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
1980: 4e 45 5f 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b  NE__, buf_user);
1990: 20 5c 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65   \..fflush(cacke
19a0: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 5c  y_debug_fd()); \
19b0: 0a 7d 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  .}.#  define CAC
19c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
19d0: 55 46 28 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a  UF(f, x, y) { \.
19e0: 09 73 74 61 74 69 63 20 63 68 61 72 20 62 75 66  .static char buf
19f0: 5f 75 73 65 72 5b 38 31 39 32 5d 20 3d 20 7b 30  _user[8192] = {0
1a00: 7d 2c 20 2a 62 75 66 5f 75 73 65 72 5f 70 2c 20  }, *buf_user_p, 
1a10: 2a 62 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 3b  *buf_user_print;
1a20: 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   \..unsigned lon
1a30: 67 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 3b  g buf_user_size;
1a40: 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   \..unsigned cha
1a50: 72 20 2a 54 4d 50 42 55 46 3b 20 5c 0a 09 75 6e  r *TMPBUF; \..un
1a60: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
1a70: 20 5c 0a 09 69 6e 74 20 73 6e 70 72 69 6e 74 66   \..int snprintf
1a80: 5f 72 65 74 3b 20 5c 0a 09 54 4d 50 42 55 46 20  _ret; \..TMPBUF 
1a90: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1aa0: 20 2a 29 20 28 78 29 3b 20 5c 0a 09 62 75 66 5f   *) (x); \..buf_
1ab0: 75 73 65 72 5b 30 5d 20 3d 20 30 3b 20 5c 0a 09  user[0] = 0; \..
1ac0: 62 75 66 5f 75 73 65 72 5b 32 5d 20 3d 20 30 3b  buf_user[2] = 0;
1ad0: 20 5c 0a 09 62 75 66 5f 75 73 65 72 5f 70 20 3d   \..buf_user_p =
1ae0: 20 62 75 66 5f 75 73 65 72 3b 20 5c 0a 09 62 75   buf_user; \..bu
1af0: 66 5f 75 73 65 72 5f 73 69 7a 65 20 3d 20 73 69  f_user_size = si
1b00: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 3b 20  zeof(buf_user); 
1b10: 5c 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  \..for (idx = 0;
1b20: 20 69 64 78 20 3c 20 43 41 43 4b 45 59 5f 44 45   idx < CACKEY_DE
1b30: 42 55 47 5f 4d 49 4e 28 28 79 29 2c 20 73 69 7a  BUG_MIN((y), siz
1b40: 65 6f 66 28 62 75 66 5f 75 73 65 72 29 29 3b 20  eof(buf_user)); 
1b50: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1b60: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1b70: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b80: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b90: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1ba0: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1bb0: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1bc0: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1bd0: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1be0: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1bf0: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1c00: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1c10: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1c20: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1c30: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1c40: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1c50: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1c60: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1c70: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 62   1] = '\0'; \..b
1c80: 75 66 5f 75 73 65 72 5f 70 72 69 6e 74 20 3d 20  uf_user_print = 
1c90: 62 75 66 5f 75 73 65 72 20 2b 20 32 3b 20 5c 0a  buf_user + 2; \.
1ca0: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
1cb0: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
1cc0: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20  u]: %s():%i: %s 
1cd0: 20 28 25 73 2f 25 6c 75 20 3d 20 7b 25 73 7d 29   (%s/%lu = {%s})
1ce0: 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  \n", CACKEY_DEBU
1cf0: 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f 5f 66  G_GETTIME(), __f
1d00: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c  unc__, __LINE__,
1d10: 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67 6e 65   f, #x, (unsigne
1d20: 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 62 75 66  d long) (y), buf
1d30: 5f 75 73 65 72 5f 70 72 69 6e 74 29 3b 20 5c 0a  _user_print); \.
1d40: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1d50: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1d60: 23 20 20 64 65 66 69 6e 65 20 66 72 65 65 28 78  #  define free(x
1d70: 29 20 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ) { CACKEY_DEBUG
1d80: 5f 50 52 49 4e 54 46 28 22 46 52 45 45 28 25 70  _PRINTF("FREE(%p
1d90: 29 20 28 25 73 29 22 2c 20 28 76 6f 69 64 20 2a  ) (%s)", (void *
1da0: 29 20 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78  ) x, #x); free(x
1db0: 29 3b 20 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c  ); }..static FIL
1dc0: 45 20 2a 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  E *cackey_debug_
1dd0: 66 64 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74  fd(void) {..stat
1de0: 69 63 20 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55  ic FILE *fd = NU
1df0: 4c 4c 3b 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69  LL;..char *logfi
1e00: 6c 65 3b 0a 0a 09 69 66 20 28 66 64 20 21 3d 20  le;...if (fd != 
1e10: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1e20: 28 66 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  (fd);..}.../*.. 
1e30: 2a 20 4c 6f 67 20 74 6f 20 73 74 64 65 72 72 20  * Log to stderr 
1e40: 69 6e 69 74 69 61 6c 6c 79 20 73 6f 20 77 65 20  initially so we 
1e50: 63 61 6e 20 75 73 65 20 64 65 62 75 67 67 69 6e  can use debuggin
1e60: 67 20 77 69 74 68 69 6e 0a 09 20 2a 20 74 68 69  g within.. * thi
1e70: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f  s function witho
1e80: 75 74 20 67 65 74 74 69 6e 67 20 69 6e 74 6f 20  ut getting into 
1e90: 61 6e 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70  an infinite loop
1ea0: 0a 09 20 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65  .. */..fd = stde
1eb0: 72 72 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20  rr;...logfile = 
1ec0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1ed0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1ee0: 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20  .if (logfile != 
1ef0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1f00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1f10: 6f 75 6e 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  ound environment
1f20: 20 76 61 72 69 61 62 6c 65 3a 20 25 73 22 2c 20   variable: %s", 
1f30: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67  logfile);....log
1f40: 66 69 6c 65 20 3d 20 73 74 72 63 68 72 28 6c 6f  file = strchr(lo
1f50: 67 66 69 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69  gfile, '=');...i
1f60: 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55  f (logfile == NU
1f70: 4c 4c 29 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65  LL) {....logfile
1f80: 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45   = getenv("CACKE
1f90: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22  Y_DEBUG_LOGFILE"
1fa0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1fb0: 09 6c 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a  .logfile++;...}.
1fc0: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1fd0: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 0a  Y_DEBUG_LOGFILE.
1fe0: 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20  .if (logfile == 
1ff0: 4e 55 4c 4c 29 20 7b 0a 09 09 6c 6f 67 66 69 6c  NULL) {...logfil
2000: 65 20 3d 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e = CACKEY_DEBUG
2010: 5f 4c 4f 47 46 49 4c 45 3b 0a 09 7d 0a 23 65 6e  _LOGFILE;..}.#en
2020: 64 69 66 0a 0a 09 69 66 20 28 6c 6f 67 66 69 6c  dif...if (logfil
2030: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e != NULL) {...C
2040: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2050: 54 46 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66 69  TF("Found log fi
2060: 6c 65 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65  le: %s", logfile
2070: 29 3b 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65 6e  );....fd = fopen
2080: 28 6c 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b 0a  (logfile, "a");.
2090: 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20 4e  .}...if (fd == N
20a0: 55 4c 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73 74  ULL) {...fd = st
20b0: 64 65 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  derr;..}...if (f
20c0: 64 20 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a 09  d == stderr) {..
20d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20e0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20f0: 73 74 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c 73  stderr");..} els
2100: 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  e {...CACKEY_DEB
2110: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2120: 6e 69 6e 67 20 25 70 22 2c 20 28 76 6f 69 64 20  ning %p", (void 
2130: 2a 29 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65 74  *) fd);..}...ret
2140: 75 72 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61 74  urn(fd);.}..stat
2150: 69 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f  ic void *CACKEY_
2160: 44 45 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f  DEBUG_FUNC_MALLO
2170: 43 28 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63  C(size_t size, c
2180: 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c  onst char *func,
2190: 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f   int line) {..vo
21a0: 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65  id *retval;...re
21b0: 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tval = malloc(si
21c0: 7a 65 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63  ze);...fprintf(c
21d0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
21e0: 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25  , "[%lu]: %s():%
21f0: 69 3a 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  i: MALLOC() = %p
2200: 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  \n", CACKEY_DEBU
2210: 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e  G_GETTIME(), fun
2220: 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29  c, line, retval)
2230: 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ;..fflush(cackey
2240: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09  _debug_fd());...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a  C_REALLOC(void *
2290: 70 74 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65  ptr, size_t size
22a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75  , const char *fu
22b0: 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a  nc, int line) {.
22c0: 09 76 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a  .void *retval;..
22d0: 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
22e0: 63 28 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09  c(ptr, size);...
22f0: 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74  if (retval != pt
2300: 72 29 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 63  r) {...fprintf(c
2310: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
2320: 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25  , "[%lu]: %s():%
2330: 69 3a 20 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d  i: REALLOC(%p) =
2340: 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44   %p\n", CACKEY_D
2350: 45 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20  EBUG_GETTIME(), 
2360: 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72 2c  func, line, ptr,
2370: 20 72 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c 75   retval);...fflu
2380: 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  sh(cackey_debug_
2390: 66 64 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  fd());..}...if (
23a0: 72 65 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20  retval == NULL) 
23b0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23c0: 5f 50 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52  _PRINTF(" *** ER
23d0: 52 4f 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20  ROR *** realloc 
23e0: 72 65 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73  returned NULL (s
23f0: 69 7a 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  ize = %lu)", (un
2400: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
2410: 65 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  e);..}...return(
2420: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74  retval);.}..stat
2430: 69 63 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  ic char *CACKEY_
2440: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
2450: 50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74  P(const char *pt
2460: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  r, const char *f
2470: 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b  unc, int line) {
2480: 0a 09 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a  ..char *retval;.
2490: 0a 09 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75  ..retval = strdu
24a0: 70 28 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e 74  p(ptr);...fprint
24b0: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
24c0: 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28  d(), "[%lu]: %s(
24d0: 29 3a 25 69 3a 20 53 54 52 44 55 50 5f 4d 41 4c  ):%i: STRDUP_MAL
24e0: 4c 4f 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43  LOC() = %p\n", C
24f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
2500: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
2510: 65 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c  e, retval);..ffl
2520: 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ush(cackey_debug
2530: 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e  _fd());...return
2540: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
2550: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2560: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2570: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73  C_TAG_TO_STR(uns
2580: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 29 20  igned char tag) 
2590: 7b 0a 09 73 77 69 74 63 68 20 28 74 61 67 29 20  {..switch (tag) 
25a0: 7b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  {...case GSCIS_T
25b0: 41 47 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65  AG_CARDID:....re
25c0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
25d0: 43 41 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65  CARDID");...case
25e0: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56   GSCIS_TAG_CCC_V
25f0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2600: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
2610: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2620: 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09  _TAG_CCG_VER:...
2630: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2640: 41 47 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09  AG_CCG_VER");...
2650: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
2660: 41 52 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72  ARDURL:....retur
2670: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2680: 44 55 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47  DURL");...case G
2690: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a  SCIS_TAG_PKCS15:
26a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
26b0: 53 5f 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a  S_TAG_PKCS15");.
26c0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
26d0: 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a  _REG_DATA_MODEL:
26e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
26f0: 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d  S_TAG_REG_DATA_M
2700: 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47  ODEL");...case G
2710: 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42  SCIS_TAG_ACR_TAB
2720: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  LE:....return("G
2730: 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42  SCIS_TAG_ACR_TAB
2740: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  LE");...case GSC
2750: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
2760: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2770: 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55  IS_TAG_CARD_APDU
2780: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2790: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
27a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
27b0: 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49  IS_TAG_REDIRECTI
27c0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ON");...case GSC
27d0: 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65  IS_TAG_CT:....re
27e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27f0: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CT");...case GSC
2800: 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65  IS_TAG_ST:....re
2810: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2820: 53 54 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ST");...case GSC
2830: 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a  IS_TAG_NEXTCCC:.
2840: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2850: 5f 54 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a  _TAG_NEXTCCC");.
2860: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2870: 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72  _FNAME:....retur
2880: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41  n("GSCIS_TAG_FNA
2890: 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ME");...case GSC
28a0: 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09  IS_TAG_MNAME:...
28b0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
28c0: 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_MNAME");...ca
28d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41  se GSCIS_TAG_LNA
28e0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
28f0: 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29  SCIS_TAG_LNAME")
2900: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2910: 41 47 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65  AG_SUFFIX:....re
2920: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2930: 53 55 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65  SUFFIX");...case
2940: 20 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f   GSCIS_TAG_GOVT_
2950: 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72  AGENCY:....retur
2960: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56  n("GSCIS_TAG_GOV
2970: 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61  T_AGENCY");...ca
2980: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  se GSCIS_TAG_BUR
2990: 45 41 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  EAU:....return("
29a0: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
29b0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
29c0: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
29d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
29e0: 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f  IS_TAG_BUREAU_CO
29f0: 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DE");...case GSC
2a00: 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45  IS_TAG_DEPT_CODE
2a10: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a20: 49 53 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45  IS_TAG_DEPT_CODE
2a30: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a40: 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72  _TAG_TITLE:....r
2a50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a60: 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65  _TITLE");...case
2a70: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44   GSCIS_TAG_BUILD
2a80: 49 4e 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ING:....return("
2a90: 47 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49  GSCIS_TAG_BUILDI
2aa0: 4e 47 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NG");...case GSC
2ab0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44  IS_TAG_OFFICE_AD
2ac0: 44 52 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DR1:....return("
2ad0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ae0: 5f 41 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65  _ADDR1");...case
2af0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2b00: 45 5f 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75  E_ADDR2:....retu
2b10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2b20: 46 49 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09  FICE_ADDR2");...
2b30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2b40: 46 46 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72  FFICE_CITY:....r
2b50: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b60: 5f 4f 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a  _OFFICE_CITY");.
2b70: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2b80: 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09  _OFFICE_STATE:..
2b90: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ba0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2bb0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2bc0: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a  _TAG_OFFICE_ZIP:
2bd0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2be0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50  S_TAG_OFFICE_ZIP
2bf0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2c00: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e  _TAG_OFFICE_COUN
2c10: 54 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TRY:....return("
2c20: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2c30: 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61  _COUNTRY");...ca
2c40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2c50: 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65  ICE_PHONE:....re
2c60: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2c70: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a  OFFICE_PHONE");.
2c80: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2c90: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
2ca0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  T:....return("GS
2cb0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2cc0: 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61  HONE_EXT");...ca
2cd0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2ce0: 49 43 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75  ICE_FAX:....retu
2cf0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2d00: 46 49 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61  FICE_FAX");...ca
2d10: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2d20: 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65  ICE_EMAIL:....re
2d30: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2d40: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a  OFFICE_EMAIL");.
2d50: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2d60: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09  _OFFICE_ROOM:...
2d70: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d80: 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29  AG_OFFICE_ROOM")
2d90: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2da0: 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59  AG_NONGOV_AGENCY
2db0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2dc0: 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47  IS_TAG_NONGOV_AG
2dd0: 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47  ENCY");...case G
2de0: 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53  SCIS_TAG_SSN_DES
2df0: 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75  IGNATOR:....retu
2e00: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2e10: 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a  N_DESIGNATOR");.
2e20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2e30: 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  _SSN:....return(
2e40: 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29  "GSCIS_TAG_SSN")
2e50: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2e60: 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72  AG_DOB:....retur
2e70: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42  n("GSCIS_TAG_DOB
2e80: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2e90: 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09  _TAG_GENDER:....
2ea0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2eb0: 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61  G_GENDER");...ca
2ec0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45  se GSCIS_TAG_USE
2ed0: 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RID:....return("
2ee0: 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44  GSCIS_TAG_USERID
2ef0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2f00: 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09  _TAG_DOMAIN:....
2f10: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f20: 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61  G_DOMAIN");...ca
2f30: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53  se GSCIS_TAG_PAS
2f40: 53 57 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  SWORD:....return
2f50: 28 22 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53  ("GSCIS_TAG_PASS
2f60: 57 4f 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47  WORD");...case G
2f70: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49  SCIS_TAG_ISSUERI
2f80: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2f90: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44  CIS_TAG_ISSUERID
2fa0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2fb0: 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72  _TAG_SERNO:....r
2fc0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2fd0: 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65  _SERNO");...case
2fe0: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  ("GSCIS_TAG_ISSU
3010: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
3020: 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52   GSCIS_TAG_EXPIR
3030: 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  E_DATE:....retur
3040: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50  n("GSCIS_TAG_EXP
3050: 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61  IRE_DATE");...ca
3060: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
3070: 44 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  D_TYPE:....retur
3080: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
3090: 44 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65  D_TYPE");...case
30a0: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52   GSCIS_TAG_SECUR
30b0: 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74  ITY_CODE:....ret
30c0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
30d0: 45 43 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a  ECURITY_CODE");.
30e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
30f0: 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09  _CARDID_AID:....
3100: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
3110: 47 5f 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a  G_CARDID_AID");.
3120: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
3130: 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
3140: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
3150: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 22 29  AG_CERTIFICATE")
3160: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
3170: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
3180: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3190: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53  SCIS_TAG_CERT_IS
31a0: 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61  SUE_DATE");...ca
31b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
31c0: 54 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  T_EXPIRE_DATE:..
31d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
31e0: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
31f0: 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  DATE");..}...ret
3200: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3210: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3220: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3230: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
3240: 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74  _TO_STR(LONG ret
3250: 63 6f 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20  code) {..switch 
3260: 28 72 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61  (retcode) {...ca
3270: 73 65 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  se SCARD_S_SUCCE
3280: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  SS:....return("S
3290: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29  CARD_S_SUCCESS")
32a0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
32b0: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
32c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
32d0: 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61  ANCELLED");...ca
32e0: 73 65 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f  se SCARD_E_CANT_
32f0: 44 49 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75  DISPOSE:....retu
3300: 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54  rn("SCARD_E_CANT
3310: 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61  _DISPOSE");...ca
3320: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46  se SCARD_E_INSUF
3330: 46 49 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a  FICIENT_BUFFER:.
3340: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3350: 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f  _E_INSUFFICIENT_
3360: 42 55 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65  BUFFER");...case
3370: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
3380: 5f 41 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  _ATR:....return(
3390: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
33a0: 5f 41 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53  _ATR");...case S
33b0: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
33c0: 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  ANDLE:....return
33d0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  ("SCARD_E_INVALI
33e0: 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61  D_HANDLE");...ca
33f0: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
3400: 49 44 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09  ID_PARAMETER:...
3410: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3420: 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54  _INVALID_PARAMET
3430: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3440: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52  RD_E_INVALID_TAR
3450: 47 45 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  GET:....return("
3460: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3470: 54 41 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65  TARGET");...case
3480: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
3490: 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72  _VALUE:....retur
34a0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
34b0: 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61  ID_VALUE");...ca
34c0: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45  se SCARD_E_NO_ME
34d0: 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  MORY:....return(
34e0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f  "SCARD_E_NO_MEMO
34f0: 52 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RY");...case SCA
3500: 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41  RD_E_UNKNOWN_REA
3510: 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DER:....return("
3520: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3530: 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65  READER");...case
3540: 20 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54   SCARD_E_TIMEOUT
3550: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3560: 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a  RD_E_TIMEOUT");.
3570: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53  ..case SCARD_E_S
3580: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RD_E_SHARING_VIO
35b0: 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65  LATION");...case
35c0: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52   SCARD_E_NO_SMAR
35d0: 54 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  TCARD:....return
35e0: 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41  ("SCARD_E_NO_SMA
35f0: 52 54 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  RTCARD");...case
3600: 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e   SCARD_E_UNKNOWN
3610: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3620: 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57  ("SCARD_E_UNKNOW
3630: 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65  N_CARD");...case
3640: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
3650: 49 53 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75  ISMATCH:....retu
3660: 72 6e 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54  rn("SCARD_E_PROT
3670: 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09  O_MISMATCH");...
3680: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
3690: 5f 52 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72  _READY:....retur
36a0: 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  n("SCARD_E_NOT_R
36b0: 45 41 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53  EADY");...case S
36c0: 43 41 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41  CARD_E_SYSTEM_CA
36d0: 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75  NCELLED:....retu
36e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54  rn("SCARD_E_SYST
36f0: 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a  EM_CANCELLED");.
3700: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3710: 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09  OT_TRANSACTED:..
3720: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3730: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3740: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3750: 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49  _E_READER_UNAVAI
3760: 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  LABLE:....return
3770: 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  ("SCARD_E_READER
3780: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a  _UNAVAILABLE");.
3790: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
37a0: 4e 53 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a  NSUPPORTED_CARD:
37b0: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
37c0: 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_W_UNSUPPORTED_
37d0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37e0: 43 41 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53  CARD_W_UNRESPONS
37f0: 49 56 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  IVE_CARD:....ret
3800: 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52  urn("SCARD_W_UNR
3810: 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29  ESPONSIVE_CARD")
3820: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
3830: 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a  _UNPOWERED_CARD:
3840: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3850: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
3860: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3870: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a  RD_W_RESET_CARD:
3880: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3890: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29  D_W_RESET_CARD")
38a0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 57  ;...case SCARD_W
38b0: 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09  _REMOVED_CARD:..
38c0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38d0: 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29  W_REMOVED_CARD")
38e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
38f0: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a  _PCI_TOO_SMALL:.
3900: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3910: 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c  _E_PCI_TOO_SMALL
3920: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3930: 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50  _E_READER_UNSUPP
3940: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
3950: 28 22 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  ("SCARD_E_READER
3960: 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a  _UNSUPPORTED");.
3970: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44  ..case SCARD_E_D
3980: 55 50 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a  UPLICATE_READER:
3990: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
39a0: 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45  D_E_DUPLICATE_RE
39b0: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
39c0: 43 41 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55  CARD_E_CARD_UNSU
39d0: 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75  PPORTED:....retu
39e0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44  rn("SCARD_E_CARD
39f0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a  _UNSUPPORTED");.
3a00: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3a10: 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65  O_SERVICE:....re
3a20: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3a30: 5f 53 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61  _SERVICE");...ca
3a40: 73 65 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49  se SCARD_E_SERVI
3a50: 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72  CE_STOPPED:....r
3a60: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3a70: 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29  ERVICE_STOPPED")
3a80: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3a90: 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41  _UNSUPPORTED_FEA
3aa0: 54 55 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TURE:....return(
3ab0: 22 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f  "SCARD_E_UNSUPPO
3ac0: 52 54 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a  RTED_FEATURE");.
3ad0: 23 69 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49  #ifdef SCARD_W_I
3ae0: 4e 53 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63  NSERTED_CARD...c
3af0: 61 73 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45  ase SCARD_W_INSE
3b00: 52 54 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65  RTED_CARD:....re
3b10: 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e  turn("SCARD_W_IN
3b20: 53 45 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23  SERTED_CARD");.#
3b30: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 43 41  endif.#ifdef SCA
3b40: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3b50: 41 56 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65  AVAILABLE...case
3b60: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44   SCARD_E_NO_READ
3b70: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09  ERS_AVAILABLE:..
3b80: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3b90: 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41  E_NO_READERS_AVA
3ba0: 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66  ILABLE");.#endif
3bb0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e  ..}...return("UN
3bc0: 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74  KNOWN");.}..stat
3bd0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
3be0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
3bf0: 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69  _OBJID_TO_STR(ui
3c00: 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a  nt16_t objid) {.
3c10: 09 73 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20  .switch (objid) 
3c20: 7b 0a 09 09 63 61 73 65 20 30 78 32 30 30 30 3a  {...case 0x2000:
3c30: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3c40: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
3c50: 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61  ERALINFO");...ca
3c60: 73 65 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65  se 0x2100:....re
3c70: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3c80: 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e  _OBJID_PROPERSON
3c90: 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65  ALINFO");...case
3ca0: 20 30 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75   0x3000:....retu
3cb0: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3cc0: 42 4a 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52  BJID_ACCESSCONTR
3cd0: 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34  OL");...case 0x4
3ce0: 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  000:....return("
3cf0: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3d00: 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65  _LOGIN");...case
3d10: 20 30 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75   0x5000:....retu
3d20: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d30: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b  BJID_CARDINFO");
3d40: 0a 09 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a  ...case 0x6000:.
3d50: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d60: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
3d70: 45 54 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65  ETRICS");...case
3d80: 20 30 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75   0x7000:....retu
3d90: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3da0: 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43  BJID_DIGITALSIGC
3db0: 45 52 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78  ERT");...case 0x
3dc0: 30 32 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  0200:....return(
3dd0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3de0: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a  D_CAC_PERSON");.
3df0: 09 09 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09  ..case 0x0202:..
3e00: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3e10: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42  _TLV_OBJID_CAC_B
3e20: 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73  ENEFITS");...cas
3e30: 65 20 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74  e 0x0203:....ret
3e40: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e50: 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42  OBJID_CAC_OTHERB
3e60: 45 4e 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73  ENEFITS");...cas
3e70: 65 20 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74  e 0x0201:....ret
3e80: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e90: 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e  OBJID_CAC_PERSON
3ea0: 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NEL");...case 0x
3eb0: 30 32 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  02FE:....return(
3ec0: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3ed0: 44 5f 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b  D_CAC_PKICERT");
3ee0: 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55  ..}....return("U
3ef0: 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61  NKNOWN");.}..sta
3f00: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
3f10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
3f20: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
3f30: 28 75 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65  (uint8_t apptype
3f40: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70  ) {..switch (app
3f50: 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30  type) {...case 0
3f60: 78 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x00:....return("
3f70: 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30  NONE");...case 0
3f80: 78 30 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x01:....return("
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
3fa0: 45 4e 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65  ENERIC");...case
3fb0: 20 30 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e   0x02:....return
3fc0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3fd0: 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30  _SKI");...case 0
3fe0: 78 30 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x03:....return("
3ff0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
4000: 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f  ENERIC | CACKEY_
4010: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
4020: 09 63 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72  .case 0x04:....r
4030: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
4040: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63  V_APP_PKI");...c
4050: 61 73 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74  ase 0x05:....ret
4060: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
4070: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
4080: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
4090: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a  ");...case 0x06:
40a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
40b0: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c  EY_TLV_APP_SKI |
40c0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
40d0: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
40e0: 30 37 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  07:....return("C
40f0: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45  ACKEY_TLV_APP_GE
4100: 4e 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54  NERIC | CACKEY_T
4110: 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43  LV_APP_SKI | CAC
4120: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
4130: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22  );..}...return("
4140: 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74  INVALID");.}..st
4150: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4160: 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55  *CACKEY_DEBUG_FU
4170: 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f  NC_ATTRIBUTE_TO_
4180: 53 54 52 28 43 4b 5f 41 54 54 52 49 42 55 54 45  STR(CK_ATTRIBUTE
4190: 5f 54 59 50 45 20 61 74 74 72 29 20 7b 0a 09 73  _TYPE attr) {..s
41a0: 77 69 74 63 68 20 28 61 74 74 72 29 20 7b 0a 09  witch (attr) {..
41b0: 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a  .case CKA_CLASS:
41c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
41d0: 43 4c 41 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CLASS");...case 
41e0: 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72 65  CKA_TOKEN:....re
41f0: 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e 22  turn("CKA_TOKEN"
4200: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
4210: 49 56 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  IVATE:....return
4220: 28 22 43 4b 41 5f 50 52 49 56 41 54 45 22 29 3b  ("CKA_PRIVATE");
4230: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45  ...case CKA_LABE
4240: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  L:....return("CK
4250: 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61 73  A_LABEL");...cas
4260: 65 20 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f  e CKA_APPLICATIO
4270: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  N:....return("CK
4280: 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 22 29 3b  A_APPLICATION");
4290: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55  ...case CKA_VALU
42a0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
42b0: 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73  A_VALUE");...cas
42c0: 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 3a  e CKA_OBJECT_ID:
42d0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
42e0: 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09 63  OBJECT_ID");...c
42f0: 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ase CKA_CERTIFIC
4300: 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  ATE_TYPE:....ret
4310: 75 72 6e 28 22 43 4b 41 5f 43 45 52 54 49 46 49  urn("CKA_CERTIFI
4320: 43 41 54 45 5f 54 59 50 45 22 29 3b 0a 09 09 63  CATE_TYPE");...c
4330: 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a  ase CKA_ISSUER:.
4340: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49  ...return("CKA_I
4350: 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20  SSUER");...case 
4360: 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
4370: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
4380: 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 22  A_SERIAL_NUMBER"
4390: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 43  );...case CKA_AC
43a0: 5f 49 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75  _ISSUER:....retu
43b0: 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53 53 55 45  rn("CKA_AC_ISSUE
43c0: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
43d0: 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  OWNER:....return
43e0: 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a 09  ("CKA_OWNER");..
43f0: 09 63 61 73 65 20 43 4b 41 5f 41 54 54 52 5f 54  .case CKA_ATTR_T
4400: 59 50 45 53 3a 0a 09 09 09 72 65 74 75 72 6e 28  YPES:....return(
4410: 22 43 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 22  "CKA_ATTR_TYPES"
4420: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 52  );...case CKA_TR
4430: 55 53 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  USTED:....return
4440: 28 22 43 4b 41 5f 54 52 55 53 54 45 44 22 29 3b  ("CKA_TRUSTED");
4450: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
4460: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
4470: 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29 3b  "CKA_KEY_TYPE");
4480: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
4490: 45 43 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ECT:....return("
44a0: 43 4b 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a 09  CKA_SUBJECT");..
44b0: 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09  .case CKA_ID:...
44c0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 44 22  .return("CKA_ID"
44d0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45  );...case CKA_SE
44e0: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
44f0: 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49 54 49 56  rn("CKA_SENSITIV
4500: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4510: 45 4e 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75  ENCRYPT:....retu
4520: 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59 50 54 22  rn("CKA_ENCRYPT"
4530: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45  );...case CKA_DE
4540: 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e  CRYPT:....return
4550: 28 22 43 4b 41 5f 44 45 43 52 59 50 54 22 29 3b  ("CKA_DECRYPT");
4560: 0a 09 09 63 61 73 65 20 43 4b 41 5f 57 52 41 50  ...case CKA_WRAP
4570: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4580: 5f 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20  _WRAP");...case 
4590: 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09 72  CKA_UNWRAP:....r
45a0: 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52 41  eturn("CKA_UNWRA
45b0: 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  P");...case CKA_
45c0: 53 49 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  SIGN:....return(
45d0: 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09 63  "CKA_SIGN");...c
45e0: 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ase CKA_SIGN_REC
45f0: 4f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  OVER:....return(
4600: 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45  "CKA_SIGN_RECOVE
4610: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4620: 56 45 52 49 46 59 3a 0a 09 09 09 72 65 74 75 72  VERIFY:....retur
4630: 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 22 29 3b  n("CKA_VERIFY");
4640: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49  ...case CKA_VERI
4650: 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72  FY_RECOVER:....r
4660: 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46  eturn("CKA_VERIF
4670: 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63  Y_RECOVER");...c
4680: 61 73 65 20 43 4b 41 5f 44 45 52 49 56 45 3a 0a  ase CKA_DERIVE:.
4690: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44  ...return("CKA_D
46a0: 45 52 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20  ERIVE");...case 
46b0: 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 3a 0a  CKA_START_DATE:.
46c0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
46d0: 54 41 52 54 5f 44 41 54 45 22 29 3b 0a 09 09 63  TART_DATE");...c
46e0: 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54 45  ase CKA_END_DATE
46f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4700: 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09 63  _END_DATE");...c
4710: 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a  ase CKA_MODULUS:
4720: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4730: 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09 63 61 73  MODULUS");...cas
4740: 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  e CKA_MODULUS_BI
4750: 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TS:....return("C
4760: 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 22  KA_MODULUS_BITS"
4770: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 55  );...case CKA_PU
4780: 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  BLIC_EXPONENT:..
4790: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 55  ..return("CKA_PU
47a0: 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29 3b  BLIC_EXPONENT");
47b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
47c0: 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09  ATE_EXPONENT:...
47d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
47e0: 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29 3b  VATE_EXPONENT");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d  ...case CKA_PRIM
4800: 45 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  E_1:....return("
4810: 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a 09  CKA_PRIME_1");..
4820: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f  .case CKA_PRIME_
4830: 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  2:....return("CK
4840: 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09 63  A_PRIME_2");...c
4850: 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54  ase CKA_EXPONENT
4860: 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  _1:....return("C
4870: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29 3b  KA_EXPONENT_1");
4880: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f  ...case CKA_EXPO
4890: 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75 72  NENT_2:....retur
48a0: 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f  n("CKA_EXPONENT_
48b0: 32 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  2");...case CKA_
48c0: 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a 09 09 09  COEFFICIENT:....
48d0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45 46  return("CKA_COEF
48e0: 46 49 43 49 45 4e 54 22 29 3b 0a 09 09 63 61 73  FICIENT");...cas
48f0: 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09 09  e CKA_PRIME:....
4900: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d  return("CKA_PRIM
4910: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4920: 53 55 42 50 52 49 4d 45 3a 0a 09 09 09 72 65 74  SUBPRIME:....ret
4930: 75 72 6e 28 22 43 4b 41 5f 53 55 42 50 52 49 4d  urn("CKA_SUBPRIM
4940: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4950: 42 41 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  BASE:....return(
4960: 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09 63  "CKA_BASE");...c
4970: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42 49  ase CKA_PRIME_BI
4980: 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TS:....return("C
4990: 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b  KA_PRIME_BITS");
49a0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 5f  ...case CKA_SUB_
49b0: 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72  PRIME_BITS:....r
49c0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f 50  eturn("CKA_SUB_P
49d0: 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63  RIME_BITS");...c
49e0: 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42 49  ase CKA_VALUE_BI
49f0: 54 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TS:....return("C
4a00: 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53 22 29 3b  KA_VALUE_BITS");
4a10: 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55  ...case CKA_VALU
4a20: 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e  E_LEN:....return
4a30: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 22  ("CKA_VALUE_LEN"
4a40: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58  );...case CKA_EX
4a50: 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65  TRACTABLE:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 58 54 52 41 43  turn("CKA_EXTRAC
4a70: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
4a80: 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72 65  CKA_LOCAL:....re
4a90: 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c 22  turn("CKA_LOCAL"
4aa0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e 45  );...case CKA_NE
4ab0: 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  VER_EXTRACTABLE:
4ac0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4ad0: 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c  NEVER_EXTRACTABL
4ae0: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4af0: 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45  ALWAYS_SENSITIVE
4b00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4b10: 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56  _ALWAYS_SENSITIV
4b20: 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  E");...case CKA_
4b30: 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53  KEY_GEN_MECHANIS
4b40: 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  M:....return("CK
4b50: 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e  A_KEY_GEN_MECHAN
4b60: 49 53 4d 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ISM");...case CK
4b70: 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09  A_MODIFIABLE:...
4b80: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44  .return("CKA_MOD
4b90: 49 46 49 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  IFIABLE");...cas
4ba0: 65 20 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  e CKA_ECDSA_PARA
4bb0: 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  MS:....return("C
4bc0: 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 22  KA_ECDSA_PARAMS"
4bd0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43  );...case CKA_EC
4be0: 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72  _POINT:....retur
4bf0: 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 22  n("CKA_EC_POINT"
4c00: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45  );...case CKA_SE
4c10: 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09 09  CONDARY_AUTH:...
4c20: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 43  .return("CKA_SEC
4c30: 4f 4e 44 41 52 59 5f 41 55 54 48 22 29 3b 0a 09  ONDARY_AUTH");..
4c40: 09 63 61 73 65 20 43 4b 41 5f 41 55 54 48 5f 50  .case CKA_AUTH_P
4c50: 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65 74  IN_FLAGS:....ret
4c60: 75 72 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50 49  urn("CKA_AUTH_PI
4c70: 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09 63 61 73  N_FLAGS");...cas
4c80: 65 20 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45  e CKA_HW_FEATURE
4c90: 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e  _TYPE:....return
4ca0: 28 22 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45  ("CKA_HW_FEATURE
4cb0: 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20  _TYPE");...case 
4cc0: 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49  CKA_RESET_ON_INI
4cd0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4ce0: 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 22  A_RESET_ON_INIT"
4cf0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 41  );...case CKA_HA
4d00: 53 5f 52 45 53 45 54 3a 0a 09 09 09 72 65 74 75  S_RESET:....retu
4d10: 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52 45 53 45  rn("CKA_HAS_RESE
4d20: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
4d30: 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a 0a  VENDOR_DEFINED:.
4d40: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56  ...return("CKA_V
4d50: 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44 22 29 3b  ENDOR_DEFINED");
4d60: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e  ..}...return("UN
4d70: 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64  KNOWN");.}..#  d
4d80: 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20  efine malloc(x) 
4d90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4da0: 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75  C_MALLOC(x, __fu
4db0: 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a  nc__, __LINE__).
4dc0: 23 20 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f  #  define reallo
4dd0: 63 28 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44  c(x, y) CACKEY_D
4de0: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
4df0: 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f  C(x, y, __func__
4e00: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69  , __LINE__).#  i
4e10: 66 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 20  fdef strdup.#   
4e20: 20 75 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20   undef strdup.# 
4e30: 20 65 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65   endif.#  define
4e40: 20 73 74 72 64 75 70 28 78 29 20 43 41 43 4b 45   strdup(x) CACKE
4e50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52  Y_DEBUG_FUNC_STR
4e60: 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c  DUP(x, __func__,
4e70: 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65   __LINE__).#else
4e80: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78  Y_DEBUG_PRINTF(x
4ea0: 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66  ...) /**/.#  def
4eb0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4ec0: 5f 50 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20  _PRINTBUF(f, x, 
4ed0: 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  y) /**/.#  defin
4ee0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4ef0: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78  UNC_TAG_TO_STR(x
4f00: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4f10: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4f20: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
4f30: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78  CARDERR_TO_STR(x
4f40: 29 20 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45  ) "DEBUG_DISABLE
4f50: 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43  D".#  define CAC
4f60: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
4f70: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22  BJID_TO_STR(x) "
4f80: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
4f90: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4fa0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54  _DEBUG_FUNC_APPT
4fb0: 59 50 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44  YPE_TO_STR(x) "D
4fc0: 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23  EBUG_DISABLED".#
4fd0: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4fe0: 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
4ff0: 42 55 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22  BUTE_TO_STR(x) "
5000: 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a  DEBUG_DISABLED".
5010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 6e  #endif../*. * In
5020: 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f 75 72  clude these sour
5030: 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73  ce files in this
5040: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75 6e 69   translation uni
5050: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
5060: 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75 6e 63   bind to. * func
5070: 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20 69 6e  tions and not in
5080: 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62 6f 6c  clude any symbol
5090: 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  s in the output 
50a0: 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  shared object.. 
50b0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61 73 6e  */.#include "asn
50c0: 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63 6c 75  1-x509.c".#inclu
50d0: 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69 6e 63  de "sha1.c".#inc
50e0: 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a 74 79  lude "md5.c"..ty
50f0: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
5100: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45 52 52  CKEY_ID_TYPE_ERR
5110: 4f 52 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54  OR,..CACKEY_ID_T
5120: 59 50 45 5f 55 4e 4b 4e 4f 57 4e 2c 0a 09 43 41  YPE_UNKNOWN,..CA
5130: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
5140: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
5150: 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f 49  E_PIV,..CACKEY_I
5160: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
5170: 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  .} cackey_pcsc_i
5180: 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74 20  d_type;..struct 
5190: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
51a0: 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f 70  tity {..cackey_p
51b0: 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
51c0: 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ype;...size_t ce
51d0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
51e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
51f0: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
5200: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 0a  ize_t keysize;..
5210: 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63  .union {...struc
5220: 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20  t {....unsigned 
5230: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
5240: 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65  ...uint16_t file
5250: 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73 74  ;...} cac;....st
5260: 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e  ruct {....unsign
5270: 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b 0a  ed char key_id;.
5280: 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33 32  ...char label[32
5290: 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63  ];...} piv;..} c
52a0: 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ard;.};..struct 
52b0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
52c0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
52d0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
52e0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  pcsc_identity;..
52f0: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  .CK_ATTRIBUTE *a
5300: 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55  ttributes;..CK_U
5310: 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f  LONG attributes_
5320: 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63  count;.};..struc
5330: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
5340: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
5350: 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
5360: 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20  tID;...CK_STATE 
5370: 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53  state;..CK_FLAGS
5380: 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e   flags;..CK_ULON
5390: 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  G ulDeviceError;
53a0: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  ..CK_VOID_PTR pA
53b0: 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f  pplication;..CK_
53c0: 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a  NOTIFY Notify;..
53d0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
53e0: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
53f0: 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
5400: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
5410: 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72  ount;...int sear
5420: 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41  ch_active;..CK_A
5430: 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65 61  TTRIBUTE_PTR sea
5440: 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55  rch_query;..CK_U
5450: 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72  LONG search_quer
5460: 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  y_count;..unsign
5470: 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63  ed long search_c
5480: 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69  urr_id;...int si
5490: 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d  gn_active;..CK_M
54a0: 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69  ECHANISM_TYPE si
54b0: 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  gn_mechanism;..C
54c0: 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f  K_BYTE_PTR sign_
54d0: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
54e0: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b  ong sign_buflen;
54f0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5500: 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73  sign_bufused;..s
5510: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5520: 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e  ntity *sign_iden
5530: 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72  tity;...int decr
5540: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
5550: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
5560: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
5570: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
5580: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
5590: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
55a0: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
55b0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
55c0: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79  _identity *decry
55d0: 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a  pt_identity;.};.
55e0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
55f0: 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  lot {..int activ
5600: 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c  e;..int internal
5610: 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  ;...char *pcsc_r
5620: 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73  eader;...int pcs
5630: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5640: 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70  ;..SCARDHANDLE p
5650: 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20  csc_card;...int 
5660: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5670: 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74  h;..int transact
5680: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
5690: 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73  ;...int slot_res
56a0: 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74  et;...CK_FLAGS t
56b0: 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e  oken_flags;...un
56c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62  signed char *lab
56d0: 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74  el;...DWORD prot
56e0: 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  ocol;...unsigned
56f0: 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74   int cached_cert
5700: 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74  s_count;..struct
5710: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
5720: 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65  ntity *cached_ce
5730: 72 74 73 3b 0a 0a 09 63 61 63 6b 65 79 5f 70 63  rts;...cackey_pc
5740: 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79  sc_id_type id_ty
5750: 70 65 5f 68 69 6e 74 3b 0a 7d 3b 0a 0a 74 79 70  pe_hint;.};..typ
5760: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5770: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
5780: 52 49 43 20 3d 20 30 78 30 31 2c 0a 09 43 41 43  RIC = 0x01,..CAC
5790: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20  KEY_TLV_APP_SKI 
57a0: 20 20 20 20 3d 20 30 78 30 32 2c 0a 09 43 41 43      = 0x02,..CAC
57b0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20  KEY_TLV_APP_PKI 
57c0: 20 20 20 20 3d 20 30 78 30 34 0a 7d 20 63 61 63      = 0x04.} cac
57d0: 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b  key_tlv_apptype;
57e0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
57f0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5800: 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20  ID_GENERALINFO  
5810: 20 20 20 20 20 3d 20 30 78 32 30 30 30 2c 0a 09       = 0x2000,..
5820: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5830: 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f  _PROPERSONALINFO
5840: 20 20 20 3d 20 30 78 32 31 30 30 2c 0a 09 43 41     = 0x2100,..CA
5850: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41  CKEY_TLV_OBJID_A
5860: 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20  CCESSCONTROL    
5870: 20 3d 20 30 78 33 30 30 30 2c 0a 09 43 41 43 4b   = 0x3000,..CACK
5880: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47  EY_TLV_OBJID_LOG
5890: 49 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  IN             =
58a0: 20 30 78 34 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x4000,..CACKEY
58b0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49  _TLV_OBJID_CARDI
58c0: 4e 46 4f 20 20 20 20 20 20 20 20 20 20 3d 20 30  NFO          = 0
58d0: 78 35 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x5000,..CACKEY_T
58e0: 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52  LV_OBJID_BIOMETR
58f0: 49 43 53 20 20 20 20 20 20 20 20 3d 20 30 78 36  ICS        = 0x6
5900: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5910: 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53 49  _OBJID_DIGITALSI
5920: 47 43 45 52 54 20 20 20 20 3d 20 30 78 37 30 30  GCERT    = 0x700
5930: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5940: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20  BJID_CAC_PERSON 
5950: 20 20 20 20 20 20 20 3d 20 30 78 30 32 30 30 2c         = 0x0200,
5960: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5970: 49 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 20  ID_CAC_BENEFITS 
5980: 20 20 20 20 20 3d 20 30 78 30 32 30 32 2c 0a 09       = 0x0202,..
5990: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
59a0: 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e 45 46 49  _CAC_OTHERBENEFI
59b0: 54 53 20 3d 20 30 78 30 32 30 33 2c 0a 09 43 41  TS = 0x0203,..CA
59c0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
59d0: 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20  AC_PERSONNEL    
59e0: 20 3d 20 30 78 30 32 30 31 2c 0a 09 43 41 43 4b   = 0x0201,..CACK
59f0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
5a00: 5f 50 4b 49 43 45 52 54 20 20 20 20 20 20 20 3d  _PKICERT       =
5a10: 20 30 78 30 32 46 45 0a 7d 20 63 61 63 6b 65 79   0x02FE.} cackey
5a20: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a  _tlv_objectid;..
5a30: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
5a40: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
5a50: 4b 45 4e 50 52 45 53 45 4e 54 20 20 20 20 3d 20  KENPRESENT    = 
5a60: 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  1,..CACKEY_PCSC_
5a70: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20  S_OK            
5a80: 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50    = 0,..CACKEY_P
5a90: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
5aa0: 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43        = -1,..CAC
5ab0: 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49  KEY_PCSC_E_BADPI
5ac0: 4e 20 20 20 20 20 20 20 20 20 20 3d 20 2d 32 2c  N          = -2,
5ad0: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5ae0: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 20  LOCKED          
5af0: 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -3,..CACKEY_PC
5b00: 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20  SC_E_NEEDLOGIN  
5b10: 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b       = -4,..CACK
5b20: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
5b30: 42 53 45 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a  BSENT     = -6,.
5b40: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52  .CACKEY_PCSC_E_R
5b50: 45 54 52 59 20 20 20 20 20 20 20 20 20 20 20 3d  ETRY           =
5b60: 20 2d 37 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -7,..CACKEY_PCS
5b70: 43 5f 45 5f 4e 4f 44 41 54 41 20 20 20 20 20 20  C_E_NODATA      
5b80: 20 20 20 20 3d 20 2d 38 0a 7d 20 63 61 63 6b 65      = -8.} cacke
5b90: 79 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63  y_ret;..struct c
5ba0: 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72  ackey_tlv_cardur
5bb0: 6c 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  l {..unsigned ch
5bc0: 61 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d  ar        rid[5]
5bd0: 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70  ;..cackey_tlv_ap
5be0: 70 74 79 70 65 20 20 20 61 70 70 74 79 70 65 3b  ptype   apptype;
5bf0: 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  ..cackey_tlv_obj
5c00: 65 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b  ectid  objectid;
5c10: 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a  ..cackey_tlv_obj
5c20: 65 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75  ectid  appid;..u
5c30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20  nsigned char    
5c40: 20 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73      pinid;.};..s
5c50: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
5c60: 5f 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20  _entity;.struct 
5c70: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
5c80: 79 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67  y {..uint8_t tag
5c90: 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68  ;..size_t length
5ca0: 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f  ;...union {...vo
5cb0: 69 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72  id *value;...str
5cc0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5cd0: 61 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61  ardurl *value_ca
5ce0: 72 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74  rdurl;...uint8_t
5cf0: 20 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b   value_byte;..};
5d00: 0a 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ...struct cackey
5d10: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65  _tlv_entity *_ne
5d20: 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45  xt;.};../* CACKE
5d30: 59 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  Y Global Handles
5d40: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
5d50: 2a 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20  *cackey_biglock 
5d60: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73  = NULL;.static s
5d70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73  truct cackey_ses
5d80: 73 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73  sion cackey_sess
5d90: 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69  ions[128];.stati
5da0: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
5db0: 73 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  slot cackey_slot
5dc0: 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69  s[128];.static i
5dd0: 6e 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  nt cackey_initia
5de0: 6c 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69  lized = 0;.stati
5df0: 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67  c int cackey_big
5e00: 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43  lock_init = 0;.C
5e10: 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
5e20: 52 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b  RGS cackey_args;
5e30: 0a 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74  ../** Extra cert
5e40: 69 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c  ificates to incl
5e50: 75 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f  ude in token **/
5e60: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5e70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74  csc_identity ext
5e80: 72 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23  ra_certs[] = {.#
5e90: 69 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f  include "cackey_
5ea0: 62 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22  builtin_certs.h"
5eb0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 43 41 43  .};..#define CAC
5ec0: 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
5ed0: 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43 4b  T_XSTR(str) CACK
5ee0: 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c 54  EY_MACRO_DEFAULT
5ef0: 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e  _STR(str).#defin
5f00: 65 20 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f 44  e CACKEY_MACRO_D
5f10: 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 20  EFAULT_STR(str) 
5f20: 23 73 74 72 0a 0a 2f 2a 20 50 72 6f 74 65 63 74  #str../* Protect
5f30: 65 64 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f  ed Authenticatio
5f40: 6e 20 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a  n Path command *
5f50: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
5f60: 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
5f70: 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 52 65  d = NULL;../* Re
5f80: 61 64 65 72 20 45 78 63 6c 75 73 69 6f 6e 20 6f  ader Exclusion o
5f90: 72 20 49 6e 63 6c 75 64 65 2d 6f 6e 6c 79 20 2a  r Include-only *
5fa0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
5fb0: 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
5fc0: 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c  clude_only = NUL
5fd0: 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  L;.static char *
5fe0: 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
5ff0: 78 63 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  xclude = NULL;..
6000: 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20 48  /* PCSC Global H
6010: 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63  andles */.static
6020: 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54 20   LPSCARDCONTEXT 
6030: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6040: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74  le = NULL;..stat
6050: 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
6060: 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69   cackey_getversi
6070: 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74  on(void) {..stat
6080: 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
6090: 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09   retval = 255;..
60a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61  unsigned long ma
60b0: 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e  jor = 0;..unsign
60c0: 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20  ed long minor = 
60d0: 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f  0;..char *major_
60e0: 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  str = NULL;..cha
60f0: 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e  r *minor_str = N
6100: 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ULL;...CACKEY_DE
6110: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6120: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65 74  ed.");...if (ret
6130: 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09 09  val != 255) {...
6140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6150: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
6160: 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22 2c  x%lx (cached).",
6170: 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74   retval);....ret
6180: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  urn(retval);..}.
6190: 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23  ..retval = 0;..#
61a0: 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56 45  ifdef PACKAGE_VE
61b0: 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61  RSION.        ma
61c0: 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41 47  jor_str = PACKAG
61d0: 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28  E_VERSION;..if (
61e0: 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20  major_str) {..  
61f0: 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74        major = st
6200: 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c  rtoul(major_str,
6210: 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29   &minor_str, 10)
6220: 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73  ;....if (minor_s
6230: 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d  tr) {....minor =
6240: 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73   strtoul(minor_s
6250: 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30  tr + 1, NULL, 10
6260: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76  );...}..}...retv
6270: 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31  al = (major << 1
6280: 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38  6) | (minor << 8
6290: 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  );.#endif...CACK
62a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
62b0: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
62c0: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  ", retval);...re
62d0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
62e0: 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74 65  ./* PC/SC Relate
62f0: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
6300: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6310: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
6320: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6330: 74 5f 61 6c 6c 28 69 6e 74 20 75 6e 69 74 69 61  t_all(int unitia
6340: 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72 73  lize_all_readers
6350: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6360: 54 53 0a 20 2a 20 20 20 20 20 69 6e 74 20 75 6e  TS. *     int un
6370: 69 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61  itialize_all_rea
6380: 64 65 72 73 20 20 20 20 20 20 46 72 65 65 20 74  ders      Free t
6390: 68 65 20 22 70 63 73 63 5f 72 65 61 64 65 72 22  he "pcsc_reader"
63a0: 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
63b0: 65 64 20 77 69 74 68 0a 20 2a 20 20 20 20 20 20  ed with. *      
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 65 61 63 68 20 73 6c 6f 74 20 28       each slot (
63e0: 62 6f 6f 6c 65 61 6e 29 0a 20 2a 0a 20 2a 20 52  boolean). *. * R
63f0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
6400: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
6410: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
6420: 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e  function disconn
6430: 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61  ects from all ca
6440: 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  rds.. *. */.stat
6450: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73  ic void cackey_s
6460: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6470: 61 6c 6c 28 69 6e 74 20 75 6e 69 74 69 61 6c 69  all(int unitiali
6480: 7a 65 5f 61 6c 6c 5f 72 65 61 64 65 72 73 29 20  ze_all_readers) 
6490: 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
64a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
64b0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
64c0: 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  );...for (idx = 
64d0: 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
64e0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
64f0: 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
6500: 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
6510: 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
6520: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65  _slots[idx].inte
6530: 72 6e 61 6c 29 20 7b 0a 09 09 09 2f 2a 20 53 6b  rnal) {..../* Sk
6540: 69 70 20 69 6e 74 65 72 6e 61 6c 20 73 6c 6f 74  ip internal slot
6550: 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e 75 65  s */....continue
6560: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
6570: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6580: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6590: 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ed) {....CACKEY_
65a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
65b0: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c  ardDisconnect(%l
65c0: 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73  u) called", (uns
65d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
65e0: 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f  ;.....SCardDisco
65f0: 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f  nnect(cackey_slo
6600: 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72  ts[idx].pcsc_car
6610: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
6620: 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  ARD);...}....if 
6630: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6640: 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66  x].label) {....f
6650: 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
6660: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09  [idx].label);...
6670: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6680: 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  dx].label = NULL
6690: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 69  ;...}....if (uni
66a0: 74 69 61 6c 69 7a 65 5f 61 6c 6c 5f 72 65 61 64  tialize_all_read
66b0: 65 72 73 20 7c 7c 20 21 63 61 63 6b 65 79 5f 73  ers || !cackey_s
66c0: 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  lots[idx].active
66d0: 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
66e0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
66f0: 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09  c_reader) {.....
6700: 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
6710: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
6720: 65 72 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  er);......cackey
6730: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6740: 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
6750: 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
6760: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6770: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
6780: 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ock = 0;....cack
6790: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
67a0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
67b0: 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 0;....cackey_s
67c0: 6c 6f 74 73 5b 69 64 78 5d 2e 69 64 5f 74 79 70  lots[idx].id_typ
67d0: 65 5f 68 69 6e 74 20 3d 20 43 41 43 4b 45 59 5f  e_hint = CACKEY_
67e0: 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f 57 4e 3b  ID_TYPE_UNKNOWN;
67f0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69  ...} else {....i
6800: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6810: 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
6820: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
6830: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6840: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
6850: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
6860: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  ;....}...}....ca
6870: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6880: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
6890: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28  ted = 0;....if (
68a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
68b0: 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
68c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
68d0: 54 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69  TF("Marking acti
68e0: 76 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62  ve slot %lu as b
68f0: 65 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e  eing reset", (un
6900: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78  signed long) idx
6910: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
6920: 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
6930: 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 09 7d 0a  set = 1;...}..}.
6940: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6950: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
6960: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ");...return;.}.
6970: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6980: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
6990: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
69a0: 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a  nnect(void);. *.
69b0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
69c0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
69d0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
69e0: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
69f0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
6a00: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
6a10: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6a20: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
6a30: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6a40: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
6a50: 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65   connects to the
6a60: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
6a70: 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n Manager and up
6a80: 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20  dates the. *    
6a90: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6aa0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6ab0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6ac0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69  pcsc_connect(voi
6ad0: 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  d) {..LONG scard
6ae0: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6af0: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ;.#ifdef HAVE_SC
6b00: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
6b10: 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73  T..LONG scard_is
6b20: 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69  valid_ret;.#endi
6b30: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
6b40: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
6b50: 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ");...if (cackey
6b60: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
6b70: 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
6b80: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d  _pcsc_handle = m
6b90: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
6ba0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6bb0: 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ));...if (cackey
6bc0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20  _pcsc_handle == 
6bd0: 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
6be0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6bf0: 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29  Call to malloc()
6c00: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
6c10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
6c20: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6c30: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6c40: 28 30 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  (0);.....return(
6c50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6c60: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43  NERIC);...}....C
6c70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6c80: 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69  TF("SCardEstabli
6c90: 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  shContext() call
6ca0: 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73  ed");...scard_es
6cb0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20  t_context_ret = 
6cc0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6cd0: 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50  ntext(SCARD_SCOP
6ce0: 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20  E_SYSTEM, NULL, 
6cf0: 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73  NULL, cackey_pcs
6d00: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20  c_handle);...if 
6d10: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
6d20: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
6d30: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
6d40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6d50: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61  NTF("Call to SCa
6d60: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6d70: 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72  xt failed (retur
6d80: 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74  ned %s/%li), ret
6d90: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
6da0: 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  e", CACKEY_DEBUG
6db0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
6dc0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f  O_STR(scard_est_
6dd0: 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c  context_ret), (l
6de0: 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63  ong) scard_est_c
6df0: 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09  ontext_ret);....
6e00: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73  .free(cackey_pcs
6e10: 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61  c_handle);....ca
6e20: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6e30: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63   = NULL;.....cac
6e40: 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
6e50: 6e 65 63 74 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09  nect_all(0);....
6e60: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6e70: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6e80: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48  ..}..}..#ifdef H
6e90: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
6ea0: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f  CONTEXT..CACKEY_
6eb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6ec0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
6ed0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73  t() called");..s
6ee0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6ef0: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43   = SCardIsValidC
6f00: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
6f10: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66  csc_handle);..if
6f20: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f   (scard_isvalid_
6f30: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6f40: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
6f50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6f60: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f  "Handle has beco
6f70: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72  me invalid (SCar
6f80: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20  dIsValidContext 
6f90: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e  = %s/%li), tryin
6fa0: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  g to re-establis
6fb0: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  h...", CACKEY_DE
6fc0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
6fd0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69  R_TO_STR(scard_i
6fe0: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f  svalid_ret), (lo
6ff0: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ng) scard_isvali
7000: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45  d_ret);....CACKE
7010: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7020: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
7030: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
7040: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
7050: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
7060: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
7070: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
7080: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
7090: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
70a0: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
70b0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
70c0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
70d0: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
70e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
70f0: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
7100: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
7110: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
7120: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
7130: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
7140: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
7150: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
7160: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
7170: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
7180: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
7190: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
71a0: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
71b0: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79  ndle);....cackey
71c0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
71d0: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ULL;.....cackey_
71e0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
71f0: 5f 61 6c 6c 28 30 29 3b 0a 0a 09 09 09 72 65 74  _all(0);.....ret
7200: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7210: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
7220: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7230: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
7240: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
7250: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
7260: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
7270: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
7280: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
7290: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
72a0: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
72b0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
72c0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
72d0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
72e0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
72f0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
7300: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
7310: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
7320: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
7330: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7340: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7350: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
7360: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
7370: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
7380: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
7390: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
73a0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
73b0: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
73c0: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
73d0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
73e0: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
73f0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
7400: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
7410: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
7420: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
7430: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
7440: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
7450: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
7460: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7470: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7480: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
7490: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
74a0: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
74b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
74c0: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
74d0: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
74e0: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
74f0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7500: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
7510: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
7520: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
7530: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
7540: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
7550: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
7560: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
7570: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
7580: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7590: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
75a0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
75b0: 43 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  C);..}...cackey_
75c0: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
75d0: 5f 61 6c 6c 28 30 29 3b 0a 0a 09 72 65 74 75 72  _all(0);...retur
75e0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
75f0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
7600: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
7610: 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  id cackey_mark_s
7620: 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63 74  lot_reset(struct
7630: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7640: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
7650: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
7660: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
7670: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
7680: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7690: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
76a0: 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61   marks a slot ha
76b0: 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65  s having been re
76c0: 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65  set, to later be
76d0: 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20   cleaned up.. * 
76e0: 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79      Cleanup only
76f0: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
7700: 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63  PKCS#11 client c
7710: 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63  alls C_FindObjec
7720: 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73  tsInit.. *. */.s
7730: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
7740: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
7750: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
7760: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73  slot *slot) {..s
7770: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
7780: 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
7790: 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
77a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
77b0: 63 65 72 74 73 3b 0a 0a 09 69 66 20 28 73 6c 6f  certs;...if (slo
77c0: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
77d0: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b  eturn;..}...CACK
77e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
77f0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7800: 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   (slot->pcsc_car
7810: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7820: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
7830: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7840: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
7850: 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  RD);..}...slot->
7860: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
7870: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
7880: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
7890: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
78a0: 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29  command == NULL)
78b0: 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   {...slot->token
78c0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
78d0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d 20  IN_REQUIRED;..} 
78e0: 65 6c 73 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  else {...slot->t
78f0: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
7900: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
7910: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
7920: 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65  *     LONG cacke
7930: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
7940: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7950: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44  lot *slot, DWORD
7960: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7970: 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  l);. *. * ARGUME
7980: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
7990: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
79a0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
79b0: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
79c0: 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52 44  . *. *     DWORD
79d0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
79e0: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50 72 6f  l. *         Pro
79f0: 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70 74  tocol to attempt
7a00: 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 52 45 54   first. *. * RET
7a10: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7a20: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
7a30: 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f  e from SCardReco
7a40: 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f  nnect(). *. * NO
7a50: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
7a60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
7a70: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61  apper around SCa
7a80: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a  rdReconnect(). *
7a90: 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61 72  . *     The SCar
7aa0: 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e  dReconnect() fun
7ab0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20  ction call will 
7ac0: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20  be called first 
7ad0: 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20  with the. *     
7ae0: 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f  dwPreferredProto
7af0: 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74  cols of "default
7b00: 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20  _protocol".  If 
7b10: 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e  that call return
7b20: 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45  s. *     SCARD_E
7b30: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20  _PROTO_MISMATCH 
7b40: 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20 61  try again with a
7b50: 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30   protocol of T=0
7b60: 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a  , and failing. *
7b70: 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20       that T=1.. 
7b80: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e  *. */.static LON
7b90: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7ba0: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7bb0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7bc0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
7bd0: 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 44 57 4f  protocol) {..DWO
7be0: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
7bf0: 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  ocol;..LONG scar
7c00: 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 65  d_conn_ret;...se
7c10: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 20  lected_protocol 
7c20: 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e  = 0;...scard_con
7c30: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
7c40: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7c50: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
7c60: 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66 61  ARE_SHARED, defa
7c70: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43  ult_protocol, SC
7c80: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7c90: 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63  &selected_protoc
7ca0: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  ol);...if (scard
7cb0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7cc0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7cd0: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TCH) {...CACKEY_
7ce0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7cf0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
7d00: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7d20: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7d30: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63   T=0")...scard_c
7d40: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
7d50: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
7d60: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7d70: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7d80: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7d90: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7da0: 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f  D, &selected_pro
7db0: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73  tocol);....if (s
7dc0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7dd0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7de0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41  ISMATCH) {....CA
7df0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7e00: 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  F("SCardReconnec
7e10: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7e20: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7e30: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
7e40: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73   just T=1")....s
7e50: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7e60: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
7e70: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7e80: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7e90: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7ea0: 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53  OL_T1, SCARD_RES
7eb0: 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65 63 74  ET_CARD, &select
7ec0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  ed_protocol);...
7ed0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64  }..}...if (scard
7ee0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7ef0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
7f00: 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c  ..slot->protocol
7f10: 20 3d 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74   = selected_prot
7f20: 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ocol;..}...retur
7f30: 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  n(scard_conn_ret
7f40: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
7f50: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
7f60: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f  ey_ret cackey_co
7f70: 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63  nnect_card(struc
7f80: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7f90: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
7fa0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7fb0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7fc0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7fd0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7fe0: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
7ff0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8000: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8010: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8020: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8030: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8040: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8050: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
8060: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
8070: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8080: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
8090: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
80a0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
80b0: 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
80c0: 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
80d0: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20  protocol;..LONG 
80e0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a  scard_conn_ret;.
80f0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8100: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
8110: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
8120: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8130: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
8140: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20  slot specified, 
8150: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
8160: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
8170: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8180: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70  GENERIC);..}...p
8190: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
81a0: 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  = cackey_pcsc_co
81b0: 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63  nnect();..if (pc
81c0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
81d0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
81e0: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
81f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
8200: 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
8210: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
8220: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
8230: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8240: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8250: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65  );..}.../* Conne
8260: 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66  ct to reader, if
8270: 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28   needed */..if (
8280: 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  !slot->pcsc_card
8290: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
82a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
82b0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
82c0: 74 28 25 73 29 20 63 61 6c 6c 65 64 20 66 6f 72  t(%s) called for
82d0: 20 73 6c 6f 74 20 25 70 22 2c 20 73 6c 6f 74 2d   slot %p", slot-
82e0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 73 6c  >pcsc_reader, sl
82f0: 6f 74 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  ot);...scard_con
8300: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8310: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
8320: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
8330: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
8340: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
8350: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
8360: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
8370: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
8380: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8390: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
83a0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
83b0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
83c0: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
83d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
83e0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
83f0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
8400: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
8410: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
8420: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
8430: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8440: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8450: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8460: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8470: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8480: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8490: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
84a0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
84b0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
84c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
84d0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
84e0: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
84f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8500: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8510: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8520: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8530: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
8540: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
8550: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8560: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8570: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8580: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8590: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
85a0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
85b0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
85c0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
85d0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
85e0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
85f0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
8600: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
8610: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
8620: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8630: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
8640: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
8650: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
8660: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
8670: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
8680: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
8690: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
86a0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
86b0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
86c0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
86d0: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
86e0: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
86f0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
8700: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8710: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8720: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8730: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8740: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8750: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8760: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8770: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8780: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8790: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
87a0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
87b0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
87c0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
87d0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
87e0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
87f0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8800: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8810: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
8820: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8830: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
8840: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
8850: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
8860: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
8870: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
8880: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8890: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
88a0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
88b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
88c0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
88d0: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
88e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
88f0: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8900: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8910: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8920: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
8930: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
8940: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
8950: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
8960: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
8970: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8980: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
8990: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
89a0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a  protocol);...}..
89b0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
89c0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
89d0: 4e 4f 5f 53 45 52 56 49 43 45 29 20 7b 0a 09 09  NO_SERVICE) {...
89e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
89f0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8a00: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8a10: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
8a20: 20 2d 2d 20 77 68 69 63 68 20 63 6f 75 6c 64 20   -- which could 
8a30: 6d 65 61 6e 20 6f 75 72 20 68 61 6e 64 6c 65 20  mean our handle 
8a40: 69 73 20 69 6e 76 61 6c 69 64 2c 20 77 69 6c 6c  is invalid, will
8a50: 20 74 72 79 20 74 6f 20 72 65 63 6f 6e 6e 65 63   try to reconnec
8a60: 74 20 74 6f 20 50 43 2f 53 43 20 73 65 72 76 69  t to PC/SC servi
8a70: 63 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ce");.....cackey
8a80: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
8a90: 28 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ();.....cackey_p
8aa0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  csc_connect();..
8ab0: 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
8ac0: 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
8ad0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
8ae0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
8af0: 73 6c 6f 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69  slot));...}....i
8b00: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8b10: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
8b20: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
8b30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8b40: 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61  Connection to ca
8b50: 72 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rd failed, retur
8b60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
8b70: 28 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  (SCardConnect() 
8b80: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
8b90: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
8ba0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
8bb0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28  ard_conn_ret), (
8bc0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e  long) scard_conn
8bd0: 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  _ret);.....retur
8be0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8bf0: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
8c00: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
8c10: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a  _connected = 1;.
8c20: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8c30: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
8c40: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8c50: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8c60: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f  = 0;...slot->pro
8c70: 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c  tocol = protocol
8c80: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
8c90: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
8ca0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
8cb0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
8cc0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8cd0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8ce0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8cf0: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
8d00: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8d10: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8d20: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
8d30: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
8d40: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8d50: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
8d60: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
8d70: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
8d80: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
8d90: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
8da0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
8db0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
8dc0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
8dd0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
8de0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
8df0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
8e00: 68 6f 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61  hould be termina
8e10: 74 65 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65  ted using "cacke
8e20: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8e30: 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  n". *. */.static
8e40: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
8e50: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
8e60: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8e70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
8e80: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  ..cackey_ret cac
8e90: 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c  key_conn_ret;..L
8ea0: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
8eb0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8ec0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8ed0: 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ed.");...cackey_
8ee0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
8ef0: 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
8f00: 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65  lot);..if (cacke
8f10: 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41  y_conn_ret != CA
8f20: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
8f30: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8f40: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
8f50: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
8f60: 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
8f70: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
8f80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8f90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8fa0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8fb0: 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66  on_depth++;...if
8fc0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8fd0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26  ion_depth > 1 &&
8fe0: 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   !slot->transact
8ff0: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
9000: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9010: 55 47 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61  UG_PRINTF("Alrea
9020: 64 79 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74  dy in a transact
9030: 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20  ion, performing 
9040: 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64  no action (new d
9050: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
9060: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9070: 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e  epth);....return
9080: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
9090: 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  K);..}...slot->t
90a0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
90b0: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73  hw_lock = 0;...s
90c0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d  card_trans_ret =
90d0: 20 53 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73   SCardBeginTrans
90e0: 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73  action(slot->pcs
90f0: 63 5f 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63  c_card);..if (sc
9100: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d  ard_trans_ret !=
9110: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
9120: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9130: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
9140: 65 20 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73  e to begin trans
9150: 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e  action, returnin
9160: 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09  g in error");...
9170: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9180: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9190: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
91a0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
91b0: 66 75 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e  fully began tran
91c0: 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20  saction on slot 
91d0: 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73  (%s)", slot->pcs
91e0: 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74  c_reader);...ret
91f0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9200: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
9210: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
9220: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9230: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
9240: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
9250: 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a  slot *slot);. *.
9260: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
9270: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
9280: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9290: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
92a0: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
92b0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
92c0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
92d0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
92e0: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
92f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9300: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
9310: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
9320: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
9330: 6e 20 72 65 71 75 69 72 65 73 20 22 63 61 63 6b  n requires "cack
9340: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
9350: 74 69 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c  tion" to be call
9360: 65 64 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a  ed first. *. */.
9370: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
9380: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
9390: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
93a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
93b0: 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  t) {..LONG scard
93c0: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
93d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
93e0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
93f0: 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f  if (!slot->pcsc_
9400: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
9410: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9420: 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
9430: 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20   not connected, 
9440: 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  unable to end tr
9450: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72  ansaction on car
9460: 64 22 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74  d");....if (slot
9470: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9480: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41  pth > 0) {....CA
9490: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
94a0: 46 28 22 44 65 63 72 65 61 73 69 6e 67 20 74 72  F("Decreasing tr
94b0: 61 6e 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20  ansaction depth 
94c0: 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61  and asking for a
94d0: 20 68 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f   hardware lock o
94e0: 6e 20 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e  n the next begin
94f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75   transaction (cu
9500: 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69  rrent depth = %i
9510: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
9520: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
9530: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
9540: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09  ion_depth--;....
9550: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
9560: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
9570: 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72  ) {.....slot->tr
9580: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
9590: 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d  w_lock = 1;....}
95a0: 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
95b0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
95c0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ERIC);..}...if (
95d0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
95e0: 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a  n_depth == 0) {.
95f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9600: 52 49 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69  RINTF("Terminati
9610: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
9620: 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65   that has not be
9630: 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72  gun!");....retur
9640: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9650: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73  GENERIC);..}...s
9660: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
9670: 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28  _depth--;...if (
9680: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
9690: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
96a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
96b0: 49 4e 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f  INTF("Transactio
96c0: 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67  ns still in prog
96d0: 72 65 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e  ress, not termin
96e0: 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72  ating on-card Tr
96f0: 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65  ansaction (curre
9700: 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  nt depth = %i)",
9710: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
9720: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65  on_depth);....re
9730: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9740: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
9750: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53  rd_trans_ret = S
9760: 43 61 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69  CardEndTransacti
9770: 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  on(slot->pcsc_ca
9780: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
9790: 43 41 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72  CARD);..if (scar
97a0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53  d_trans_ret != S
97b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
97c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
97d0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
97e0: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
97f0: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
9800: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
9810: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9820: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9830: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9840: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
9850: 79 20 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61  y terminated tra
9860: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74  nsaction on slot
9870: 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63   (%s)", slot->pc
9880: 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65  sc_reader);...re
9890: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
98a0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50  _S_OK);.}../* AP
98b0: 44 55 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  DU Related Funct
98c0: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
98d0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
98e0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
98f0: 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74  send_apdu(struct
9900: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9910: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
9920: 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65  r class, unsigne
9930: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
9940: 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  on, unsigned cha
9950: 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p1, unsigned c
9960: 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64  har p2, unsigned
9970: 20 63 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e   char lc, unsign
9980: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c  nsigned char le,
99a0: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
99b0: 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ode, unsigned ch
99c0: 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69  ar *respdata, si
99d0: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
99e0: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
99f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
9a00: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
9a10: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
9a20: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
9a30: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
9a40: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a  gned char class.
9a50: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9a60: 43 6c 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41  Class (GSCIS_CLA
9a70: 53 53 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53  SS_ISO7816 or GS
9a80: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
9a90: 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20  _PLATFORM. *    
9aa0: 20 20 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28       usually), (
9ab0: 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  CLA). *. *     u
9ac0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
9ad0: 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20  truction. *     
9ae0: 20 20 20 20 41 50 44 55 20 49 6e 73 74 72 75 63      APDU Instruc
9af0: 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a  tion (INS). *. *
9b00: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9b10: 61 72 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20  ar p1. *        
9b20: 20 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20   APDU Parameter 
9b30: 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20  1 (P1). *. *    
9b40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9b50: 32 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  2. *         APD
9b60: 55 20 50 61 72 61 6d 65 74 65 72 20 32 20 28 50  U Parameter 2 (P
9b70: 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  2). *. *     uns
9b80: 69 67 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a  igned char lc. *
9b90: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65           APDU Le
9ba0: 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20  ngth of Content 
9bb0: 28 4c 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20  (Lc) -- this is 
9bc0: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64  the length of "d
9bd0: 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20  ata". *         
9be0: 70 61 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22  parameter.  If "
9bf0: 64 61 74 61 22 20 69 73 20 73 70 65 63 69 66 69  data" is specifi
9c00: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73  ed as NULL, this
9c10: 20 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a   parameter will.
9c20: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 69 67   *         be ig
9c30: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
9c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9c50: 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20  data. *         
9c60: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
9c70: 72 20 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73  r to send.  It s
9c80: 68 6f 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79  hould be "Lc" by
9c90: 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a  tes long.  If. *
9ca0: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
9cb0: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22  ed as NULL, "Lc"
9cc0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e   will not be sen
9cd0: 74 2c 20 61 6e 64 20 74 68 69 73 20 62 75 66 66  t, and this buff
9ce0: 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20  er will be. *   
9cf0: 20 20 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20        ignored.. 
9d00: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9d10: 64 20 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20  d char le. *    
9d20: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
9d30: 20 6f 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20   of Expectation 
9d40: 28 4c 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20  (Le) -- this is 
9d50: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
9d60: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 65 78 70  e. *         exp
9d70: 65 63 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66  ected reply.  If
9d80: 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69   this is specifi
9d90: 65 64 20 61 73 20 30 20 74 68 65 6e 20 69 74 20  ed as 0 then it 
9da0: 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20  will not. *     
9db0: 20 20 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a      be sent.. *.
9dc0: 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20   *     uint16_t 
9dd0: 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20  *respcode. *    
9de0: 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74       [OUT] Point
9df0: 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66  er to storage of
9e00: 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63   APDU response c
9e10: 6f 64 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  ode.  If this is
9e20: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
9e30: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
9e40: 68 65 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65  he response code
9e50: 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64   will be discard
9e60: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
9e70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
9e80: 70 64 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20  pdata. *        
9e90: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
9ea0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
9eb0: 55 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e  U response data.
9ec0: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
9ed0: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
9ee0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
9ef0: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c  esponse data wil
9f00: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 20  l be discarded. 
9f10: 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74   If. *         t
9f20: 68 65 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e  he "respdata_len
9f30: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 73  " parameter is s
9f40: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9f50: 2c 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a  , this buffer. *
9f60: 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f           will no
9f70: 74 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a  t be updated.. *
9f80: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a  . *     size_t *
9f90: 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20  respdata_len. * 
9fa0: 20 20 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54          [IN, OUT
9fb0: 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61  ] Pointer initia
9fc0: 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ling containing 
9fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9fe0: 22 72 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20  "respdata". *   
9ff0: 20 20 20 20 20 20 62 75 66 66 65 72 2e 20 20 42        buffer.  B
a000: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
a010: 20 74 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20   the pointed to 
a020: 76 61 6c 75 65 20 69 73 20 75 70 64 61 74 65 64  value is updated
a030: 20 74 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20   to the. *      
a040: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74     number of byt
a050: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
a060: 65 20 62 75 66 66 65 72 2e 20 20 49 66 20 74 68  e buffer.  If th
a070: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20  is is specified 
a080: 61 73 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55  as. *         NU
a090: 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  LL, it will not 
a0a0: 62 65 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20  be updated, and 
a0b0: 22 72 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20  "respdata" will 
a0c0: 62 65 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69  be ignored causi
a0d0: 6e 67 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68  ng. *         th
a0e0: 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20  e response data 
a0f0: 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  to be discarded.
a100: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
a110: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
a120: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
a130: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
a140: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
a150: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
a160: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20     On error. *  
a170: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
a180: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66  _TOKENABSENT  If
a190: 20 74 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69   the sending fai
a1a0: 6c 65 64 20 62 65 63 61 75 73 65 20 74 68 65 20  led because the 
a1b0: 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20  token is. *     
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 20 20 20 20 20 20 61 62 73 65 6e             absen
a1e0: 74 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  t. *     CACKEY_
a1f0: 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20 20  PCSC_E_RETRY    
a200: 20 20 20 20 49 66 20 73 6f 6d 65 74 68 69 6e 67      If something
a210: 20 74 68 61 74 20 6c 6f 6f 6b 73 20 72 65 74 72   that looks retr
a220: 79 27 61 62 6c 65 20 77 65 6e 74 0a 20 2a 20 20  y'able went. *  
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72                wr
a250: 6f 6e 67 20 2d 2d 20 74 72 79 20 74 68 65 20 77  ong -- try the w
a260: 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
a270: 20 6f 76 65 72 0a 20 2a 20 20 20 20 20 20 20 20   over. *        
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 20 20 61 67 61 69 6e 0a 20 2a          again. *
a2a0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
a2b0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
a2c0: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
a2d0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
a2e0: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a  ion Manager via.
a2f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63   *     cackey_pc
a300: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20  sc_connect() if 
a310: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  needed.. *. *   
a320: 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63    It will connec
a330: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e  t to the card in
a340: 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61   the reader atta
a350: 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74  ched to the slot
a360: 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65  . *     specifie
a370: 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f  d.  It will reco
a380: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72  nnect to the car
a390: 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  d if the connect
a3a0: 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20  ion. *     goes 
a3b0: 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  away.. *. */.sta
a3c0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
a3d0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
a3e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
a3f0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
a400: 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75  ed char class, u
a410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
a420: 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e  truction, unsign
a430: 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69  ed char p1, unsi
a440: 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e  gned char p2, un
a450: 73 69 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75  signed int lc, u
a460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a470: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ta, unsigned int
a480: 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72   le, uint16_t *r
a490: 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65  espcode, unsigne
a4a0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
a4b0: 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61  , size_t *respda
a4c0: 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38  ta_len) {..uint8
a4d0: 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e  _t major_rc, min
a4e0: 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62  or_rc;..size_t b
a4f0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d  ytes_to_copy, tm
a500: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a  p_respdata_len;.
a510: 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45 51  .LPCSCARD_IO_REQ
a520: 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69 3b  UEST pioSendPci;
a530: 0a 09 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45  ..SCARD_IO_REQUE
a540: 53 54 20 70 69 6f 52 65 63 76 50 63 69 3b 0a 09  ST pioRecvPci;..
a550: 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20  DWORD xmit_len, 
a560: 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  recv_len;..LONG 
a570: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20  scard_xmit_ret, 
a580: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
a590: 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66  ;..BYTE xmit_buf
a5a0: 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66  [1024], recv_buf
a5b0: 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73  [1024];..int pcs
a5c0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70  c_connect_ret, p
a5d0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b  csc_getresp_ret;
a5e0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
a5f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a600: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
a610: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
a620: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a630: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
a640: 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09  specified.");...
a650: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a660: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
a670: 09 7d 0a 0a 09 69 66 20 28 72 65 73 70 63 6f 64  .}...if (respcod
a680: 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65  e) {...*respcode
a690: 20 3d 20 30 78 66 66 66 66 3b 0a 09 7d 0a 0a 09   = 0xffff;..}...
a6a0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
a6b0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
a6c0: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
a6d0: 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
a6e0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
a6f0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
a700: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a710: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
a720: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
a730: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
a740: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
a750: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
a760: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  ERIC);..}.../* D
a770: 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70  etermine which p
a780: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
a790: 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68  using */..switch
a7a0: 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c   (slot->protocol
a7b0: 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ) {...case SCARD
a7c0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09  _PROTOCOL_T0:...
a7d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a7e0: 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74  INTF("Protocol t
a7f0: 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20  o send datagram 
a800: 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69  is T=0");.....pi
a810: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
a820: 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65  _PCI_T0;.....bre
a830: 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ak;...case SCARD
a840: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09  _PROTOCOL_T1:...
a850: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a860: 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74  INTF("Protocol t
a870: 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20  o send datagram 
a880: 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69  is T=1");.....pi
a890: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
a8a0: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65  _PCI_T1;.....bre
a8b0: 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09  ak;...default:..
a8c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a8d0: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70  RINTF("Invalid p
a8e0: 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61  rotocol found, a
a8f0: 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  borting.");.....
a900: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
a910: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
a920: 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20  }.../* Transmit 
a930: 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30  */..xmit_len = 0
a940: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ;..xmit_buf[xmit
a950: 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b  _len++] = class;
a960: 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a970: 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63  len++] = instruc
a980: 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  tion;..xmit_buf[
a990: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31  xmit_len++] = p1
a9a0: 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ;..xmit_buf[xmit
a9b0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69  _len++] = p2;..i
a9c0: 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20  f (data) {...if 
a9d0: 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09  (lc > 255) {....
a9e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a9f0: 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55  NTF("CAUTION!  U
aa00: 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74  sing an Lc great
aa10: 65 72 20 74 68 61 6e 20 32 35 35 20 69 73 20 75  er than 255 is u
aa20: 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25  ntested.  Lc = %
aa30: 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69  u", lc);.....xmi
aa40: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
aa50: 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58  ] = 0x82; /* XXX
aa60: 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09   UNTESTED */....
aa70: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
aa80: 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66  n++] = (lc & 0xf
aa90: 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d  f00) >> 8;....xm
aaa0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
aab0: 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a  +] = lc & 0xff;.
aac0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d  ..} else {....xm
aad0: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
aae0: 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66  +] = lc;...}...f
aaf0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
ab00: 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a   < lc; idx++) {.
ab10: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
ab20: 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69  _len++] = data[i
ab30: 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  dx];...}..}...if
ab40: 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a   (le != 0x00) {.
ab50: 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20  ..if (le > 256) 
ab60: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
ab70: 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f  G_PRINTF("CAUTIO
ab80: 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20  N!  Using an Le 
ab90: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 36  greater than 256
aba0: 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c   is untested.  L
abb0: 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09  e = %u", le);...
abc0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
abd0: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f  len++] = 0x82; /
abe0: 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a  * XXX UNTESTED *
abf0: 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  /....xmit_buf[xm
ac00: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20  it_len++] = (le 
ac10: 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
ac20: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
ac30: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30  _len++] = le & 0
ac40: 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  xff;...} else if
ac50: 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09   (le == 256) {..
ac60: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
ac70: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09  len++] = 0x00;..
ac80: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69  .} else {....xmi
ac90: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
aca0: 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a  ] = le;...}..}..
acb0: 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63  ./* Begin Smartc
acc0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
acd0: 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
ace0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
acf0: 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20  t);...if (class 
ad00: 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  == GSCIS_CLASS_I
ad10: 53 4f 37 38 31 36 20 26 26 20 28 69 6e 73 74 72  SO7816 && (instr
ad20: 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f  uction == GSCIS_
ad30: 49 4e 53 54 52 5f 56 45 52 49 46 59 20 7c 7c 20  INSTR_VERIFY || 
ad40: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
ad50: 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47  SCIS_INSTR_CHANG
ad60: 45 5f 52 45 46 45 52 45 4e 43 45 29 20 26 26 20  E_REFERENCE) && 
ad70: 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  p1 == 0x00) {...
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 53 65 6e 64 69 6e 67 20 41 50 44  NTF("Sending APD
ada0: 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22  U: <<censored>>"
adb0: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43  );..} else {...C
adc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
add0: 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50  TBUF("Sending AP
ade0: 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20  DU:", xmit_buf, 
adf0: 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  xmit_len);..}...
ae00: 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  recv_len = sizeo
ae10: 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 6d 65  f(recv_buf);..me
ae20: 6d 63 70 79 28 26 70 69 6f 52 65 63 76 50 63 69  mcpy(&pioRecvPci
ae30: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 73 69  , pioSendPci, si
ae40: 7a 65 6f 66 28 70 69 6f 52 65 63 76 50 63 69 29  zeof(pioRecvPci)
ae50: 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  );..scard_xmit_r
ae60: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
ae70: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
ae80: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
ae90: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
aea0: 65 6e 2c 20 26 70 69 6f 52 65 63 76 50 63 69 2c  en, &pioRecvPci,
aeb0: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
aec0: 5f 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  _len);...CACKEY_
aed0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
aee0: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 63 6f  ardTransmit() co
aef0: 6d 70 6c 65 74 65 64 20 77 69 74 68 20 76 61 6c  mpleted with val
af00: 75 65 3a 20 25 73 2f 25 6c 78 22 2c 20 43 41 43  ue: %s/%lx", CAC
af10: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
af20: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
af30: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
af40: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
af50: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
af60: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
af70: 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  t_ret == SCARD_E
af80: 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 29  _NOT_TRANSACTED)
af90: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
afa0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
afb0: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f   to send APDU to
afc0: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
afd0: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
afe0: 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69  , will ask calli
aff0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  ng function to r
b000: 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74 74  etry (not resett
b010: 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43  ing card)...", C
b020: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
b030: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
b040: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
b050: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b060: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
b070: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
b080: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b090: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
b0a0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b0b0: 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  lot);....cackey_
b0c0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
b0d0: 6c 6f 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74 6f  lot, slot->proto
b0e0: 63 6f 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  col);....return(
b0f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
b100: 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  TRY);..}...if (s
b110: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
b120: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56   SCARD_E_NO_SERV
b130: 49 43 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ICE) {...CACKEY_
b140: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
b150: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
b160: 55 20 74 6f 20 63 61 72 64 2c 20 70 6f 73 73 69  U to card, possi
b170: 62 6c 79 20 64 75 65 20 74 6f 20 50 43 2f 53 43  bly due to PC/SC
b180: 20 68 61 6e 64 6c 65 20 62 65 69 6e 67 20 69 6e   handle being in
b190: 76 61 6c 69 64 20 28 53 43 61 72 64 54 72 61 6e  valid (SCardTran
b1a0: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
b1b0: 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69  , will ask calli
b1c0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  ng function to r
b1d0: 65 74 72 79 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  etry...", CACKEY
b1e0: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
b1f0: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
b200: 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e  d_xmit_ret), (un
b210: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61  signed long) sca
b220: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
b230: 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
b240: 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
b250: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
b260: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
b270: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
b280: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
b290: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
b2a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b2b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
b2c0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
b2d0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
b2e0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
b2f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
b300: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
b310: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
b320: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b330: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
b340: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b350: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
b360: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
b370: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
b380: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
b390: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
b3a0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b3b0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
b3c0: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
b3d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b3e0: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
b3f0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
b400: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
b410: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
b420: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
b430: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
b440: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
b450: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
b460: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
b470: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
b480: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
b490: 0a 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f  .....switch (slo
b4a0: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  t->protocol) {..
b4b0: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
b4c0: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09  ROTOCOL_T0:.....
b4d0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
b4e0: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
b4f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
b500: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
b510: 43 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69  COL_T1:.......pi
b520: 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44  oSendPci = SCARD
b530: 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09  _PCI_T1;........
b540: 62 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61  break;......defa
b550: 75 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45  ult:.......CACKE
b560: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b570: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
b580: 20 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20   found, but too 
b590: 6c 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68  late to do anyth
b5a0: 69 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77  ing about it now
b5b0: 20 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61   -- trying anywa
b5c0: 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65  y.");........bre
b5d0: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
b5e0: 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
b5f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
b600: 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
b610: 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
b620: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
b630: 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
b640: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b650: 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
b660: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
b670: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
b680: 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
b690: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
b6a0: 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
b6b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b6c0: 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
b6d0: 65 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d  essful, retransm
b6e0: 69 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72  itting");......r
b6f0: 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  ecv_len = sizeof
b700: 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09  (recv_buf);.....
b710: 6d 65 6d 63 70 79 28 26 70 69 6f 52 65 63 76 50  memcpy(&pioRecvP
b720: 63 69 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  ci, pioSendPci, 
b730: 73 69 7a 65 6f 66 28 70 69 6f 52 65 63 76 50 63  sizeof(pioRecvPc
b740: 69 29 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78  i));.....scard_x
b750: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
b760: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
b770: 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64  sc_card, pioSend
b780: 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  Pci, xmit_buf, x
b790: 6d 69 74 5f 6c 65 6e 2c 20 26 70 69 6f 52 65 63  mit_len, &pioRec
b7a0: 76 50 63 69 2c 20 72 65 63 76 5f 62 75 66 2c 20  vPci, recv_buf, 
b7b0: 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09  &recv_len);.....
b7c0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
b7d0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
b7e0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43  UCCESS) {......C
b7f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b800: 54 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66  TF("Retransmit f
b810: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
b820: 20 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65   in failure afte
b830: 72 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  r disconnecting 
b840: 74 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54  the card (SCardT
b850: 72 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69  ransmit = %s/%li
b860: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
b870: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
b880: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
b890: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
b8a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
b8b0: 09 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b8c0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b8d0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b8e0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c  E_CARD);......sl
b8f0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b900: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b910: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b920: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b930: 2a 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  */......slot->tr
b940: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b950: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
b960: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
b970: 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65  (slot);.......re
b980: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b990: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b9a0: 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
b9b0: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
b9c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63  BUG_PRINTF("Disc
b9d0: 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29  onnecting card")
b9e0: 3b 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63  ;......SCardDisc
b9f0: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
ba00: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
ba10: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73  AVE_CARD);.....s
ba20: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
ba30: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
ba40: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
ba50: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
ba60: 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  */.....slot->tra
ba70: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
ba80: 20 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65   1;.....cackey_e
ba90: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
baa0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lot);......CACKE
bab0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bac0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
bad0: 6c 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75  lure");.....retu
bae0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
baf0: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
bb00: 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
bb10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bb20: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
bb30: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
bb40: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
bb50: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
bb60: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
bb70: 52 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63  RD);....slot->pc
bb80: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
bb90: 64 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e  d = 0;...../* En
bba0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
bbb0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c  saction */....sl
bbc0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
bbd0: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61  depth = 1;....ca
bbe0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
bbf0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
bc00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc10: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
bc20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09  n failure");....
bc30: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bc40: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
bc50: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  );...}..}...CACK
bc60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
bc70: 46 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75  F("Returned Valu
bc80: 65 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72  e:", recv_buf, r
bc90: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  ecv_len);...if (
bca0: 72 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a  recv_len < 2) {.
bcb0: 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73  ../* Minimal res
bcc0: 70 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20  ponse length is 
bcd0: 32 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69  2 bytes, returni
bce0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ng in failure */
bcf0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bd00: 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
bd10: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
bd20: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
bd30: 20 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75   (recv_len = %lu
bd40: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
bd50: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  ng) recv_len);..
bd60: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
bd70: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
bd80: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
bd90: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
bda0: 3b 0a 0a 09 09 2f 2a 20 53 75 70 70 6c 79 20 61  ;..../* Supply a
bdb0: 6e 20 69 6e 76 61 6c 69 64 20 72 65 73 70 6f 6e  n invalid respon
bdc0: 73 65 20 63 6f 64 65 20 2a 2f 0a 09 09 69 66 20  se code */...if 
bdd0: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 09  (respcode) {....
bde0: 2a 72 65 73 70 63 6f 64 65 20 3d 20 30 3b 0a 09  *respcode = 0;..
bdf0: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
be00: 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 4f 44 41 54  KEY_PCSC_E_NODAT
be10: 41 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  A);..}.../* Dete
be20: 72 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64  rmine result cod
be30: 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d  e */..major_rc =
be40: 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c   recv_buf[recv_l
be50: 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f  en - 2];..minor_
be60: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
be70: 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66  cv_len - 1];..if
be80: 20 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09   (respcode) {...
be90: 2a 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a  *respcode = (maj
bea0: 6f 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69  or_rc << 8) | mi
beb0: 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20  nor_rc;..}.../* 
bec0: 41 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62  Adjust message b
bed0: 75 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c  uffer */..recv_l
bee0: 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64  en -= 2;.../* Ad
bef0: 64 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72  d bytes to retur
bf00: 6e 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f  n value */..tmp_
bf10: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30  respdata_len = 0
bf20: 3b 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20  ;..if (respdata 
bf30: 26 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  && respdata_len)
bf40: 20 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74   {...tmp_respdat
bf50: 61 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74  a_len = *respdat
bf60: 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f  a_len;....bytes_
bf70: 74 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64  to_copy = *respd
bf80: 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28  ata_len;....if (
bf90: 72 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73  recv_len < bytes
bfa0: 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62  _to_copy) {....b
bfb0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72  ytes_to_copy = r
bfc0: 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ecv_len;...}....
bfd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bfe0: 4e 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75  NTF("Copying %lu
bff0: 20 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75   bytes to the bu
c000: 66 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75  ffer (recv'd %lu
c010: 20 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79   bytes, but only
c020: 20 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20   %lu bytes left 
c030: 69 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c  in our buffer)",
c040: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c050: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
c060: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c070: 72 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67  recv_len, (unsig
c080: 6e 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64  ned long) *respd
c090: 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d  ata_len);....mem
c0a0: 63 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65  cpy(respdata, re
c0b0: 63 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f  cv_buf, bytes_to
c0c0: 5f 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61  _copy);...respda
c0d0: 74 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63  ta += bytes_to_c
c0e0: 6f 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74  opy;....*respdat
c0f0: 61 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f  a_len = bytes_to
c100: 5f 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73  _copy;...tmp_res
c110: 70 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74  pdata_len -= byt
c120: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65  es_to_copy;..} e
c130: 6c 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76  lse {...if (recv
c140: 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
c150: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c160: 4e 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77  NTF("Throwing aw
c170: 61 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f  ay %lu bytes, no
c180: 77 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65  where to put the
c190: 6d 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  m!", (unsigned l
c1a0: 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a  ong) recv_len);.
c1b0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a  ..}..}...if (maj
c1c0: 6f 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b  or_rc == 0x61) {
c1d0: 0a 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f  .../* We need to
c1e0: 20 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45   READ */...CACKE
c1f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c200: 42 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75  Buffer read requ
c210: 69 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d  ired");....if (m
c220: 69 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29  inor_rc == 0x00)
c230: 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d   {....minor_rc =
c240: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
c250: 3b 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65  ;...}....pcsc_ge
c260: 74 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b  tresp_ret = cack
c270: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c280: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
c290: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
c2a0: 53 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45  STR_GET_RESPONSE
c2b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c  , 0x00, 0x00, 0,
c2c0: 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c   NULL, minor_rc,
c2d0: 20 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64   respcode, respd
c2e0: 61 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61  ata, &tmp_respda
c2f0: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28  ta_len);....if (
c300: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
c310: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
c320: 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
c330: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c340: 42 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c  Buffer read fail
c350: 65 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69  ed!  Returning i
c360: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
c370: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
c380: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
c390: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
c3a0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
c3b0: 3b 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67  ;.....if (pcsc_g
c3c0: 65 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41  etresp_ret == CA
c3d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
c3e0: 59 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28  Y) {.....return(
c3f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
c400: 54 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  TRY);....}.....r
c410: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c420: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
c430: 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74  }....if (respdat
c440: 61 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73  a_len) {....*res
c450: 70 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70  pdata_len += tmp
c460: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09  _respdata_len;..
c470: 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  .}..../* End Sma
c480: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
c490: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
c4a0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
c4b0: 6c 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  lot);....CACKEY_
c4c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c4d0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c4e0: 73 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20  ss (buffer read 
c4f0: 63 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72  complete)");...r
c500: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
c510: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a  C_S_OK);..}.../*
c520: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
c530: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63  ransaction */..c
c540: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
c550: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
c560: 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30  f (major_rc == 0
c570: 78 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63  x90) {.../* Succ
c580: 65 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ess */...CACKEY_
c590: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c5a0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c5b0: 73 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30  ss (major_rc = 0
c5c0: 78 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72  x90)");....retur
c5d0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
c5e0: 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  OK);..}....CACKE
c5f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c600: 41 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e  APDU Returned an
c610: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e   error, returnin
c620: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
c630: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
c640: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
c650: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
c660: 6e 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79  ned char *cackey
c670: 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
c680: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
c690: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a  buffer, size_t *
c6a0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e  buffer_len_p, un
c6b0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c  signed char tag,
c6c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c6d0: 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  outbuffer, size_
c6e0: 74 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  t *outbuffer_len
c6f0: 5f 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  _p) {..unsigned 
c700: 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a  char *buffer_p;.
c710: 09 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65  .size_t outbuffe
c720: 72 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65  r_len, buffer_le
c730: 6e 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b  n;..size_t size;
c740: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
c750: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c760: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
c770: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20  f (buffer_len_p 
c780: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
c790: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c7a0: 28 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69  ("buffer_len_p i
c7b0: 73 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69  s NULL.  Returni
c7c0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29  ng in failure.")
c7d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c7e0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62  );..}...if (outb
c7f0: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e  uffer_len_p == N
c800: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
c810: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75  DEBUG_PRINTF("ou
c820: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  tbuffer_len_p is
c830: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
c840: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
c850: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
c860: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65  ;..}...buffer_le
c870: 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c  n = *outbuffer_l
c880: 65 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72  en_p;..outbuffer
c890: 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65  _len = *outbuffe
c8a0: 72 5f 6c 65 6e 5f 70 3b 0a 0a 09 69 66 20 28 62  r_len_p;...if (b
c8b0: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
c8c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c8d0: 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f 6c  PRINTF("buffer_l
c8e0: 65 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  en is less than 
c8f0: 32 2c 20 73 6f 20 77 65 20 63 61 6e 27 74 20 72  2, so we can't r
c900: 65 61 64 20 61 6e 79 20 74 61 67 2e 20 20 52 65  ead any tag.  Re
c910: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c920: 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  re.");....return
c930: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
c940: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c950: 09 69 66 20 28 62 75 66 66 65 72 5f 70 5b 30 5d  .if (buffer_p[0]
c960: 20 21 3d 20 74 61 67 29 20 7b 0a 09 09 43 41 43   != tag) {...CAC
c970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c980: 28 22 54 61 67 20 66 6f 75 6e 64 20 77 61 73 20  ("Tag found was 
c990: 6e 6f 74 20 74 61 67 20 65 78 70 65 63 74 65 64  not tag expected
c9a0: 2e 20 20 54 61 67 20 3d 20 25 30 32 78 2c 20 45  .  Tag = %02x, E
c9b0: 78 70 65 63 74 65 64 20 3d 20 25 30 32 78 2e 20  xpected = %02x. 
c9c0: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
c9d0: 69 6c 75 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e  ilure.", (unsign
c9e0: 65 64 20 69 6e 74 29 20 62 75 66 66 65 72 5f 70  ed int) buffer_p
c9f0: 5b 30 5d 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65  [0], tag);....re
ca00: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
ca10: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
ca20: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
ca30: 20 28 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26   ((buffer_p[0] &
ca40: 20 30 78 38 30 29 20 3d 3d 20 30 78 38 30 29 20   0x80) == 0x80) 
ca50: 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09  {...size = 0;...
ca60: 69 64 78 20 3d 20 28 62 75 66 66 65 72 5f 70 5b  idx = (buffer_p[
ca70: 30 5d 20 26 20 30 78 37 66 29 3b 0a 0a 09 09 69  0] & 0x7f);....i
ca80: 66 20 28 69 64 78 20 3e 20 62 75 66 66 65 72 5f  f (idx > buffer_
ca90: 6c 65 6e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  len) {....CACKEY
caa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
cab0: 61 6c 66 6f 72 6d 65 64 20 42 45 52 20 76 61 6c  alformed BER val
cac0: 75 65 20 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68  ue -- not enough
cad0: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
cae0: 20 74 6f 20 72 65 61 64 20 6c 65 6e 67 74 68 20   to read length 
caf0: 28 69 64 78 20 3d 20 25 69 2c 20 62 75 66 66 65  (idx = %i, buffe
cb00: 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69  r_len = %lu)", i
cb10: 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  dx, (unsigned lo
cb20: 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b  ng) buffer_len);
cb30: 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
cb40: 29 3b 0a 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b  );...}....for (;
cb50: 20 69 64 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29   idx > 0; idx--)
cb60: 20 7b 0a 09 09 09 62 75 66 66 65 72 5f 70 2b 2b   {....buffer_p++
cb70: 3b 0a 09 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ;....buffer_len-
cb80: 2d 3b 0a 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20  -;.....size <<= 
cb90: 38 3b 0a 09 09 09 73 69 7a 65 20 7c 3d 20 62 75  8;....size |= bu
cba0: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09  ffer_p[0];...}..
cbb0: 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20  } else {...size 
cbc0: 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09  = buffer_p[0];..
cbd0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a  }...buffer_p++;.
cbe0: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
cbf0: 09 69 66 20 28 73 69 7a 65 20 3e 20 6f 75 74 62  .if (size > outb
cc00: 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43  uffer_len) {...C
cc10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cc20: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
cc30: 70 79 20 76 61 6c 75 65 20 62 75 66 66 65 72 20  py value buffer 
cc40: 74 6f 20 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f  to outbuffer, no
cc50: 74 20 65 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20  t enough room.  
cc60: 56 61 6c 75 65 20 62 75 66 66 65 72 20 6c 65 6e  Value buffer len
cc70: 67 74 68 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62  gth = %lu, out b
cc80: 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25  uffer length = %
cc90: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
cca0: 6f 6e 67 29 20 73 69 7a 65 2c 20 28 75 6e 73 69  ong) size, (unsi
ccb0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
ccc0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
ccd0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
cce0: 09 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f  .*outbuffer_len_
ccf0: 70 20 3d 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f  p = size;..if (o
cd00: 75 74 62 75 66 66 65 72 29 20 7b 0a 09 09 6d 65  utbuffer) {...me
cd10: 6d 63 70 79 28 6f 75 74 62 75 66 66 65 72 2c 20  mcpy(outbuffer, 
cd20: 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b  buffer_p, size);
cd30: 0a 09 09 62 75 66 66 65 72 5f 70 20 2b 3d 20 73  ...buffer_p += s
cd40: 69 7a 65 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65  ize;...buffer_le
cd50: 6e 20 2d 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62  n -= size;....*b
cd60: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75  uffer_len_p = bu
cd70: 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43  ffer_len;....CAC
cd80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
cd90: 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75  UF("BER-TLV resu
cda0: 6c 74 73 3a 22 2c 20 6f 75 74 62 75 66 66 65 72  lts:", outbuffer
cdb0: 2c 20 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65  , size);..} else
cdc0: 20 7b 0a 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66   {...memmove(buf
cdd0: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
cde0: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
cdf0: 20 3d 20 62 75 66 66 65 72 3b 0a 0a 09 09 43 41   = buffer;....CA
ce00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ce10: 42 55 46 28 22 42 45 52 2d 54 4c 56 20 72 65 73  BUF("BER-TLV res
ce20: 75 6c 74 73 3a 22 2c 20 62 75 66 66 65 72 2c 20  ults:", buffer, 
ce30: 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  size);..}...CACK
ce40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ce50: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
ce60: 63 63 65 73 73 2e 20 20 53 69 7a 65 20 6f 66 20  ccess.  Size of 
ce70: 63 6f 6e 74 65 6e 74 73 20 66 6f 72 20 74 61 67  contents for tag
ce80: 20 25 30 32 78 20 69 73 20 25 6c 75 22 2c 20 28   %02x is %lu", (
ce90: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61  unsigned int) ta
cea0: 67 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  g, (unsigned lon
ceb0: 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75  g) size);...retu
cec0: 72 6e 28 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a  rn(buffer_p);.}.
ced0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
cee0: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
cef0: 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73  ackey_get_data(s
cf00: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cf10: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
cf20: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
cf30: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
cf40: 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n, unsigned char
cf50: 20 6f 69 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20   oid[3]);. *. * 
cf60: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
cf70: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
cf80: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
cf90: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
cfa0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
cfb0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
cfc0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
cfd0: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
cfe0: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
cff0: 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65  size_t buffer_le
d000: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  n. *         Num
d010: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
d020: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
d030: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
d040: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20  ed char oid[3]. 
d050: 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74 65  *         3-byte
d060: 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a   OID to read. *.
d070: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
d080: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
d090: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
d0a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
d0b0: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
d0c0: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
d0d0: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
d0e0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
d0f0: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
d100: 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
d110: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d120: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d130: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
d140: 2c 20 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  , size_t buffer_
d150: 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
d160: 61 72 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e  ar oid[3]) {..un
d170: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b  signed char cmd[
d180: 5d 20 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c  ] = {0x5C, 0x03,
d190: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d1a0: 30 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  0};..unsigned ch
d1b0: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
d1c0: 69 7a 65 5f 74 20 69 6e 69 74 5f 62 75 66 66 65  ize_t init_buffe
d1d0: 72 5f 6c 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69  r_len, size;..ui
d1e0: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
d1f0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d200: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d210: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 77 69  RINTF("Called wi
d220: 74 68 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20  th buffer_len = 
d230: 25 6c 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  %llu", (unsigned
d240: 20 6c 6f 6e 67 20 6c 6f 6e 67 29 20 62 75 66 66   long long) buff
d250: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 6e 69 74 5f  er_len);...init_
d260: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66  buffer_len = buf
d270: 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32  fer_len;...cmd[2
d280: 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64  ] = oid[0];..cmd
d290: 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63  [3] = oid[1];..c
d2a0: 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a  md[4] = oid[2];.
d2b0: 0a 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69  ../* 256 to indi
d2c0: 63 61 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  cate the largest
d2d0: 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d   message size --
d2e0: 20 6e 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68   not clear if th
d2f0: 69 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74  is will work wit
d300: 68 20 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a  h all messages *
d310: 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
d320: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
d330: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
d340: 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50  _ISO7816, NISTSP
d350: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
d360: 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30  ET_DATA, 0x3F, 0
d370: 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xFF, sizeof(cmd)
d380: 2c 20 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73  , cmd, 256, &res
d390: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26  pcode, buffer, &
d3a0: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69  buffer_len);...i
d3b0: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
d3c0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
d3d0: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  RY) {...CACKEY_D
d3e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
d3f0: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
d400: 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20  , retrying read 
d410: 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74  buffer");....ret
d420: 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64  urn(cackey_get_d
d430: 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72  ata(slot, buffer
d440: 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65  , init_buffer_le
d450: 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69  n, oid));..}...i
d460: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
d470: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d480: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d490: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
d4a0: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
d4b0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
d4c0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
d4d0: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
d4e0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
d4f0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
d500: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d510: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e  ..if (buffer_len
d520: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
d530: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
d540: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
d550: 61 64 20 62 79 74 65 73 20 28 62 75 66 66 65 72  ad bytes (buffer
d560: 5f 6c 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61  _len) exceeds ma
d570: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
d580: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d590: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62  e. (max = %li, b
d5a0: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29  uffer_len = %lu)
d5b0: 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
d5c0: 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
d5d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66  igned long) buff
d5e0: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  er_len);....retu
d5f0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
d600: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  dif.#endif...if 
d610: 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29  (buffer_len < 2)
d620: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d630: 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47  G_PRINTF("APDU G
d640: 45 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64  ET DATA returned
d650: 20 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63   %lu bytes, whic
d660: 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66  h is too short f
d670: 6f 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73  or a BER-TLV res
d680: 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65  ponse", (unsigne
d690: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c  d long) buffer_l
d6a0: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  en);....return(-
d6b0: 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20  1);..}...size = 
d6c0: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 3b  init_buffer_len;
d6d0: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63  ..buffer_p = cac
d6e0: 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
d6f0: 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66  tag(buffer, &buf
d700: 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e  fer_len, 0x53, N
d710: 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69  ULL, &size);...i
d720: 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e  f (buffer_p == N
d730: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
d740: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
d750: 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c 65  g decoding faile
d760: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
d770: 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74  error.");....ret
d780: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41  urn(-1);..}...CA
d790: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d7a0: 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65  BUF("GET DATA re
d7b0: 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73  sult", buffer, s
d7c0: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
d7d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
d7e0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
d7f0: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
d800: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
d810: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
d820: 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  urn(size);.}../*
d830: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d840: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
d850: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
d860: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d870: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
d880: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
d890: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
d8a0: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
d8b0: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
d8c0: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
d8d0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
d8e0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
d8f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
d900: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
d910: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
d920: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
d930: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
d940: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
d950: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
d960: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
d970: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
d980: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
d990: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
d9a0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
d9b0: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
d9c0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
d9d0: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
d9e0: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
d9f0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
da00: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
da10: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
da20: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
da30: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
da40: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
da50: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
da60: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
da70: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
da80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
da90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
daa0: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
dab0: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
dac0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
dad0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
dae0: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
daf0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
db00: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
db10: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
db20: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
db30: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
db40: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
db50: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
db60: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69  _offset) {..unsi
db70: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f  gned char *init_
db80: 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20  buffer;..size_t 
db90: 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a  init_count;..siz
dba0: 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  e_t init_initial
dbb0: 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f  _offset;...size_
dbc0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
dbd0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
dbe0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
dbf0: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
dc00: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
dc10: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
dc20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dc30: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
dc40: 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d  ...init_buffer =
dc50: 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63   buffer;..init_c
dc60: 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69  ount = count;..i
dc70: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
dc80: 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66  et = initial_off
dc90: 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  set;...max_offse
dca0: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
dcb0: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
dcc0: 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74  PDU_MTU;...if (t
dcd0: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
dce0: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
dcf0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dd00: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
dd10: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
dd20: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
dd30: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
dd40: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
dd50: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
dd60: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
dd70: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
dd80: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
dd90: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
dda0: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
ddb0: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
ddc0: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
ddd0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
dde0: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
ddf0: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
de00: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
de10: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
de20: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
de30: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
de40: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
de50: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
de60: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
de70: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
de80: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
de90: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
dea0: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
deb0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
dec0: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
ded0: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
dee0: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
def0: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
df00: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
df10: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
df20: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
df30: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
df40: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
df50: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41  E_RETRY) {....CA
df60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
df70: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
df80: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
df90: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
dfa0: 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
dfb0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
dfc0: 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c  ot, init_buffer,
dfd0: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f   init_count, t_o
dfe0: 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61  r_v, init_initia
dff0: 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a  l_offset));...}.
e000: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
e010: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
e020: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
e030: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
e040: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
e050: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
e060: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
e070: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
e080: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
e090: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
e0a0: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
e0b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
e0c0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
e0d0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
e0e0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
e0f0: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
e100: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
e110: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
e120: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
e130: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
e140: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
e150: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
e160: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
e170: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
e180: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
e190: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
e1a0: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
e1b0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
e1c0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
e1d0: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
e1e0: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
e1f0: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
e200: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
e210: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
e220: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
e230: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
e240: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
e250: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
e260: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
e270: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
e280: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
e290: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
e2a0: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
e2b0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e2c0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
e2d0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
e2e0: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
e2f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
e300: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
e310: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
e320: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
e330: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
e340: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
e350: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
e360: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
e370: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
e380: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
e390: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
e3a0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
e3b0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
e3c0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
e3d0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
e3e0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
e3f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
e400: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
e410: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
e420: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
e430: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
e440: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
e450: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
e460: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
e470: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
e480: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
e490: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e4a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
e4b0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
e4c0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
e4d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
e4e0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
e4f0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
e500: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
e510: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
e520: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
e530: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
e540: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
e550: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
e560: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
e570: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
e580: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
e590: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
e5a0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
e5b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
e5c0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
e5d0: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
e5e0: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
e5f0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
e600: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
e610: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
e620: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
e630: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
e640: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
e650: 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  0, aid_len, aid,
e660: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
e670: 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
e680: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
e690: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
e6a0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e6b0: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
e6c0: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
e6d0: 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61  etrying select a
e6e0: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75  pplet");....retu
e6f0: 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  rn(cackey_select
e700: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69  _applet(slot, ai
e710: 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d  d, aid_len));..}
e720: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
e730: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
e740: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
e750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
e760: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
e770: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
e780: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e790: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e7a0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
e7b0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
e7c0: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
e7d0: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
e7e0: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
e7f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
e800: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
e810: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
e820: 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20  ey_pcsc_id_type 
e830: 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f 61 6e  cackey_detect_an
e840: 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f 61 70  d_select_root_ap
e850: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
e860: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 63  ey_slot *slot, c
e870: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
e880: 70 65 20 74 79 70 65 5f 68 69 6e 74 29 3b 0a 20  pe type_hint);. 
e890: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
e8a0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
e8b0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
e8c0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
e8d0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
e8e0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 63 61 63  to. *. *     cac
e8f0: 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
e900: 20 74 79 70 65 5f 68 69 6e 74 0a 20 2a 20 20 20   type_hint. *   
e910: 20 20 20 20 20 20 41 20 68 69 6e 74 20 61 73 20        A hint as 
e920: 74 6f 20 77 68 69 63 68 20 74 79 70 65 20 6f 66  to which type of
e930: 20 63 61 72 64 20 6d 69 67 68 74 20 62 65 20 69   card might be i
e940: 6e 20 74 68 69 73 20 73 6c 6f 74 20 28 43 41 43  n this slot (CAC
e950: 20 6f 72 20 50 49 56 29 0a 20 2a 0a 20 2a 20 52   or PIV). *. * R
e960: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
e970: 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50     CACKEY_ID_TYP
e980: 45 5f 50 49 56 20 20 20 20 20 20 20 49 66 20 74  E_PIV       If t
e990: 68 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65  he card connecte
e9a0: 64 20 69 73 20 61 20 50 49 56 0a 20 2a 20 20 20  d is a PIV. *   
e9b0: 20 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45    CACKEY_ID_TYPE
e9c0: 5f 43 41 43 20 20 20 20 20 20 20 49 66 20 74 68  _CAC       If th
e9d0: 65 20 63 61 72 64 20 63 6f 6e 6e 65 63 74 65 64  e card connected
e9e0: 20 69 73 20 61 20 43 41 43 20 77 69 74 68 20 74   is a CAC with t
e9f0: 68 65 20 43 43 43 0a 20 2a 20 20 20 20 20 20 20  he CCC. *       
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 20 61 70 70 6c 65 74 0a 20 2a         applet. *
ea20: 20 20 20 20 20 43 41 43 4b 45 59 5f 49 44 5f 54       CACKEY_ID_T
ea30: 59 50 45 5f 45 52 52 4f 52 20 20 20 20 20 49 66  YPE_ERROR     If
ea40: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
ea50: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74  o determine what
ea60: 20 74 79 70 65 20 6f 66 20 63 61 72 64 0a 20 2a   type of card. *
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
ea90: 20 63 6f 6e 6e 65 63 74 65 64 0a 20 2a 0a 20 2a   connected. *. *
eaa0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
eab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 65  is function rese
eac0: 6c 65 63 74 73 20 74 68 65 20 22 72 6f 6f 74 22  lects the "root"
ead0: 20 61 70 70 6c 65 74 2c 20 61 66 74 65 72 20 74   applet, after t
eae0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
eaf0: 63 61 6c 6c 65 64 0a 20 2a 20 20 20 20 20 74 68  called. *     th
eb00: 65 20 75 73 65 72 20 6d 61 79 20 62 65 20 72 65  e user may be re
eb10: 71 75 69 72 65 64 20 74 6f 20 6c 6f 67 69 6e 20  quired to login 
eb20: 61 67 61 69 6e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  again. *. */.sta
eb30: 74 69 63 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  tic cackey_pcsc_
eb40: 69 64 5f 74 79 70 65 20 63 61 63 6b 65 79 5f 64  id_type cackey_d
eb50: 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74  etect_and_select
eb60: 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 74 72  _root_applet(str
eb70: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
eb80: 2a 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 70 63  *slot, cackey_pc
eb90: 73 63 5f 69 64 5f 74 79 70 65 20 74 79 70 65 5f  sc_id_type type_
eba0: 68 69 6e 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65  hint) {..unsigne
ebb0: 64 20 63 68 61 72 20 63 61 63 5f 63 63 63 5f 61  d char cac_ccc_a
ebc0: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
ebd0: 44 5f 43 43 43 7d 3b 0a 09 75 6e 73 69 67 6e 65  D_CCC};..unsigne
ebe0: 64 20 63 68 61 72 20 63 61 63 5f 69 64 30 5f 61  d char cac_id0_a
ebf0: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
ec00: 44 5f 49 44 30 7d 3b 0a 09 75 6e 73 69 67 6e 65  D_ID0};..unsigne
ec10: 64 20 63 68 61 72 20 70 69 76 5f 61 69 64 5b 5d  d char piv_aid[]
ec20: 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
ec30: 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 63 61  _3_PIV_AID};..ca
ec40: 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70  ckey_pcsc_id_typ
ec50: 65 20 74 72 79 5f 74 79 70 65 73 5b 32 5d 2c 20  e try_types[2], 
ec60: 74 72 79 5f 74 79 70 65 3b 0a 09 69 6e 74 20 73  try_type;..int s
ec70: 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64  end_ret;..int id
ec80: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
ec90: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 6c 65  G_PRINTF("Resele
eca0: 63 74 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 61  cting the root a
ecb0: 70 70 6c 65 74 22 29 3b 0a 0a 09 69 66 20 28 74  pplet");...if (t
ecc0: 79 70 65 5f 68 69 6e 74 20 3d 3d 20 43 41 43 4b  ype_hint == CACK
ecd0: 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e 4f  EY_ID_TYPE_UNKNO
ece0: 57 4e 29 20 7b 0a 09 09 74 79 70 65 5f 68 69 6e  WN) {...type_hin
ecf0: 74 20 3d 20 73 6c 6f 74 2d 3e 69 64 5f 74 79 70  t = slot->id_typ
ed00: 65 5f 68 69 6e 74 3b 0a 09 7d 0a 0a 09 73 6c 6f  e_hint;..}...slo
ed10: 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e 74 20  t->id_type_hint 
ed20: 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
ed30: 5f 55 4e 4b 4e 4f 57 4e 3b 0a 0a 09 73 77 69 74  _UNKNOWN;...swit
ed40: 63 68 20 28 74 79 70 65 5f 68 69 6e 74 29 20 7b  ch (type_hint) {
ed50: 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
ed60: 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 43  D_TYPE_PIV:....C
ed70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ed80: 54 46 28 22 54 72 79 69 6e 67 20 74 6f 20 72 65  TF("Trying to re
ed90: 73 65 6c 65 63 74 20 74 68 65 20 50 49 56 20 72  select the PIV r
eda0: 6f 6f 74 20 61 70 70 6c 65 74 20 66 69 72 73 74  oot applet first
edb0: 22 29 3b 0a 0a 09 09 09 74 72 79 5f 74 79 70 65  ");.....try_type
edc0: 73 5b 30 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44  s[0] = CACKEY_ID
edd0: 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09 09 74 72  _TYPE_PIV;....tr
ede0: 79 5f 74 79 70 65 73 5b 31 5d 20 3d 20 43 41 43  y_types[1] = CAC
edf0: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b  KEY_ID_TYPE_CAC;
ee00: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  .....break;...de
ee10: 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59  fault:....CACKEY
ee20: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
ee30: 72 79 69 6e 67 20 74 6f 20 72 65 73 65 6c 65 63  rying to reselec
ee40: 74 20 74 68 65 20 43 41 43 20 43 43 43 20 61 70  t the CAC CCC ap
ee50: 70 6c 65 74 20 66 69 72 73 74 22 29 3b 0a 0a 09  plet first");...
ee60: 09 09 74 72 79 5f 74 79 70 65 73 5b 30 5d 20 3d  ..try_types[0] =
ee70: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
ee80: 43 41 43 3b 0a 09 09 09 74 72 79 5f 74 79 70 65  CAC;....try_type
ee90: 73 5b 31 5d 20 3d 20 43 41 43 4b 45 59 5f 49 44  s[1] = CACKEY_ID
eea0: 5f 54 59 50 45 5f 50 49 56 3b 0a 0a 09 09 09 62  _TYPE_PIV;.....b
eeb0: 72 65 61 6b 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  reak;..}...for (
eec0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
eed0: 73 69 7a 65 6f 66 28 74 72 79 5f 74 79 70 65 73  sizeof(try_types
eee0: 29 20 2f 20 73 69 7a 65 6f 66 28 74 72 79 5f 74  ) / sizeof(try_t
eef0: 79 70 65 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ypes[0])); idx++
ef00: 29 20 7b 0a 09 09 74 72 79 5f 74 79 70 65 20 3d  ) {...try_type =
ef10: 20 74 72 79 5f 74 79 70 65 73 5b 69 64 78 5d 3b   try_types[idx];
ef20: 0a 0a 09 09 73 77 69 74 63 68 20 28 74 72 79 5f  ....switch (try_
ef30: 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
ef40: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
ef50: 41 43 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  AC:.....CACKEY_D
ef60: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
ef70: 69 6e 67 20 74 6f 20 73 65 6c 65 63 74 20 74 68  ing to select th
ef80: 65 20 43 41 43 20 43 43 43 20 61 70 70 6c 65 74  e CAC CCC applet
ef90: 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ");......send_re
efa0: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
efb0: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
efc0: 61 63 5f 63 63 63 5f 61 69 64 2c 20 73 69 7a 65  ac_ccc_aid, size
efd0: 6f 66 28 63 61 63 5f 63 63 63 5f 61 69 64 29 29  of(cac_ccc_aid))
efe0: 3b 0a 09 09 09 09 69 66 20 28 73 65 6e 64 5f 72  ;.....if (send_r
eff0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
f000: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73  C_S_OK) {......s
f010: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
f020: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
f030: 6c 6f 74 2c 20 63 61 63 5f 69 64 30 5f 61 69 64  lot, cac_id0_aid
f040: 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 69 64 30  , sizeof(cac_id0
f050: 5f 61 69 64 29 29 3b 0a 09 09 09 09 7d 0a 0a 09  _aid));.....}...
f060: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f070: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
f080: 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59  _PIV:.....CACKEY
f090: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
f0a0: 72 79 69 6e 67 20 74 6f 20 73 65 6c 65 63 74 20  rying to select 
f0b0: 74 68 65 20 50 49 56 20 72 6f 6f 74 20 61 70 70  the PIV root app
f0c0: 6c 65 74 22 29 3b 0a 0a 09 09 09 09 73 65 6e 64  let");......send
f0d0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
f0e0: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
f0f0: 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f  , piv_aid, sizeo
f100: 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 0a 09 09  f(piv_aid));....
f110: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
f120: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
f130: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
f140: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
f150: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63  BUG_PRINTF("Succ
f160: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65  essfully selecte
f170: 64 20 74 68 65 20 25 73 20 61 70 70 6c 65 74 20  d the %s applet 
f180: 2d 2d 20 73 65 74 74 69 6e 67 20 74 68 65 20 5c  -- setting the \
f190: 22 4c 4f 47 49 4e 20 52 45 51 55 49 52 45 44 5c  "LOGIN REQUIRED\
f1a0: 22 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 74 6f  " flag on the to
f1b0: 6b 65 6e 22 2c 0a 09 09 09 09 74 72 79 5f 74 79  ken",.....try_ty
f1c0: 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f  pe == CACKEY_ID_
f1d0: 54 59 50 45 5f 43 41 43 20 3f 20 22 43 41 43 22  TYPE_CAC ? "CAC"
f1e0: 20 3a 20 22 50 49 56 22 0a 09 09 09 29 3b 0a 0a   : "PIV"....);..
f1f0: 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66  ...slot->token_f
f200: 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
f210: 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 73  _REQUIRED;.....s
f220: 6c 6f 74 2d 3e 69 64 5f 74 79 70 65 5f 68 69 6e  lot->id_type_hin
f230: 74 20 3d 20 74 72 79 5f 74 79 70 65 3b 0a 0a 09  t = try_type;...
f240: 09 09 72 65 74 75 72 6e 28 74 72 79 5f 74 79 70  ..return(try_typ
f250: 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  e);...}..}...CAC
f260: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f270: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
f280: 63 74 20 61 6e 79 20 61 70 70 6c 65 74 2c 20 72  ct any applet, r
f290: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
f2a0: 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ure");...return(
f2b0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 45  CACKEY_ID_TYPE_E
f2c0: 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  RROR);.}../*. * 
f2d0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f2e0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
f2f0: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
f300: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
f310: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
f320: 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55   ef);. *. * ARGU
f330: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
f340: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
f350: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
f360: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
f370: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
f380: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a      uint16_t ef.
f390: 20 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65   *         Eleme
f3a0: 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c  ntal File to sel
f3b0: 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ect. *. * RETURN
f3c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
f3d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
f3e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
f3f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
f400: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
f410: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
f420: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
f430: 69 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c  is selects an El
f440: 65 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45  ementary File (E
f450: 46 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  F) under the cur
f460: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a  rently selected.
f470: 20 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64   *     Dedicated
f480: 20 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a   File (DF). *. *
f490: 20 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74       Typically t
f4a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66  his is called af
f4b0: 74 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68  ter selecting th
f4c0: 65 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74  e correct Applet
f4d0: 20 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63   (using. *     c
f4e0: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
f4f0: 6c 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64  let) for VM card
f500: 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  s. *. */.static 
f510: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
f520: 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74  y_select_file(st
f530: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
f540: 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74   *slot, uint16_t
f550: 20 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64   ef) {..unsigned
f560: 20 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d   char fid_buf[2]
f570: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  ;..int send_ret;
f580: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f590: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
f5a0: 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65  );.../* Open the
f5b0: 20 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65   elementary file
f5c0: 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20   */..fid_buf[0] 
f5d0: 3d 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78  = (ef >> 8) & 0x
f5e0: 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20  ff;..fid_buf[1] 
f5f0: 3d 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43  = ef & 0xff;...C
f600: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f610: 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69  TF("Selecting fi
f620: 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73  le: %04lx", (uns
f630: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b  igned long) ef);
f640: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
f650: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
f660: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
f670: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
f680: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78  INSTR_SELECT, 0x
f690: 30 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66  02, 0x0C, sizeof
f6a0: 28 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62  (fid_buf), fid_b
f6b0: 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  uf, 0x00, NULL, 
f6c0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
f6d0: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
f6e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
f6f0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
f700: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
f710: 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65  to open file, re
f720: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
f730: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
f740: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
f750: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
f760: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f770: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
f780: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
f790: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
f7a0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
f7b0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
f7c0: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
f7d0: 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74  _free_tlv(struct
f7e0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
f7f0: 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a  ty *root);. *. *
f800: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
f810: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
f820: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
f830: 0a 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74  . *         Root
f840: 20 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74   of the TLV list
f850: 20 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e   to start freein
f860: 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  g. *. * RETURN V
f870: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
f880: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f890: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
f8a0: 6e 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20  n frees the TLV 
f8b0: 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65  linked listed re
f8c0: 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20  turned from. *  
f8d0: 20 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f     "cackey_read_
f8e0: 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  tlv". *. */.stat
f8f0: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
f900: 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ree_tlv(struct c
f910: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
f920: 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63   *root) {..struc
f930: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
f940: 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74  ity *curr, *next
f950: 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ;...if (root == 
f960: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
f970: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72  ;..}...for (curr
f980: 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63   = root; curr; c
f990: 75 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09  urr = next) {...
f9a0: 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65  next = curr->_ne
f9b0: 78 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  xt;....switch (c
f9c0: 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63  urr->tag) {....c
f9d0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
f9e0: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65  R_TABLE:....case
f9f0: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49   GSCIS_TAG_CERTI
fa00: 46 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28  FICATE:.....if (
fa10: 63 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09  curr->value) {..
fa20: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
fa30: 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
fa40: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
fa50: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
fa60: 4c 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d  L:.....if (curr-
fa70: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20  >value_cardurl) 
fa80: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
fa90: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
faa0: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  ;.....}.....brea
fab0: 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63  k;...}....free(c
fac0: 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  urr);..}...retur
fad0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
fae0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
faf0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
fb00: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
fb10: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
fb20: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
fb30: 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
fb40: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74   *. */.static st
fb50: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
fb60: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
fb70: 65 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63  ead_tlv(struct c
fb80: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
fb90: 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
fba0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
fbb0: 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f  urr_entity, *roo
fbc0: 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20  t = NULL, *last 
fbd0: 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65  = NULL;..unsigne
fbe0: 64 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b  d char tlen_buf[
fbf0: 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32  2], tval_buf[102
fc00: 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69  4], *tval;..unsi
fc10: 67 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62  gned char vlen_b
fc20: 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b  uf[2], vval_buf[
fc30: 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75  8192], *vval;..u
fc40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
fc50: 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  pbuf;..unsigned 
fc60: 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  long tmpbuflen;.
fc70: 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76  .ssize_t tlen, v
fc80: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65  len;..ssize_t re
fc90: 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ad_ret;..size_t 
fca0: 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66  offset_t = 0, of
fcb0: 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73  fset_v = 0;..uns
fcc0: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a  igned char tag;.
fcd0: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
fce0: 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a  #ifdef HAVE_LIBZ
fcf0: 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73  ..int uncompress
fd00: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
fd10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fd20: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
fd30: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
fd40: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
fd50: 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73  lot, tlen_buf, s
fd60: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c  izeof(tlen_buf),
fd70: 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09   1, offset_t);..
fd80: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
fd90: 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29  sizeof(tlen_buf)
fda0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
fdb0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
fdc0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
fdd0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
fde0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fdf0: 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c  ..}...tlen = (tl
fe00: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
fe10: 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | tlen_buf[0];..
fe20: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
fe30: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
fe40: 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73  lot, vlen_buf, s
fe50: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c  izeof(vlen_buf),
fe60: 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09   2, offset_v);..
fe70: 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20  if (read_ret != 
fe80: 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29  sizeof(vlen_buf)
fe90: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
fea0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20  UG_PRINTF("Read 
feb0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
fec0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
fed0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
fee0: 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c  ..}...vlen = (vl
fef0: 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20  en_buf[1] << 8) 
ff00: 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a  | vlen_buf[0];..
ff10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ff20: 49 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68  INTF("Tag Length
ff30: 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65   = %lu, Value Le
ff40: 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e  ngth = %lu", (un
ff50: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65  signed long) tle
ff60: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
ff70: 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73  g) vlen);...offs
ff80: 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73  et_t += 2;..offs
ff90: 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20  et_v += 2;...if 
ffa0: 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74  (tlen > sizeof(t
ffb0: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
ffc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ffd0: 46 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73  F("Tag length is
ffe0: 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75   too large, retu
fff0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
10000 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
10010 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c  LL);..}...if (vl
10020 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c  en > sizeof(vval
10030 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
10040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10050 56 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20  Value length is 
10060 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
10070 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
10080 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
10090 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
100a0 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
100b0 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61  buffer(slot, tva
100c0 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20  l_buf, tlen, 1, 
100d0 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
100e0 72 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e  read_ret != tlen
100f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
10100 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
10110 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
10120 20 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   T-buffer, retur
10130 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
10140 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
10150 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65  L);..}...read_re
10160 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
10170 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61  buffer(slot, vva
10180 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20  l_buf, vlen, 2, 
10190 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
101a0 72 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e  read_ret != vlen
101b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
101c0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
101d0 65 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65  e to read entire
101e0 20 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72   V-buffer, retur
101f0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
10200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
10210 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20  L);..}...tval = 
10220 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20  tval_buf;..vval 
10230 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69  = vval_buf;..whi
10240 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20  le (tlen > 0 && 
10250 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61  vlen > 0) {...ta
10260 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61  g = *tval;...tva
10270 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a  l++;...tlen--;..
10280 09 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30  ..if (*tval == 0
10290 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68  xff) {....length
102a0 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38   = (tval[2] << 8
102b0 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09  ) | tval[1];....
102c0 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c  tval += 3;....tl
102d0 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73  en -= 3;...} els
102e0 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  e {....length = 
102f0 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b  *tval;....tval++
10300 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d  ;....tlen--;...}
10310 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10320 5f 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73  _PRINTF("Tag: %s
10330 20 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59   (%02x)", CACKEY
10340 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f  _DEBUG_FUNC_TAG_
10350 54 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e  TO_STR(tag), (un
10360 73 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29  signed int) tag)
10370 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
10380 5f 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65  _PRINTBUF("Value
10390 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  :", vval, length
103a0 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74  );....curr_entit
103b0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74  y = NULL;...swit
103c0 63 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61  ch (tag) {....ca
103d0 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
103e0 44 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65  DURL:.....curr_e
103f0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
10400 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
10410 74 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65  ty));.....curr_e
10420 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
10430 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  durl = malloc(si
10440 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
10450 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
10460 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  ));......memcpy(
10470 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
10480 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c  ue_cardurl->rid,
10490 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63   vval, 5);.....c
104a0 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
104b0 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79  e_cardurl->appty
104c0 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09  pe = vval[5];...
104d0 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
104e0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
104f0 6a 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36  jectid = (vval[6
10500 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37  ] << 8) | vval[7
10510 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
10520 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
10530 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c  l->appid = (vval
10540 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c  [8] << 8) | vval
10550 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  [9];......curr_e
10560 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
10570 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
10580 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
10590 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
105a0 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
105b0 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75  CR_TABLE:.....cu
105c0 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
105d0 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
105e0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d  entity));.....tm
105f0 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65  pbuf = malloc(le
10600 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  ngth);......memc
10610 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
10620 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63   length);......c
10630 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
10640 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
10650 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d  entity->length =
10660 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72   length;.....cur
10670 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20  r_entity->value 
10680 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75  = tmpbuf;.....cu
10690 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
106a0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
106b0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
106c0 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
106d0 54 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  TE:.....curr_ent
106e0 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
106f0 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
10700 29 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45  ));..#ifdef HAVE
10710 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66  _LIBZ.....tmpbuf
10720 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32  len = length * 2
10730 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
10740 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
10750 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73  ;......uncompres
10760 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65  s_ret = uncompre
10770 73 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62  ss(tmpbuf, &tmpb
10780 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e  uflen, vval, len
10790 67 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e  gth);.....if (un
107a0 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20  compress_ret != 
107b0 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43  Z_OK) {......CAC
107c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
107d0 28 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f  ("Failed to deco
107e0 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65  mpress, uncompre
107f0 73 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69  ss() returned %i
10800 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f   -- resorting to
10810 20 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75   direct copy", u
10820 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a  ncompress_ret);.
10830 0a 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
10840 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d  = length;......m
10850 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
10860 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
10870 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
10880 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
10890 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
108a0 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
108b0 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09  len);.#else.....
108c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
108d0 4e 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49  NTF("Missing ZLI
108e0 42 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20  B Support, this 
108f0 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c  certificate is l
10900 69 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e  ikely useless...
10910 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ");......tmpbufl
10920 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
10930 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
10940 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23  vval, length);.#
10950 65 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f  endif......curr_
10960 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
10970 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
10980 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70  ty->length = tmp
10990 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72  buflen;.....curr
109a0 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
109b0 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
109c0 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
109d0 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
109e0 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
109f0 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09  S_TAG_PKCS15:...
10a00 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
10a10 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
10a20 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09  urr_entity));...
10a30 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
10a40 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
10a50 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
10a60 65 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d  e_byte = vval[0]
10a70 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
10a80 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
10a90 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
10aa0 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67  ....vval += leng
10ab0 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65  th;...vlen -= le
10ac0 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72  ngth;....if (cur
10ad0 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c  r_entity != NULL
10ae0 29 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20  ) {....if (root 
10af0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72  == NULL) {.....r
10b00 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  oot = curr_entit
10b10 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  y;....}.....if (
10b20 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  last != NULL) {.
10b30 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20  ....last->_next 
10b40 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
10b50 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63  ..}.....last = c
10b60 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a  urr_entity;...}.
10b70 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74  .}...return(root
10b80 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
10b90 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
10ba0 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
10bb0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
10bc0 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
10bd0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
10be0 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
10bf0 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
10c00 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  id cackey_free_c
10c10 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
10c20 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
10c30 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20   *start, size_t 
10c40 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f  count, int free_
10c50 73 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74  start) {..size_t
10c60 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72   idx;...if (star
10c70 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
10c80 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
10c90 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
10ca0 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
10cb0 09 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d  ..if (start[idx]
10cc0 2e 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a  .certificate) {.
10cd0 09 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64  ...free(start[id
10ce0 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b  x].certificate);
10cf0 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72  ...}..}...if (fr
10d00 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72  ee_start) {...fr
10d10 65 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09  ee(start);..}...
10d20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69  return;.}..stati
10d30 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
10d40 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
10d50 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
10d60 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
10d70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65  csc_identity *de
10d80 73 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  st, struct cacke
10d90 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
10da0 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
10db0 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  ount) {..size_t 
10dc0 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
10dd0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
10de0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
10df0 09 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c  .if (dest == NUL
10e00 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61  L) {...dest = ma
10e10 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73  lloc(sizeof(*des
10e20 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a  t) * count);..}.
10e30 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
10e40 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78  idx < count; idx
10e50 2b 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64 78  ++) {...dest[idx
10e60 5d 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61 72  ].id_type = star
10e70 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a  t[idx].id_type;.
10e80 0a 09 09 73 77 69 74 63 68 20 28 64 65 73 74 5b  ...switch (dest[
10e90 69 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a  idx].id_type) {.
10ea0 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
10eb0 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09  D_TYPE_CAC:.....
10ec0 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
10ed0 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74  .card.cac.applet
10ee0 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
10ef0 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
10f00 7a 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63  zeof(dest[idx].c
10f10 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
10f20 3b 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e  ;.....dest[idx].
10f30 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20  card.cac.file = 
10f40 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e  start[idx].card.
10f50 63 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72  cac.file;.....br
10f60 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43  eak;....case CAC
10f70 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
10f80 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .....dest[idx].c
10f90 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d  ard.piv.key_id =
10fa0 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
10fb0 2e 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09  .piv.key_id;....
10fc0 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78  .memcpy(dest[idx
10fd0 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c  ].card.piv.label
10fe0 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72  , start[idx].car
10ff0 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a  d.piv.label, siz
11000 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  eof(dest[idx].ca
11010 72 64 2e 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a  rd.piv.label));.
11020 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
11030 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11040 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
11050 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65  .break;...}...de
11060 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
11070 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b  ate_len = start[
11080 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
11090 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78  _len;...dest[idx
110a0 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74 61 72  ].keysize = star
110b0 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a  t[idx].keysize;.
110c0 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
110d0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
110e0 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  c(dest[idx].cert
110f0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
11100 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d  memcpy(dest[idx]
11110 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 73 74  .certificate, st
11120 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
11130 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e  cate, dest[idx].
11140 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
11150 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65  ;..}...return(de
11160 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  st);.}../*. * SY
11170 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
11180 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
11190 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
111a0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
111b0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
111c0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
111d0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
111e0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
111f0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  sc_identity *cac
11200 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
11210 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
11220 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74 20  t *slot, struct 
11230 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
11240 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75 6e 73  tity *certs, uns
11250 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e  igned long *coun
11260 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73  t) {..cackey_pcs
11270 63 5f 69 64 5f 74 79 70 65 20 63 68 65 63 6b 5f  c_id_type check_
11280 69 64 5f 74 79 70 65 3b 0a 09 73 74 72 75 63 74  id_type;..struct
11290 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
112a0 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
112b0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
112c0 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74  lv_entity *ccc_t
112d0 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a  lv, *ccc_curr, *
112e0 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75  app_tlv, *app_cu
112f0 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  rr;..unsigned ch
11300 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76  ar *piv_oid, piv
11310 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d  _oid_pivauth[] =
11320 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
11330 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70  _OID_PIVAUTH}, p
11340 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
11350 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
11360 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
11370 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79  RE}, piv_oid_key
11380 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  mgt[] = {NISTSP8
11390 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d  00_73_3_OID_KEYM
113a0 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  GT};..unsigned c
113b0 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b  har curr_aid[7];
113c0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
113d0 62 75 66 66 65 72 5b 31 30 32 34 20 2a 20 33 32  buffer[1024 * 32
113e0 5d 2c 20 2a 62 75 66 66 65 72 5f 70 2c 20 2a 74  ], *buffer_p, *t
113f0 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  mpbuf;..unsigned
11400 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30   long outidx = 0
11410 3b 0a 09 63 68 61 72 20 2a 70 69 76 5f 6c 61 62  ;..char *piv_lab
11420 65 6c 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  el;..cackey_ret 
11430 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b  transaction_ret;
11440 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
11450 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66  et;..size_t buff
11460 65 72 5f 6c 65 6e 2c 20 74 6d 70 62 75 66 6c 65  er_len, tmpbufle
11470 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65  n;..int certs_re
11480 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65  sizable;..int se
11490 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72  nd_ret, select_r
114a0 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79  et;..int piv_key
114b0 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20  , piv = 0;..int 
114c0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c  cached_certs_val
114d0 69 64 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 09 63  id;..int idx;..c
114e0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79  ackey_pcsc_id_ty
114f0 70 65 20 69 64 5f 74 79 70 65 3b 0a 23 69 66 64  pe id_type;.#ifd
11500 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e  ef HAVE_LIBZ..in
11510 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
11520 3b 0a 09 7a 5f 73 74 72 65 61 6d 20 67 7a 69 70  ;..z_stream gzip
11530 5f 73 74 72 65 61 6d 3b 0a 23 65 6e 64 69 66 0a  _stream;.#endif.
11540 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11550 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
11560 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d  ;...if (count ==
11570 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
11580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11590 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72  count is NULL, r
115a0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
115b0 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
115c0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
115d0 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20  (certs != NULL) 
115e0 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d  {...if (*count =
115f0 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
11600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
11610 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75  equested we retu
11620 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68  rn 0 objects, sh
11630 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a  ort-circuit");..
11640 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
11650 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 68 65  ;...}..}...cache
11660 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 20 3d 20  d_certs_valid = 
11670 30 3b 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73  0;..if (!slot->s
11680 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69  lot_reset) {...i
11690 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  f (slot->cached_
116a0 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 68  certs) {....cach
116b0 65 64 5f 63 65 72 74 73 5f 76 61 6c 69 64 20 3d  ed_certs_valid =
116c0 20 31 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74   1;.....if (slot
116d0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
116e0 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 09 09 09 09  ount > 0) {.....
116f0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 76 61 6c  cached_certs_val
11700 69 64 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d  id = 1;....}...}
11710 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 68 65 64  ..}...if (cached
11720 5f 63 65 72 74 73 5f 76 61 6c 69 64 29 20 7b 0a  _certs_valid) {.
11730 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
11740 55 4c 4c 29 20 7b 0a 09 09 09 63 65 72 74 73 20  ULL) {....certs 
11750 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
11760 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e  *certs) * slot->
11770 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
11780 6e 74 29 3b 0a 09 09 09 2a 63 6f 75 6e 74 20 3d  nt);....*count =
11790 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
117a0 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 7d 20 65  rts_count;...} e
117b0 6c 73 65 20 7b 0a 09 09 09 69 66 20 28 2a 63 6f  lse {....if (*co
117c0 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68  unt > slot->cach
117d0 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29 20  ed_certs_count) 
117e0 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73  {.....*count = s
117f0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
11800 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 7d 0a 09 09  s_count;....}...
11810 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  }....cackey_copy
11820 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
11830 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
11840 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41  , *count);....CA
11850 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11860 46 28 22 52 65 74 75 72 6e 69 6e 67 20 63 61 63  F("Returning cac
11870 68 65 64 20 63 65 72 74 69 66 69 63 61 74 65 73  hed certificates
11880 20 66 6f 72 20 74 68 69 73 20 73 6c 6f 74 20 28   for this slot (
11890 63 61 72 64 20 68 61 73 20 6e 6f 74 20 62 65 65  card has not bee
118a0 6e 20 72 65 73 65 74 20 61 6e 64 20 74 68 65 72  n reset and ther
118b0 65 20 61 72 65 20 63 61 63 68 65 64 20 63 65 72  e are cached cer
118c0 74 73 20 61 76 61 69 6c 61 62 6c 65 29 22 29 3b  ts available)");
118d0 0a 0a 09 09 72 65 74 75 72 6e 28 63 65 72 74 73  ....return(certs
118e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
118f0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
11900 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  {...cackey_free_
11910 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68  certs(slot->cach
11920 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ed_certs, slot->
11930 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
11940 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d  nt, 1);....slot-
11950 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  >cached_certs = 
11960 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65  NULL;..}.../* Be
11970 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20  gin a SmartCard 
11980 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
11990 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20  transaction_ret 
119a0 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  = cackey_begin_t
119b0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
119c0 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69  ;..if (transacti
119d0 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  on_ret != CACKEY
119e0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
119f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11a00 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69  NTF("Unable begi
11a10 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
11a20 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
11a30 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
11a40 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 64 5f  (NULL);..}...id_
11a50 74 79 70 65 20 3d 20 63 61 63 6b 65 79 5f 64 65  type = cackey_de
11a60 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f  tect_and_select_
11a70 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  root_applet(slot
11a80 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  , CACKEY_ID_TYPE
11a90 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09 73 77 69  _UNKNOWN);...swi
11aa0 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
11ab0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
11ac0 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 70 69  _TYPE_CAC:....pi
11ad0 76 20 3d 20 30 3b 0a 0a 09 09 09 62 72 65 61 6b  v = 0;.....break
11ae0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
11af0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
11b00 70 69 76 20 3d 20 31 3b 0a 0a 09 09 09 62 72 65  piv = 1;.....bre
11b10 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ak;...case CACKE
11b20 59 5f 49 44 5f 54 59 50 45 5f 45 52 52 4f 52 3a  Y_ID_TYPE_ERROR:
11b30 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ..../* Terminate
11b40 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
11b50 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
11b60 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
11b70 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
11b80 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c  f (certs == NULL
11b90 29 20 7b 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d  ) {.....*count =
11ba0 20 30 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74   0;....}.....ret
11bb0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 0a 09 09 09 62  urn(NULL);.....b
11bc0 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43  reak;...case CAC
11bd0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
11be0 5f 4f 4e 4c 59 3a 0a 09 09 09 43 41 43 4b 45 59  _ONLY:....CACKEY
11bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11c00 72 72 6f 72 2e 20 20 49 6d 70 6f 73 73 69 62 6c  rror.  Impossibl
11c10 65 20 63 6f 6e 64 69 74 69 6f 6e 20 72 65 61 63  e condition reac
11c20 68 65 64 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61  hed.");.....brea
11c30 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  k;..}...if (cert
11c40 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
11c50 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
11c60 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
11c70 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
11c80 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
11c90 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
11ca0 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
11cb0 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  ble = 0;..}...if
11cc0 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28   (piv) {...for (
11cd0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33  idx = 0; idx < 3
11ce0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77  ; idx++) {....sw
11cf0 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09  itch (idx) {....
11d00 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69  .case 0:......pi
11d10 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
11d20 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69  pivauth;......pi
11d30 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30  v_key = NISTSP80
11d40 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55  0_78_3_KEY_PIVAU
11d50 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62  TH;......piv_lab
11d60 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61  el = "Authentica
11d70 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61  tion";......brea
11d80 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09  k;.....case 1:..
11d90 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69  ....piv_oid = pi
11da0 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b  v_oid_signature;
11db0 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
11dc0 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
11dd0 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09  EY_SIGNATURE;...
11de0 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
11df0 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09  Signature";.....
11e00 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
11e10 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   2:......piv_oid
11e20 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67   = piv_oid_keymg
11e30 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20  t;......piv_key 
11e40 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  = NISTSP800_78_3
11e50 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09  _KEY_KEYMGT;....
11e60 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b  ..piv_label = "K
11e70 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a  ey Management";.
11e80 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
11e90 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20  .....read_ret = 
11ea0 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28  cackey_get_data(
11eb0 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69  slot, buffer, si
11ec0 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69  zeof(buffer), pi
11ed0 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28  v_oid);.....if (
11ee0 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
11ef0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
11f00 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20  ..}.....curr_id 
11f10 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
11f20 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  ;....outidx++;..
11f30 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73  ...curr_id->keys
11f40 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72  ize = -1;....cur
11f50 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
11f60 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
11f70 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  IV;....curr_id->
11f80 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20  card.piv.key_id 
11f90 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65  = piv_key;....me
11fa0 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61  mcpy(curr_id->ca
11fb0 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69  rd.piv.label, pi
11fc0 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28  v_label, strlen(
11fd0 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b  piv_label) + 1);
11fe0 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11ff0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
12000 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72  read_ret;....cur
12010 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
12020 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
12030 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
12040 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72  len);.....buffer
12050 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75  _len = sizeof(bu
12060 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72  ffer);....buffer
12070 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
12080 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66  _bertlv_tag(buff
12090 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c  er, &buffer_len,
120a0 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e   0x70, curr_id->
120b0 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63 75  certificate, &cu
120c0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
120d0 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  te_len);.....if 
120e0 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c  (buffer_p == NUL
120f0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
12100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
12110 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ading certificat
12120 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72  e from BER-TLV r
12130 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20  esponse failed, 
12140 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22  skipping key %i"
12150 2c 20 69 64 78 29 3b 0a 0a 09 09 09 09 66 72 65  , idx);......fre
12160 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  e(curr_id->certi
12170 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 63 75  ficate);......cu
12180 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
12190 74 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  te = NULL;......
121a0 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63  outidx--;......c
121b0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
121c0 09 09 69 66 20 28 63 75 72 72 5f 69 64 2d 3e 63  ..if (curr_id->c
121d0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
121e0 20 34 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 65   4) {.....if (me
121f0 6d 63 6d 70 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcmp(curr_id->ce
12200 72 74 69 66 69 63 61 74 65 2c 20 22 5c 78 31 66  rtificate, "\x1f
12210 5c 78 38 62 5c 78 30 38 5c 78 30 30 22 2c 20 34  \x8b\x08\x00", 4
12220 29 20 3d 3d 20 30 29 20 7b 0a 23 69 66 64 65 66  ) == 0) {.#ifdef
12230 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 09   HAVE_LIBZ......
12240 74 6d 70 62 75 66 6c 65 6e 20 3d 20 63 75 72 72  tmpbuflen = curr
12250 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
12260 5f 6c 65 6e 20 2a 20 32 3b 0a 09 09 09 09 09 74  _len * 2;......t
12270 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74  mpbuf = malloc(t
12280 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  mpbuflen);......
12290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
122a0 49 4e 54 42 55 46 28 22 41 74 74 65 6d 70 74 69  INTBUF("Attempti
122b0 6e 67 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73  ng to decompress
122c0 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  :", curr_id->cer
122d0 74 69 66 69 63 61 74 65 2c 20 63 75 72 72 5f 69  tificate, curr_i
122e0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
122f0 65 6e 29 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f  en);.......gzip_
12300 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20  stream.zalloc = 
12310 4e 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f  NULL;......gzip_
12320 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d 20 4e  stream.zfree = N
12330 55 4c 4c 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73  ULL;......gzip_s
12340 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20 4e  tream.opaque = N
12350 55 4c 4c 3b 0a 0a 09 09 09 09 09 67 7a 69 70 5f  ULL;.......gzip_
12360 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20  stream.next_in  
12370 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  = curr_id->certi
12380 66 69 63 61 74 65 3b 0a 09 09 09 09 09 67 7a 69  ficate;......gzi
12390 70 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69  p_stream.avail_i
123a0 6e 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72  n = curr_id->cer
123b0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09  tificate_len;...
123c0 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 6e  ...gzip_stream.n
123d0 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75 66  ext_out = tmpbuf
123e0 3b 0a 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65  ;......gzip_stre
123f0 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20 74  am.avail_out = t
12400 6d 70 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 09  mpbuflen;.......
12410 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
12420 20 69 6e 66 6c 61 74 65 49 6e 69 74 28 26 67 7a   inflateInit(&gz
12430 69 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09  ip_stream);.....
12440 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
12450 72 65 74 20 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret == Z_OK) {..
12460 09 09 09 09 09 2f 2a 20 54 72 79 20 61 67 61 69  ...../* Try agai
12470 6e 20 61 73 20 61 20 67 7a 69 70 20 62 75 66 66  n as a gzip buff
12480 65 72 20 2a 2f 0a 09 09 09 09 09 09 75 6e 63 6f  er */.......unco
12490 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e 66  mpress_ret = inf
124a0 6c 61 74 65 45 6e 64 28 26 67 7a 69 70 5f 73 74  lateEnd(&gzip_st
124b0 72 65 61 6d 29 3b 0a 09 09 09 09 09 09 69 66 20  ream);.......if 
124c0 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  (uncompress_ret 
124d0 3d 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09  == Z_OK) {......
124e0 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e 7a 61  ..gzip_stream.za
124f0 6c 6c 6f 63 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  lloc = NULL;....
12500 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
12510 7a 66 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  zfree = NULL;...
12520 09 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d  .....gzip_stream
12530 2e 6f 70 61 71 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .opaque = NULL;.
12540 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73 74 72  ........gzip_str
12550 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d 20 63  eam.next_in  = c
12560 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
12570 61 74 65 3b 0a 09 09 09 09 09 09 09 67 7a 69 70  ate;........gzip
12580 5f 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e  _stream.avail_in
12590 20 3d 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74   = curr_id->cert
125a0 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 09  ificate_len;....
125b0 09 09 09 09 67 7a 69 70 5f 73 74 72 65 61 6d 2e  ....gzip_stream.
125c0 6e 65 78 74 5f 6f 75 74 20 3d 20 74 6d 70 62 75  next_out = tmpbu
125d0 66 3b 0a 09 09 09 09 09 09 09 67 7a 69 70 5f 73  f;........gzip_s
125e0 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
125f0 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
12600 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
12610 65 74 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74  et = inflateInit
12620 32 28 26 67 7a 69 70 5f 73 74 72 65 61 6d 2c 20  2(&gzip_stream, 
12630 33 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  31);.......}....
12640 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e 63  ..}......if (unc
12650 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20 5a  ompress_ret == Z
12660 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 75 6e 63  _OK) {.......unc
12670 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 69 6e  ompress_ret = in
12680 66 6c 61 74 65 28 26 67 7a 69 70 5f 73 74 72 65  flate(&gzip_stre
12690 61 6d 2c 20 30 29 3b 0a 09 09 09 09 09 7d 0a 09  am, 0);......}..
126a0 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65  ....if (uncompre
126b0 73 73 5f 72 65 74 20 3d 3d 20 5a 5f 53 54 52 45  ss_ret == Z_STRE
126c0 41 4d 5f 45 4e 44 29 20 7b 0a 09 09 09 09 09 09  AM_END) {.......
126d0 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
126e0 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 67 7a 69   inflateEnd(&gzi
126f0 70 5f 73 74 72 65 61 6d 29 3b 0a 09 09 09 09 09  p_stream);......
12700 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
12710 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
12720 5a 5f 44 41 54 41 5f 45 52 52 4f 52 3b 0a 09 09  Z_DATA_ERROR;...
12730 09 09 09 7d 0a 09 09 09 09 09 69 66 20 28 75 6e  ...}......if (un
12740 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 3d 20  compress_ret == 
12750 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 09 74 6d  Z_OK) {.......tm
12760 70 62 75 66 6c 65 6e 20 3d 20 67 7a 69 70 5f 73  pbuflen = gzip_s
12770 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b  tream.total_out;
12780 0a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
12790 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44  EBUG_PRINTBUF("D
127a0 65 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22  ecompressed to:"
127b0 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
127c0 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 09 66 72 65  len);........fre
127d0 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  e(curr_id->certi
127e0 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 09 09  ficate);........
127f0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
12800 63 61 74 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  cate = tmpbuf;..
12810 09 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
12820 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
12830 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 09  tmpbuflen;......
12840 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43  } else {.......C
12850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12860 54 46 28 22 44 65 63 6f 6d 70 72 65 73 73 69 6e  TF("Decompressin
12870 67 20 66 61 69 6c 65 64 21 20 75 6e 63 6f 6d 70  g failed! uncomp
12880 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64 20  ress() returned 
12890 25 69 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f  %i", uncompress_
128a0 72 65 74 29 3b 0a 0a 09 09 09 09 09 09 66 72 65  ret);........fre
128b0 65 28 74 6d 70 62 75 66 29 3b 0a 09 09 09 09 09  e(tmpbuf);......
128c0 7d 0a 23 65 6c 73 65 0a 09 09 09 09 09 43 41 43  }.#else......CAC
128d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
128e0 28 22 45 72 72 6f 72 2e 20 20 57 65 20 67 6f 74  ("Error.  We got
128f0 20 61 20 63 6f 6d 70 72 65 73 73 65 64 20 63 65   a compressed ce
12900 72 74 69 66 69 63 61 74 65 20 62 75 74 20 77 65  rtificate but we
12910 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 7a 6c 69   do not have zli
12920 62 2e 20 20 48 6f 70 69 6e 67 20 66 6f 72 20 74  b.  Hoping for t
12930 68 65 20 62 65 73 74 2e 22 29 3b 0a 23 65 6e 64  he best.");.#end
12940 69 66 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09  if.....}....}...
12950 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a  }..} else {.../*
12960 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70   Read all the ap
12970 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43  plets from the C
12980 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63  CC's TLV */...cc
12990 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  c_tlv = cackey_r
129a0 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a  ead_tlv(slot);..
129b0 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41  ../* Look for CA
129c0 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72  RDURLs that coor
129d0 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70  espond to PKI ap
129e0 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28  plets */...for (
129f0 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74  ccc_curr = ccc_t
12a00 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63  lv; ccc_curr; cc
12a10 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72  c_curr = ccc_cur
12a20 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43  r->_next) {....C
12a30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12a40 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25  TF("Found tag: %
12a50 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f  s ... ", CACKEY_
12a60 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
12a70 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
12a80 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63  tag));.....if (c
12a90 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20  cc_curr->tag != 
12aa0 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
12ab0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
12ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
12ad0 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
12ae0 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
12af0 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b  out CARDURLs)");
12b00 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
12b10 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63  ...}.....if ((cc
12b20 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
12b30 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26  rdurl->apptype &
12b40 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
12b50 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54  PKI) != CACKEY_T
12b60 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09  LV_APP_PKI) {...
12b70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12b80 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69  RINTF("  ... ski
12b90 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c  pping it (we onl
12ba0 79 20 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49  y care about PKI
12bb0 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61   applets, this a
12bc0 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20  pplet supports: 
12bd0 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45  %s/%02x)", CACKE
12be0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50  Y_DEBUG_FUNC_APP
12bf0 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f  TYPE_TO_STR(ccc_
12c00 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12c10 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28  url->apptype), (
12c20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63  unsigned int) cc
12c30 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
12c40 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b  rdurl->apptype);
12c50 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
12c60 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
12c70 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
12c80 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d  RID:", ccc_curr-
12c90 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
12ca0 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  rid, sizeof(ccc_
12cb0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12cc0 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43  url->rid));....C
12cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12ce0 54 46 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25  TF("AppID = %s/%
12cf0 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45  04lx", CACKEY_DE
12d00 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54  BUG_FUNC_OBJID_T
12d10 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e  O_STR(ccc_curr->
12d20 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
12d30 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ppid), (unsigned
12d40 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
12d50 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
12d60 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45  appid);....CACKE
12d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12d80 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30  ObjectID = %s/%0
12d90 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  4lx", CACKEY_DEB
12da0 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
12db0 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76  _STR(ccc_curr->v
12dc0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
12dd0 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e  jectid), (unsign
12de0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
12df0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
12e00 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09  ->objectid);....
12e10 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64  .memcpy(curr_aid
12e20 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
12e30 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
12e40 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
12e50 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
12e60 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61  rid));....curr_a
12e70 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
12e80 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f  id) - 2] = (ccc_
12e90 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
12ea0 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29  url->appid >> 8)
12eb0 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72   & 0xff;....curr
12ec0 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
12ed0 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63  _aid) - 1] = ccc
12ee0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
12ef0 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78  durl->appid & 0x
12f00 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63  ff;...../* Selec
12f10 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e  t found applet .
12f20 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f  .. */....select_
12f30 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
12f40 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
12f50 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
12f60 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09  f(curr_aid));...
12f70 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
12f80 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
12f90 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
12fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12fb0 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
12fc0 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e   applet, skippin
12fd0 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  g processing of 
12fe0 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  this object");..
12ff0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
13000 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e  .}...../* ... an
13010 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20  d object (file) 
13020 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74  */....select_ret
13030 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
13040 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f  _file(slot, ccc_
13050 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
13060 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a  url->objectid);.
13070 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
13080 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
13090 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
130a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
130b0 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
130c0 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e  ct file, skippin
130d0 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20  g processing of 
130e0 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  this object");..
130f0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
13100 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73  .}...../* Proces
13110 73 20 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c  s this file's TL
13120 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65  V looking for ce
13130 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09  rtificates */...
13140 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .app_tlv = cacke
13150 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
13160 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f  ;......for (app_
13170 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20  curr = app_tlv; 
13180 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75  app_curr; app_cu
13190 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f  rr = app_curr->_
131a0 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b  next) {.....CACK
131b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
131c0 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c  "Found tag: %s",
131d0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
131e0 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70  NC_TAG_TO_STR(ap
131f0 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09  p_curr->tag));..
13200 09 09 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d  ...if (app_curr-
13210 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41  >tag != GSCIS_TA
13220 47 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  G_CERTIFICATE) {
13230 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
13240 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
13250 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
13260 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
13270 20 43 45 52 54 49 46 49 43 41 54 45 73 29 22 29   CERTIFICATEs)")
13280 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
13290 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72  ;.....}......cur
132a0 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
132b0 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64  tidx];.....outid
132c0 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69  x++;......curr_i
132d0 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43  d->id_type = CAC
132e0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b  KEY_ID_TYPE_CAC;
132f0 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
13300 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
13310 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  plet, curr_aid, 
13320 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e  sizeof(curr_id->
13330 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29  card.cac.applet)
13340 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  );.....curr_id->
13350 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20  card.cac.file = 
13360 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
13370 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
13380 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  d;.....curr_id->
13390 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09  keysize = -1;...
133a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
133b0 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20  PRINTF("Filling 
133c0 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
133d0 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20 77 69  c.applet (%p) wi
133e0 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20  th %lu bytes:", 
133f0 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
13400 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67  c.applet, (unsig
13410 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66  ned long) sizeof
13420 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
13430 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09  ac.applet));....
13440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13450 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63  INTBUF("VAL:", c
13460 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
13470 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28  .applet, sizeof(
13480 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61  curr_id->card.ca
13490 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09  c.applet));.....
134a0 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
134b0 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f  icate_len = app_
134c0 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09  curr->length;...
134d0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
134e0 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
134f0 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
13500 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
13510 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
13520 63 65 72 74 69 66 69 63 61 74 65 2c 20 61 70 70  certificate, app
13530 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75  _curr->value, cu
13540 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
13550 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  te_len);......if
13560 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75   (outidx >= *cou
13570 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63  nt) {......if (c
13580 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20  erts_resizable) 
13590 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a  {.......*count *
135a0 3d 20 32 3b 0a 09 09 09 09 09 09 69 66 20 28 2a  = 2;.......if (*
135b0 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09  count != 0) {...
135c0 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65 61  .....certs = rea
135d0 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
135e0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
135f0 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 09 7d 20  ount));.......} 
13600 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 63 65  else {........ce
13610 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  rts = NULL;.....
13620 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  ..}......} else 
13630 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
13640 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
13650 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
13660 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a  _tlv(app_tlv);..
13670 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
13680 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62   *count) {.....b
13690 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  reak;....}...}..
136a0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
136b0 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a  v(ccc_tlv);..}..
136c0 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78  .*count = outidx
136d0 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65  ;...if (certs_re
136e0 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 69 66 20  sizable) {...if 
136f0 28 2a 63 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  (*count != 0) {.
13700 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
13710 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
13720 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
13730 6e 74 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  nt));...} else {
13740 0a 09 09 09 66 72 65 65 28 63 65 72 74 73 29 3b  ....free(certs);
13750 0a 0a 09 09 09 63 65 72 74 73 20 3d 20 4e 55 4c  .....certs = NUL
13760 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 73 6c 6f 74  L;...}..}...slot
13770 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ->cached_certs =
13780 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72   cackey_copy_cer
13790 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20  ts(NULL, certs, 
137a0 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e  *count);..slot->
137b0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
137c0 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f  nt = *count;.../
137d0 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72  * Terminate Smar
137e0 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tCard Transactio
137f0 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
13800 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
13810 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72  t);...return(cer
13820 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ts);.}../*. * SY
13830 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
13840 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
13850 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
13860 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
13870 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
13880 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
13890 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
138a0 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73  ssize_t cackey_s
138b0 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63  igndecrypt(struc
138c0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
138d0 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
138e0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
138f0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
13900 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
13910 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e  t buflen, unsign
13920 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c  ed char *outbuf,
13930 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65   size_t outbufle
13940 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c  n, int padInput,
13950 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74   int unpadOutput
13960 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  ) {..cackey_pcsc
13970 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65  _id_type id_type
13980 2c 20 63 68 65 63 6b 5f 69 64 5f 74 79 70 65 3b  , check_id_type;
13990 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
139a0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
139b0 65 5b 31 30 5d 2c 20 2a 64 79 6e 5f 61 75 74 68  e[10], *dyn_auth
139c0 5f 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e  _tmpbuf;..unsign
139d0 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
139e0 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
139f0 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70  buf_s, *outbuf_p
13a00 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
13a10 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
13a20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69  p1, class;..unsi
13a30 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74  gned char blockt
13a40 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74  ype;..cackey_ret
13a50 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74   send_ret;..uint
13a60 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
13a70 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d  ssize_t retval =
13a80 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   0, unpadoffset;
13a90 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c  ..size_t tmpbufl
13aa0 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f  en, padlen, tmpo
13ab0 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66  utbuflen, outbuf
13ac0 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f  _len;..int free_
13ad0 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74  tmpbuf = 0;..int
13ae0 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45   le;...CACKEY_DE
13af0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
13b00 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
13b10 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
13b20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13b30 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74  TF("Error.  slot
13b40 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
13b50 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
13b60 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  if (buf == NULL)
13b70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13b80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
13b90 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b    buf is NULL");
13ba0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13bb0 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20  .}...if (outbuf 
13bc0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
13bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13be0 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66  ("Error.  outbuf
13bf0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
13c00 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
13c10 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
13c20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
13c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
13c40 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20  rror.  identity 
13c50 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
13c60 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
13c70 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
13c80 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55  c_identity == NU
13c90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
13ca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
13cb0 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70  or.  identity->p
13cc0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20  csc_identity is 
13cd0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
13ce0 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74  n(-1);..}...id_t
13cf0 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ype = identity->
13d00 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69  pcsc_identity->i
13d10 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f  d_type;..if (id_
13d20 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
13d30 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
13d40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
13d50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13d60 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
13d70 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41  c_identity is CA
13d80 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
13d90 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61  T_ONLY, which ca
13da0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72  nnot be used for
13db0 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b   sign/decrypt");
13dc0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13dd0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f  .}...switch (id_
13de0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
13df0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
13e00 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  V:...case CACKEY
13e10 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
13e20 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
13e30 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
13e40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
13e50 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
13e60 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  c_identity is no
13e70 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61  t a supported va
13e80 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78  lue. Type is: 0x
13e90 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78  %lx (PIV = 0x%lx
13ea0 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c  , CAC = 0x%lx)",
13eb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13ec0 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67   id_type, (unsig
13ed0 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59  ned long) CACKEY
13ee0 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75  _ID_TYPE_PIV, (u
13ef0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
13f00 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
13f10 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
13f20 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
13f30 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
13f40 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
13f50 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
13f60 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
13f70 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
13f80 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
13f90 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
13fa0 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
13fb0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
13fc0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
13fd0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
13fe0 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
13ff0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
14000 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
14010 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
14020 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
14030 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
14040 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
14050 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
14060 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
14070 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
14080 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
14090 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
140a0 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
140b0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
140c0 65 79 73 69 7a 65 20 2d 20 33 29 29 20 7b 0a 09  eysize - 3)) {..
140d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
140e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
140f0 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
14100 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
14110 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
14120 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
14130 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
14140 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
14150 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
14160 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
14170 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
14180 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
14190 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
141a0 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
141b0 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
141c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
141d0 5f 50 52 49 4e 54 46 28 22 4e 65 65 64 20 74 6f  _PRINTF("Need to
141e0 20 70 61 64 20 74 68 65 20 62 75 66 66 65 72 20   pad the buffer 
141f0 77 69 74 68 20 25 6c 6c 75 20 62 79 74 65 73 20  with %llu bytes 
14200 28 74 6d 70 62 75 66 6c 65 6e 20 3d 20 25 6c 6c  (tmpbuflen = %ll
14210 75 2c 20 62 75 66 6c 65 6e 20 3d 20 25 6c 6c 75  u, buflen = %llu
14220 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
14230 6e 67 20 6c 6f 6e 67 29 20 70 61 64 6c 65 6e 2c  ng long) padlen,
14240 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
14250 6c 6f 6e 67 29 20 74 6d 70 62 75 66 6c 65 6e 2c  long) tmpbuflen,
14260 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20   (unsigned long 
14270 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 3b 0a 0a  long) buflen);..
14280 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
14290 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
142a0 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
142b0 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
142c0 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
142d0 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
142e0 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
142f0 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
14300 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
14310 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
14320 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
14330 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
14340 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
14350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14360 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
14370 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
14380 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14390 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
143a0 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
143b0 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
143c0 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
143d0 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
143e0 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
143f0 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
14400 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
14410 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
14420 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
14430 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
14440 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
14450 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
14460 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
14470 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
14480 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
14490 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
144a0 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
144b0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
144c0 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
144d0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
144e0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
144f0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
14500 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
14510 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
14520 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
14530 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
14540 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
14550 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
14560 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  t);.../* Select 
14570 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a  correct applet *
14580 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  /..switch (id_ty
14590 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
145a0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
145b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
145c0 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
145d0 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20  ng applet found 
145e0 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e  at %p ...", iden
145f0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
14600 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  ity->card.cac.ap
14610 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79  plet);....cackey
14620 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
14630 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
14640 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
14650 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
14660 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
14670 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
14680 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
14690 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
146a0 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
146b0 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
146c0 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
146d0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
146e0 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  ity->card.cac.fi
146f0 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  le);....break;..
14700 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
14710 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e  TYPE_PIV:....dyn
14720 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30  _auth_template[0
14730 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e  ] = 0x7C;....dyn
14740 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
14750 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
14760 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32  _auth_template[2
14770 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20  ] = ((tmpbuflen 
14780 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e  + 6) & 0xff00) >
14790 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  > 8;....dyn_auth
147a0 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28  _template[3] = (
147b0 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
147c0 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f   0x00ff;....dyn_
147d0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d  auth_template[4]
147e0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
147f0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d  auth_template[5]
14800 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f   = 0x00;....dyn_
14810 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
14820 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f   = 0x81;....dyn_
14830 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d  auth_template[7]
14840 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
14850 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d  auth_template[8]
14860 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20   = (tmpbuflen & 
14870 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
14880 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
14890 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65  te[9] = tmpbufle
148a0 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09  n & 0x00ff;.....
148b0 64 79 6e 5f 61 75 74 68 5f 74 6d 70 62 75 66 20  dyn_auth_tmpbuf 
148c0 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
148d0 65 6e 20 2b 20 73 69 7a 65 6f 66 28 64 79 6e 5f  en + sizeof(dyn_
148e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 29 3b  auth_template));
148f0 0a 09 09 09 6d 65 6d 63 70 79 28 64 79 6e 5f 61  ....memcpy(dyn_a
14900 75 74 68 5f 74 6d 70 62 75 66 2c 20 64 79 6e 5f  uth_tmpbuf, dyn_
14910 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 73  auth_template, s
14920 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74  izeof(dyn_auth_t
14930 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 6d 65  emplate));....me
14940 6d 63 70 79 28 64 79 6e 5f 61 75 74 68 5f 74 6d  mcpy(dyn_auth_tm
14950 70 62 75 66 20 2b 20 73 69 7a 65 6f 66 28 64 79  pbuf + sizeof(dy
14960 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29  n_auth_template)
14970 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66  , tmpbuf, tmpbuf
14980 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 66 72  len);.....if (fr
14990 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09  ee_tmpbuf) {....
149a0 09 66 72 65 65 28 74 6d 70 62 75 66 29 3b 0a 09  .free(tmpbuf);..
149b0 09 09 7d 0a 0a 09 09 09 74 6d 70 62 75 66 6c 65  ..}.....tmpbufle
149c0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 64 79 6e 5f  n += sizeof(dyn_
149d0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 3b 0a  auth_template);.
149e0 09 09 09 74 6d 70 62 75 66 20 3d 20 64 79 6e 5f  ...tmpbuf = dyn_
149f0 61 75 74 68 5f 74 6d 70 62 75 66 3b 0a 09 09 09  auth_tmpbuf;....
14a00 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b  free_tmpbuf = 1;
14a10 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
14a20 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14a30 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
14a40 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62  break;..}...tmpb
14a50 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09  uf_s = tmpbuf;..
14a60 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75  outbuf_s = outbu
14a70 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75  f;..while (tmpbu
14a80 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74  flen) {...tmpout
14a90 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c  buflen = outbufl
14aa0 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75  en;....if (tmpbu
14ab0 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50  flen > CACKEY_AP
14ac0 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74  DU_MTU) {....byt
14ad0 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43  es_to_send = CAC
14ae0 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09  KEY_APDU_MTU;...
14af0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65  } else {....byte
14b00 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62  s_to_send = tmpb
14b10 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65  uflen;...}....se
14b20 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f  nd_ret = CACKEY_
14b30 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a  PCSC_E_GENERIC;.
14b40 09 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
14b50 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
14b60 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
14b70 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c  .....if (tmpbufl
14b80 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55  en > CACKEY_APDU
14b90 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20  _MTU) {......p1 
14ba0 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x80;......le 
14bb0 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c  = 0x00;.....} el
14bc0 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30  se {......p1 = 0
14bd0 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30  x00;......le = 0
14be0 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  x00;.....}......
14bf0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
14c00 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
14c10 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
14c20 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
14c30 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
14c40 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30  ECRYPT, p1, 0x00
14c50 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
14c60 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
14c70 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
14c80 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
14c90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
14ca0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14cb0 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74  E_PIV:.....if (t
14cc0 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45  mpbuflen > CACKE
14cd0 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09  Y_APDU_MTU) {...
14ce0 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b  ...class = 0x10;
14cf0 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b  ......le = 0x00;
14d00 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
14d10 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53  ...class = GSCIS
14d20 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a  _CLASS_ISO7816;.
14d30 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09  .....le = 256;..
14d40 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72  ...}......send_r
14d50 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
14d60 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73  _apdu(slot, clas
14d70 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  s, NISTSP800_73_
14d80 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c  3_INSTR_GENAUTH,
14d90 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14da0 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64  ALGO_RSA2048, id
14db0 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
14dc0 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e  ntity->card.piv.
14dd0 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f  key_id, bytes_to
14de0 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c  _send, tmpbuf, l
14df0 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75  e, &respcode, ou
14e00 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66  tbuf, &tmpoutbuf
14e10 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  len);.....break;
14e20 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
14e30 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
14e40 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  Y:.....break;...
14e50 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  }....if (send_re
14e60 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
14e70 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28  _S_OK) {....if (
14e80 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
14e90 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
14ea0 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70   {......free(tmp
14eb0 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09  buf_s);.....}...
14ec0 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72  .}...../* End tr
14ed0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
14ee0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
14ef0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
14f00 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
14f10 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
14f20 52 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41 43  RETRY) {.....CAC
14f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14f40 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
14f50 61 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69 6e  ailed -- retryin
14f60 67 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  g.");......retur
14f70 6e 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  n(cackey_signdec
14f80 72 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74  rypt(slot, ident
14f90 69 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  ity, buf, buflen
14fa0 2c 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66  , outbuf, outbuf
14fb0 6c 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20 75  len, padInput, u
14fc0 6e 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09 09  npadOutput));...
14fd0 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
14fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
14ff0 20 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20   Sending Failed 
15000 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  -- returning in 
15010 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66  error.");.....if
15020 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
15030 36 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64 65  6982 || respcode
15040 20 3d 3d 20 30 78 36 65 30 30 20 7c 7c 20 72 65   == 0x6e00 || re
15050 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 64 30 30  spcode == 0x6d00
15060 29 20 7b 0a 09 09 09 09 69 66 20 28 72 65 73 70  ) {.....if (resp
15070 63 6f 64 65 20 3d 3d 20 30 78 36 65 30 30 29 20  code == 0x6e00) 
15080 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15090 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20  BUG_PRINTF("Got 
150a0 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c  \"WRONG CLASS\",
150b0 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61   this means we a
150c0 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68  re talking to th
150d0 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28  e wrong object (
150e0 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20 74  likely because t
150f0 68 65 20 63 61 72 64 20 77 65 6e 74 20 61 77 61  he card went awa
15100 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 22  y) -- resetting"
15110 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  );.....} else if
15120 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
15130 36 64 30 30 29 20 7b 0a 09 09 09 09 09 43 41 43  6d00) {......CAC
15140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15150 28 22 47 6f 74 20 5c 22 49 4e 56 41 4c 49 44 20  ("Got \"INVALID 
15160 49 4e 53 54 52 55 43 54 49 4f 4e 5c 22 2c 20 74  INSTRUCTION\", t
15170 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61 72 65  his means we are
15180 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20   talking to the 
15190 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69  wrong object (li
151a0 6b 65 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  kely because the
151b0 20 63 61 72 64 20 77 65 6e 74 20 61 77 61 79 29   card went away)
151c0 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 22 29 3b   -- resetting");
151d0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
151e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
151f0 50 52 49 4e 54 46 28 22 53 65 63 75 72 69 74 79  PRINTF("Security
15200 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61 74 69   status not sati
15210 73 69 66 69 65 64 20 28 72 65 73 70 63 6f 64 65  sified (respcode
15220 20 3d 20 30 78 25 30 34 78 29 2e 20 20 52 65 74   = 0x%04x).  Ret
15230 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e  urning NEEDLOGIN
15240 22 2c 20 28 69 6e 74 29 20 72 65 73 70 63 6f 64  ", (int) respcod
15250 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  e);.....}......c
15260 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
15270 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
15280 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63 74 5f  ..cackey_detect_
15290 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f 74 5f  and_select_root_
152a0 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 43 41 43  applet(slot, CAC
152b0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 55 4e 4b 4e  KEY_ID_TYPE_UNKN
152c0 4f 57 4e 29 3b 0a 0a 09 09 09 09 73 6c 6f 74 2d  OWN);......slot-
152d0 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
152e0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
152f0 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  D;......return(C
15300 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
15310 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09  DLOGIN);....}...
15320 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
15330 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
15340 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
15350 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15360 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62  PRINTF("Token ab
15370 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
15380 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a   TOKENABSENT");.
15390 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
153a0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
153b0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
153c0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
153d0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
153e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
153f0 5f 50 52 49 4e 54 46 28 22 53 6f 6d 65 74 68 69  _PRINTF("Somethi
15400 6e 67 20 77 65 6e 74 20 77 72 6f 6e 67 20 64 75  ng went wrong du
15410 72 69 6e 67 20 73 69 67 6e 69 6e 67 2c 20 72 65  ring signing, re
15420 73 65 74 74 69 6e 67 20 74 68 65 20 73 6c 6f 74  setting the slot
15430 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20   and hoping for 
15440 74 68 65 20 62 65 73 74 2e 22 29 3b 0a 0a 09 09  the best.");....
15450 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73  .cackey_pcsc_dis
15460 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 63  connect();.....c
15470 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
15480 63 74 28 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ct();.....cackey
15490 5f 64 65 74 65 63 74 5f 61 6e 64 5f 73 65 6c 65  _detect_and_sele
154a0 63 74 5f 72 6f 6f 74 5f 61 70 70 6c 65 74 28 73  ct_root_applet(s
154b0 6c 6f 74 2c 20 43 41 43 4b 45 59 5f 49 44 5f 54  lot, CACKEY_ID_T
154c0 59 50 45 5f 55 4e 4b 4e 4f 57 4e 29 3b 0a 0a 09  YPE_UNKNOWN);...
154d0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
154e0 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
154f0 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b  ...}....tmpbuf +
15500 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
15510 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20  ...tmpbuflen -= 
15520 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a  bytes_to_send;..
15530 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f  ..outbuf += tmpo
15540 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62  utbuflen;...outb
15550 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62  uflen -= tmpoutb
15560 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20  uflen;...retval 
15570 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b  += tmpoutbuflen;
15580 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74  ..}...if (free_t
15590 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74  mpbuf) {...if (t
155a0 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72  mpbuf_s) {....fr
155b0 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
155c0 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20  }..}...outbuf = 
155d0 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45  outbuf_s;.../* E
155e0 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nd transaction *
155f0 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
15600 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
15610 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
15620 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
15630 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
15640 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65  AX..if (outbufle
15650 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  n > _POSIX_SSIZE
15660 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
15670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
15680 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73  utbuflen exceeds
15690 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
156a0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
156b0 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
156c0 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c  , outbuflen = %l
156d0 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
156e0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
156f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75  nsigned long) ou
15700 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  tbuflen);....ret
15710 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
15720 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ndif.#endif.../*
15730 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76 65 20   We must remove 
15740 74 68 65 20 22 37 43 22 20 74 61 67 20 74 6f 20  the "7C" tag to 
15750 67 65 74 20 74 6f 20 74 68 65 20 73 69 67 6e 61  get to the signa
15760 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 63 68 20  ture */..switch 
15770 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61  (id_type) {...ca
15780 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
15790 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74 62 75 66  E_PIV:....outbuf
157a0 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09  _len = retval;..
157b0 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63  ..outbuf_p = cac
157c0 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
157d0 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74  tag(outbuf, &out
157e0 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e  buf_len, 0x7C, N
157f0 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65  ULL,  &outbuf_le
15800 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75  n);....if (outbu
15810 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f_p == NULL) {..
15820 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15830 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
15840 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45   from PIV for GE
15850 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43  NERATE AUTHENTIC
15860 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20  ATION was not a 
15870 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e  0x7C tag, return
15880 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
15890 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
158a0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76  );....}.....retv
158b0 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b  al = outbuf_len;
158c0 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20  .....outbuf_len 
158d0 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74  = retval;....out
158e0 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72  buf_p = cackey_r
158f0 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f  ead_bertlv_tag(o
15900 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c  utbuf, &outbuf_l
15910 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20  en, 0x82, NULL, 
15920 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09   &outbuf_len);..
15930 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70 20 3d  ..if (outbuf_p =
15940 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
15950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15960 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d  F("Response from
15970 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52 41 54   PIV for GENERAT
15980 45 20 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  E AUTHENTICATION
15990 20 77 61 73 20 6e 6f 74 20 61 20 30 78 38 32 20   was not a 0x82 
159a0 77 69 74 68 69 6e 20 61 20 30 78 37 43 20 74 61  within a 0x7C ta
159b0 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  g, returning in 
159c0 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09  failure");......
159d0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
159e0 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75  .....retval = ou
159f0 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72  tbuf_len;.....br
15a00 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
15a10 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
15a20 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
15a30 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a  _TYPE_CERT_ONLY:
15a40 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
15a50 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a  /* Unpad reply *
15a60 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70  /..if (unpadOutp
15a70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76  ut) {...if (retv
15a80 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43  al < 3) {....CAC
15a90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15aa0 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73  ("Reply is too s
15ab0 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74  mall, we are not
15ac0 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d   able to unpad -
15ad0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
15ae0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
15af0 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
15b00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b10 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
15b20 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
15b30 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
15b40 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
15b50 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
15b60 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f  l);...}....if (o
15b70 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30  utbuf[0] != 0x00
15b80 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15b90 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65  BUG_PRINTF("Unre
15ba0 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67  cognized padding
15bb0 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69   scheme -- passi
15bc0 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
15bd0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
15be0 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
15bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15c00 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
15c10 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
15c20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
15c30 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
15c40 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
15c50 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20  ....blocktype = 
15c60 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70  outbuf[1];...unp
15c70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09  adoffset = 0;...
15c80 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79  .switch (blockty
15c90 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78  pe) {....case 0x
15ca0 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  00:...../* Paddi
15cb0 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65  ng Scheme 1, the
15cc0 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20   first non-zero 
15cd0 62 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72  byte is the star
15ce0 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09  t of data */....
15cf0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
15d00 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
15d10 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
15d20 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
15d30 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
15d40 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78  padoffset] != 0x
15d50 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  00) {.......brea
15d60 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
15d70 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
15d80 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20  se 0x01:...../* 
15d90 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32  Padding Scheme 2
15da0 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
15db0 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79  0xFF followed by
15dc0 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72   0x00 */.....for
15dd0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
15de0 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
15df0 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
15e00 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
15e10 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
15e20 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20  ffset] != 0xFF) 
15e30 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62  {.......if (outb
15e40 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
15e50 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
15e60 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
15e70 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
15e80 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
15e90 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15ea0 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
15eb0 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
15ec0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
15ed0 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
15ee0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
15ef0 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  00 found 0x%02x"
15f00 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
15f10 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
15f20 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72  set]);.........r
15f30 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
15f40 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
15f50 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
15f60 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
15f70 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61  lid padding data
15f80 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e   found, returnin
15f90 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68  g in failure, sh
15fa0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30  ould have been 0
15fb0 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78  xFF found 0x%02x
15fc0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
15fd0 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66  ) outbuf[unpadof
15fe0 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72  fset]);........r
15ff0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
16000 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
16010 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a  k;....case 0x02:
16020 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
16030 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79  Scheme 3, pad by
16040 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f  tes are non-zero
16050 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65   first zero byte
16060 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65   found is the se
16070 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a  perator byte */.
16080 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
16090 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
160a0 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
160b0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
160c0 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
160d0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
160e0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75   0x00) {.......u
160f0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
16100 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
16110 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
16120 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75  ak;...}....if (u
16130 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74  npadoffset > ret
16140 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  val) {....CACKEY
16150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
16160 66 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68  ffset greater th
16170 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61  an reply size, a
16180 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64  borting.  (unpad
16190 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65  offset = %lu, re
161a0 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75  tval = %lu)", (u
161b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e  nsigned long) un
161c0 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69  padoffset, (unsi
161d0 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61  gned long) retva
161e0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
161f0 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  1);...}....CACKE
16200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
16210 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  ("Padded:", outb
16220 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  uf, retval);....
16230 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f  retval -= unpado
16240 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65  ffset;...memmove
16250 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20  (outbuf, outbuf 
16260 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72  + unpadoffset, r
16270 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45  etval);....CACKE
16280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
16290 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75  ("Unpadded:", ou
162a0 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09  tbuf, retval);..
162b0 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
162c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
162d0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
162e0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
162f0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
16300 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
16310 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20  retval);.}../*. 
16320 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
16330 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
16340 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
16350 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
16360 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
16370 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
16380 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
16390 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
163a0 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
163b0 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  ent(struct cacke
163c0 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
163d0 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
163e0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
163f0 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 20  WORD reader_len 
16400 3d 20 30 2c 20 73 74 61 74 65 20 3d 20 30 2c 20  = 0, state = 0, 
16410 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74  protocol = 0, at
16420 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72  r_len;..BYTE atr
16430 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a  [MAX_ATR_SIZE];.
16440 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74  .LONG status_ret
16450 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  , scard_reconn_r
16460 65 74 3b 0a 09 4c 50 53 54 52 20 72 65 61 64 65  et;..LPSTR reade
16470 72 5f 6e 61 6d 65 3b 0a 0a 09 43 41 43 4b 45 59  r_name;...CACKEY
16480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16490 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
164a0 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20  slot->internal) 
164b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
164c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
164d0 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74  ng token present
164e0 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e   (internal token
164f0 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  )");....return(C
16500 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
16510 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  ENPRESENT);..}..
16520 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
16530 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
16540 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
16550 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
16560 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
16570 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
16580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16590 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
165a0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
165b0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
165c0 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  sent");....retur
165d0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
165e0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d  TOKENABSENT);..}
165f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16600 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20  PRINTF("Calling 
16610 53 43 61 72 64 53 74 61 74 75 73 28 29 20 74 6f  SCardStatus() to
16620 20 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20   determine card 
16630 73 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f  status");...atr_
16640 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72  len = sizeof(atr
16650 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d  );..status_ret =
16660 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
16670 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
16680 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
16690 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
166a0 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
166b0 6e 29 3b 0a 20 0a 09 69 66 20 28 73 74 61 74 75  n);. ..if (statu
166c0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
166d0 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
166e0 46 46 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59  FFER) {...CACKEY
166f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
16700 63 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74  cardStatus() ret
16710 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e  urned SCARD_E_IN
16720 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
16730 52 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73  R, assuming this
16740 20 69 73 20 61 20 62 75 67 20 28 65 2e 67 2e 2c   is a bug (e.g.,
16750 20 47 6f 6f 67 6c 65 20 50 43 53 43 29 20 69 6d   Google PCSC) im
16760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 64  plementation and
16770 20 72 65 74 72 79 69 6e 67 22 29 3b 0a 0a 09 09   retrying");....
16780 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
16790 28 61 74 72 29 3b 0a 0a 09 09 72 65 61 64 65 72  (atr);....reader
167a0 5f 6c 65 6e 20 3d 20 33 32 37 36 38 3b 0a 09 09  _len = 32768;...
167b0 72 65 61 64 65 72 5f 6e 61 6d 65 20 3d 20 6d 61  reader_name = ma
167c0 6c 6c 6f 63 28 72 65 61 64 65 72 5f 6c 65 6e 29  lloc(reader_len)
167d0 3b 0a 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20  ;....status_ret 
167e0 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c  = SCardStatus(sl
167f0 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 72  ot->pcsc_card, r
16800 65 61 64 65 72 5f 6e 61 6d 65 2c 20 26 72 65 61  eader_name, &rea
16810 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
16820 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
16830 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 09 66   &atr_len);....f
16840 72 65 65 28 72 65 61 64 65 72 5f 6e 61 6d 65 29  ree(reader_name)
16850 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75  ;..}...if (statu
16860 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  s_ret == SCARD_E
16870 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29  _INVALID_HANDLE)
16880 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
16890 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53  G_PRINTF("SCardS
168a0 74 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64  tatus() returned
168b0 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
168c0 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67  _HANDLE, marking
168d0 20 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   as not already 
168e0 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72  connected and tr
168f0 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09  ying again");...
16900 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
16910 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
16920 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
16930 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
16940 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
16950 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
16960 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
16970 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09  PCSC_S_OK) {....
16980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16990 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
169a0 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
169b0 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
169c0 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65  absent");.....re
169d0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
169e0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
169f0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
16a00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16a10 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73  ling SCardStatus
16a20 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61  () again");....a
16a30 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
16a40 61 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72  atr);...status_r
16a50 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
16a60 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
16a70 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
16a80 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
16a90 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
16aa0 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20  r_len);..}...if 
16ab0 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53  (status_ret != S
16ac0 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
16ad0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  {...cackey_mark_
16ae0 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
16af0 3b 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f  ;....if (status_
16b00 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
16b10 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
16b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16b30 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
16b40 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
16b50 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
16b60 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
16b70 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
16b80 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
16b90 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
16ba0 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29  ARD_PROTOCOL_T1)
16bb0 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  ;....if (scard_r
16bc0 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
16bd0 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
16be0 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
16bf0 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
16c00 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
16c10 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
16c20 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
16c30 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
16c40 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
16c50 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
16c60 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
16c70 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
16c80 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
16c90 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
16ca0 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
16cb0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16cc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
16cd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71   successful, req
16ce0 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73  uerying");.....s
16cf0 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
16d00 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
16d10 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
16d20 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
16d30 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
16d40 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
16d50 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
16d60 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
16d70 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
16d80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16d90 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74  ("Still unable t
16da0 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
16db0 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
16dc0 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
16dd0 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
16de0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
16df0 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
16e00 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
16e10 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
16e20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
16e30 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
16e40 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
16e50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16e60 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
16e70 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61   reconnect to ca
16e80 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
16e90 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
16ea0 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20  rdReconnect() = 
16eb0 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
16ec0 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
16ed0 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63  TO_STR(scard_rec
16ee0 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  onn_ret));......
16ef0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
16f00 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
16f10 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
16f20 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
16f30 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
16f40 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
16f50 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
16f60 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
16f70 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
16f80 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
16f90 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
16fa0 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
16fb0 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  et));.....return
16fc0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
16fd0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
16fe0 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65  ..}...if ((state
16ff0 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29   & SCARD_ABSENT)
17000 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54   == SCARD_ABSENT
17010 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
17020 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
17030 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72  is absent, retur
17040 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
17050 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
17060 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
17070 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
17080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17090 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
170a0 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b  oken present.");
170b0 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
170c0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
170d0 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  SENT);.}../*. * 
170e0 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
170f0 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
17100 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
17110 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
17120 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
17130 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
17140 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
17150 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
17160 6b 65 79 5f 73 65 74 5f 70 69 6e 28 73 74 72 75  key_set_pin(stru
17170 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
17180 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
17190 68 61 72 20 2a 6f 6c 64 5f 70 69 6e 2c 20 75 6e  har *old_pin, un
171a0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 6c 64 5f  signed long old_
171b0 70 69 6e 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  pin_len, unsigne
171c0 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
171d0 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
171e0 65 6e 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  en) {..struct ca
171f0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
17200 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74  ty *pcsc_identit
17210 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ies;..unsigned c
17220 68 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d  har cac_pin[8] =
17230 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78   {0xFF, 0xFF, 0x
17240 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
17250 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
17260 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  };..unsigned cha
17270 72 20 6f 6c 64 5f 63 61 63 5f 70 69 6e 5b 38 5d  r old_cac_pin[8]
17280 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c 20   = {0xFF, 0xFF, 
17290 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
172a0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
172b0 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  FF};..unsigned c
172c0 68 61 72 20 70 69 6e 5f 75 70 64 61 74 65 5b 73  har pin_update[s
172d0 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 20 2b  izeof(cac_pin) +
172e0 20 73 69 7a 65 6f 66 28 6f 6c 64 5f 63 61 63 5f   sizeof(old_cac_
172f0 70 69 6e 29 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  pin)];..unsigned
17300 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
17310 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
17320 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
17330 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
17340 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
17350 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  int key_referenc
17360 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 41  e = 0x00;.../* A
17370 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
17380 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
17390 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
173a0 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
173b0 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
173c0 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
173d0 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
173e0 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
173f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
17400 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
17410 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
17420 69 66 20 28 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 20  if (old_pin_len 
17430 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
17440 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c  (old_cac_pin, ol
17450 64 5f 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c  d_pin, 8);..} el
17460 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 6c  se {...memcpy(ol
17470 64 5f 63 61 63 5f 70 69 6e 2c 20 6f 6c 64 5f 70  d_cac_pin, old_p
17480 69 6e 2c 20 6f 6c 64 5f 70 69 6e 5f 6c 65 6e 29  in, old_pin_len)
17490 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 63 61 74  ;..}.../* Concat
174a0 65 6e 61 74 65 20 62 6f 74 68 20 50 49 4e 73 20  enate both PINs 
174b0 74 6f 67 65 74 68 65 72 20 74 6f 20 73 65 6e 64  together to send
174c0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   as a single ins
174d0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 09 6d 65 6d  truction */..mem
174e0 63 70 79 28 70 69 6e 5f 75 70 64 61 74 65 2c 20  cpy(pin_update, 
174f0 6f 6c 64 5f 63 61 63 5f 70 69 6e 2c 20 73 69 7a  old_cac_pin, siz
17500 65 6f 66 28 6f 6c 64 5f 63 61 63 5f 70 69 6e 29  eof(old_cac_pin)
17510 29 3b 0a 09 6d 65 6d 63 70 79 28 70 69 6e 5f 75  );..memcpy(pin_u
17520 70 64 61 74 65 20 2b 20 73 69 7a 65 6f 66 28 6f  pdate + sizeof(o
17530 6c 64 5f 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  ld_cac_pin), cac
17540 5f 70 69 6e 2c 20 73 69 7a 65 6f 66 28 63 61 63  _pin, sizeof(cac
17550 5f 70 69 6e 29 29 3b 0a 0a 09 2f 2a 20 52 65 6a  _pin));.../* Rej
17560 65 63 74 20 50 49 4e 73 20 77 68 69 63 68 20 61  ect PINs which a
17570 72 65 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  re too short */.
17580 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35  .if (pin_len < 5
17590 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
175a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63  UG_PRINTF("Rejec
175b0 74 69 6e 67 20 4e 65 77 20 50 49 4e 20 77 68 69  ting New PIN whi
175c0 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
175d0 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 6d  (length = %lu, m
175e0 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20 35  ust be atleast 5
175f0 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a 09  )", pin_len);...
17600 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
17610 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
17620 7d 0a 0a 09 69 66 20 28 6f 6c 64 5f 70 69 6e 5f  }...if (old_pin_
17630 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43  len < 5) {...CAC
17640 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17650 28 22 52 65 6a 65 63 74 69 6e 67 20 4f 6c 64 20  ("Rejecting Old 
17660 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
17670 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
17680 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
17690 6c 65 61 73 74 20 35 29 22 2c 20 6f 6c 64 5f 70  least 5)", old_p
176a0 69 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  in_len);....retu
176b0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
176c0 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f  _BADPIN);..}.../
176d0 2a 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61  * PIV authentica
176e0 74 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79  tion uses a "key
176f0 5f 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30  _reference" of 0
17700 78 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65  x80 */..pcsc_ide
17710 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
17720 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
17730 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
17740 74 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65  ts);..if (num_ce
17750 72 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f  rts > 0 && pcsc_
17760 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
17770 4c 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28  LL) {...switch (
17780 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
17790 30 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  0].id_type) {...
177a0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
177b0 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41  TYPE_PIV:.....CA
177c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
177d0 46 28 22 57 65 20 68 61 76 65 20 50 49 56 20 63  F("We have PIV c
177e0 61 72 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20  ard, so we will 
177f0 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65  attempt to authe
17800 6e 74 69 63 61 74 65 20 75 73 69 6e 67 20 74 68  nticate using th
17810 65 20 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f  e PIV Applicatio
17820 6e 20 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22  n key reference"
17830 29 3b 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65  );......key_refe
17840 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09  rence = 0x80;...
17850 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
17860 75 6c 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ult:.....break;.
17870 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
17880 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
17890 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
178a0 72 74 73 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  rts, 1);..}.../*
178b0 20 49 73 73 75 65 20 61 20 53 65 74 20 50 49 4e   Issue a Set PIN
178c0 20 28 43 48 41 4e 47 45 20 52 45 46 45 52 45 4e   (CHANGE REFEREN
178d0 43 45 29 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  CE) */..send_ret
178e0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
178f0 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
17900 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
17910 53 43 49 53 5f 49 4e 53 54 52 5f 43 48 41 4e 47  SCIS_INSTR_CHANG
17920 45 5f 52 45 46 45 52 45 4e 43 45 2c 20 30 78 30  E_REFERENCE, 0x0
17930 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  0, key_reference
17940 2c 20 73 69 7a 65 6f 66 28 70 69 6e 5f 75 70 64  , sizeof(pin_upd
17950 61 74 65 29 2c 20 70 69 6e 5f 75 70 64 61 74 65  ate), pin_update
17960 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
17970 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
17980 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
17990 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
179a0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
179b0 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
179c0 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
179d0 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
179e0 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
179f0 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
17a00 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
17a10 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
17a20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
17a30 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
17a40 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
17a50 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
17a60 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
17a70 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
17a80 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
17a90 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
17aa0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
17ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
17ac0 6c 65 20 74 6f 20 73 65 74 20 50 49 4e 2c 20 64  le to set PIN, d
17ad0 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 20  evice is locked 
17ae0 6f 72 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  or changing the 
17af0 50 49 4e 20 69 73 20 64 69 73 61 62 6c 65 64 22  PIN is disabled"
17b00 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
17b10 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
17b20 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ED);...}....retu
17b30 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
17b40 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
17b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17b60 4e 54 46 28 22 50 49 4e 20 43 68 61 6e 67 65 20  NTF("PIN Change 
17b70 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
17b80 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
17b90 43 5f 53 5f 4f 4b 29 3b 0a 0a 09 2f 2a 20 44 69  C_S_OK);.../* Di
17ba0 73 61 62 6c 65 20 61 20 77 61 72 6e 69 6e 67 2c  sable a warning,
17bb0 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 20 6f   since this is o
17bc0 6e 6c 79 20 75 73 65 64 20 69 6e 20 64 65 62 75  nly used in debu
17bd0 67 20 6d 6f 64 65 20 2a 2f 0a 09 74 72 69 65 73  g mode */..tries
17be0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 74 72 69  _remaining = tri
17bf0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 7d 0a  es_remaining;.}.
17c00 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
17c10 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
17c20 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
17c30 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
17c40 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
17c50 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
17c60 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
17c70 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
17c80 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
17c90 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
17ca0 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
17cb0 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
17cc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
17cd0 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
17ce0 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20 69 6e  _remaining_p, in
17cf0 74 20 72 65 74 72 69 65 73 29 20 7b 0a 09 73 74  t retries) {..st
17d00 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
17d10 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
17d20 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
17d30 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70  igned char cac_p
17d40 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30  in[8] = {0xFF, 0
17d50 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
17d60 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
17d70 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67  F, 0xFF};..unsig
17d80 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
17d90 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ts;..uint16_t re
17da0 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e  sponse_code;..in
17db0 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
17dc0 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  g;..int send_ret
17dd0 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72  ;..int key_refer
17de0 65 6e 63 65 20 3d 20 30 78 30 30 2c 20 68 61 76  ence = 0x00, hav
17df0 65 5f 70 69 76 20 3d 20 30 3b 0a 09 63 61 63 6b  e_piv = 0;..cack
17e00 65 79 5f 72 65 74 20 63 6f 6e 6e 65 63 74 5f 72  ey_ret connect_r
17e10 65 74 2c 20 74 6f 6b 65 6e 5f 72 65 74 3b 0a 0a  et, token_ret;..
17e20 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  ./* Indicate tha
17e30 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  t we do not know
17e40 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20   about how many 
17e50 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e  tries are remain
17e60 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65  ing */..if (trie
17e70 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
17e80 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  ...*tries_remain
17e90 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a  ing_p = -1;..}..
17ea0 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20  ./* Apparently, 
17eb0 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58  CAC PINs are *EX
17ec0 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c  ACTLY* 8 bytes l
17ed0 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20  ong -- pad with 
17ee0 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72  0xFF if too shor
17ef0 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
17f00 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63  n >= 8) {...memc
17f10 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
17f20 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09   8);..} else {..
17f30 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
17f40 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a   pin, pin_len);.
17f50 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50  .}.../* Reject P
17f60 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74 6f  INs which are to
17f70 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28  o short */..if (
17f80 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09  pin_len < 5) {..
17f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17fa0 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20  INTF("Rejecting 
17fb0 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f  PIN which is too
17fc0 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d   short (length =
17fd0 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74   %lu, must be at
17fe0 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c  least 5)", pin_l
17ff0 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  en);....return(C
18000 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
18010 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49  PIN);..}.../* PI
18020 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  V authentication
18030 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66   uses a "key_ref
18040 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20  erence" of 0x80 
18050 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  */..pcsc_identit
18060 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
18070 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
18080 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
18090 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
180a0 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e  > 0 && pcsc_iden
180b0 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
180c0 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73 63  {...switch (pcsc
180d0 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69  _identities[0].i
180e0 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73  d_type) {....cas
180f0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
18100 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59  _PIV:.....CACKEY
18110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57  _DEBUG_PRINTF("W
18120 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c  e have PIV card,
18130 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65   so we will atte
18140 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63  mpt to authentic
18150 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50 49  ate using the PI
18160 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65  V Application ke
18170 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a  y reference");..
18180 09 09 09 09 68 61 76 65 5f 70 69 76 20 3d 20 31  ....have_piv = 1
18190 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
181a0 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62 72 65  default:.....bre
181b0 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  ak;...}....cacke
181c0 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
181d0 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
181e0 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 7d 0a  m_certs, 1);..}.
181f0 0a 09 69 66 20 28 68 61 76 65 5f 70 69 76 20 3d  ..if (have_piv =
18200 3d 20 31 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66  = 1) {...key_ref
18210 65 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09  erence = 0x80;..
18220 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
18230 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
18240 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
18250 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
18260 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
18270 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
18280 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79  ERIFY, 0x00, key
18290 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65  _reference, size
182a0 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
182b0 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
182c0 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
182d0 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
182e0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
182f0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
18300 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
18310 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
18320 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
18330 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
18340 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
18350 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
18360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18370 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
18380 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
18390 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
183a0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
183b0 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
183c0 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09  maining_p) {....
183d0 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
183e0 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61  g_p = tries_rema
183f0 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09  ining;....}.....
18400 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
18410 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
18420 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
18430 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
18440 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
18450 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
18460 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
18470 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c  led, device is l
18480 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  ocked");.....ret
18490 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
184a0 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a  E_LOCKED);...}..
184b0 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
184c0 6f 64 65 20 3d 3d 20 30 78 36 64 30 30 29 20 7b  ode == 0x6d00) {
184d0 0a 09 09 09 69 66 20 28 72 65 74 72 69 65 73 20  ....if (retries 
184e0 3e 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  > 0) {.....CACKE
184f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18500 47 6f 74 20 49 53 4f 20 37 38 31 36 20 52 65 73  Got ISO 7816 Res
18510 70 6f 6e 73 65 20 5c 22 36 44 20 30 30 5c 22 20  ponse \"6D 00\" 
18520 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
18530 20 56 45 52 49 46 59 20 72 65 71 75 65 73 74 2e   VERIFY request.
18540 22 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
18550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
18560 64 69 64 20 6e 6f 74 20 65 78 70 65 63 74 20 74  did not expect t
18570 68 69 73 20 62 65 63 61 75 73 65 20 69 74 20 69  his because it i
18580 73 20 6e 6f 74 20 6d 65 6e 74 69 6f 6e 65 64 20  s not mentioned 
18590 69 6e 20 4e 49 53 54 20 53 50 20 38 30 30 2d 37  in NIST SP 800-7
185a0 33 2d 33 20 50 61 72 74 20 32 20 53 65 63 74 69  3-3 Part 2 Secti
185b0 6f 6e 20 33 2e 32 2e 31 20 6f 72 20 47 53 43 2d  on 3.2.1 or GSC-
185c0 49 53 20 76 32 2e 31 22 29 3b 0a 09 09 09 09 43  IS v2.1");.....C
185d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
185e0 54 46 28 22 57 65 20 61 72 65 20 67 6f 69 6e 67  TF("We are going
185f0 20 74 6f 20 74 72 79 20 74 6f 20 72 65 73 65 74   to try to reset
18600 20 74 68 65 20 63 61 72 64 20 61 6e 64 20 73 65   the card and se
18610 6c 65 63 74 20 74 68 65 20 61 70 70 6c 65 74 20  lect the applet 
18620 61 67 61 69 6e 2e 22 29 3b 0a 0a 09 09 09 09 69  again.");......i
18630 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30  f (num_certs > 0
18640 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74 69 74   && pcsc_identit
18650 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
18660 09 09 09 09 63 61 63 6b 65 79 5f 64 65 74 65 63  ....cackey_detec
18670 74 5f 61 6e 64 5f 73 65 6c 65 63 74 5f 72 6f 6f  t_and_select_roo
18680 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70  t_applet(slot, p
18690 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30  csc_identities[0
186a0 5d 2e 69 64 5f 74 79 70 65 29 3b 0a 09 09 09 09  ].id_type);.....
186b0 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  }......cackey_ma
186c0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
186d0 6f 74 29 3b 0a 0a 09 09 09 09 63 6f 6e 6e 65 63  ot);......connec
186e0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
186f0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
18700 29 3b 0a 09 09 09 09 69 66 20 28 63 6f 6e 6e 65  );.....if (conne
18710 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
18720 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
18730 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18740 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
18750 6f 20 72 65 63 6f 6e 6e 65 63 74 20 61 66 74 65  o reconnect afte
18760 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
18770 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
18780 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09  in error.");....
18790 09 09 09 72 65 74 75 72 6e 28 63 6f 6e 6e 65 63  ...return(connec
187a0 74 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  t_ret);.....}...
187b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
187c0 50 52 49 4e 54 46 28 22 56 65 72 69 66 79 69 6e  PRINTF("Verifyin
187d0 67 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20  g we still have 
187e0 61 20 74 6f 6b 65 6e 2e 22 29 3b 0a 09 09 09 09  a token.");.....
187f0 74 6f 6b 65 6e 5f 72 65 74 20 3d 20 63 61 63 6b  token_ret = cack
18800 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
18810 28 73 6c 6f 74 29 3b 0a 09 09 09 09 69 66 20 28  (slot);.....if (
18820 74 6f 6b 65 6e 5f 72 65 74 20 21 3d 20 43 41 43  token_ret != CAC
18830 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
18840 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  PRESENT) {......
18850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18860 4e 54 46 28 22 54 6f 6b 65 6e 20 6e 6f 74 20 70  NTF("Token not p
18870 72 65 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  resent, returnin
18880 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
18890 09 09 09 09 09 72 65 74 75 72 6e 28 74 6f 6b 65  .....return(toke
188a0 6e 5f 72 65 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  n_ret);.....}...
188b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
188c0 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20 74  PRINTF("Trying t
188d0 6f 20 6c 6f 67 69 6e 20 61 67 61 69 6e 22 29 3b  o login again");
188e0 0a 09 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
188f0 65 79 5f 6c 6f 67 69 6e 28 73 6c 6f 74 2c 20 70  ey_login(slot, p
18900 69 6e 2c 20 70 69 6e 5f 6c 65 6e 2c 20 74 72 69  in, pin_len, tri
18910 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 2c 20  es_remaining_p, 
18920 72 65 74 72 69 65 73 20 2d 20 31 29 29 3b 0a 09  retries - 1));..
18930 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
18940 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
18950 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
18960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18970 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
18980 74 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29  tion succeeded")
18990 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
189a0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
189b0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
189c0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
189d0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
189e0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
189f0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
18a00 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
18a10 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
18a20 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
18a30 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
18a40 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73  ntity_to_label(s
18a50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
18a60 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
18a70 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
18a80 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20  har *label_buf, 
18a90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61  unsigned long la
18aa0 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  bel_buf_len) {..
18ab0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
18ac0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
18ad0 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31  void *label_asn1
18ae0 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69  ;..void *certifi
18af0 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f  cate;..int x509_
18b00 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74  read_ret;...cert
18b10 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
18b20 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
18b30 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
18b40 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
18b50 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
18b60 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
18b70 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65  _len < 0) {...re
18b80 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
18b90 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
18ba0 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
18bb0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
18bc0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f  ificate_len, (vo
18bd0 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73  id **) &label_as
18be0 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  n1);..if (x509_r
18bf0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
18c00 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
18c10 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
18c20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
18c30 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
18c40 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
18c50 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
18c60 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
18c70 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35  , "CN");..if (x5
18c80 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
18c90 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f  ) {...x509_read_
18ca0 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
18cb0 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
18cc0 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
18cd0 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
18ce0 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
18cf0 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  _len, NULL);....
18d00 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
18d10 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t <= 0) {....ret
18d20 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
18d30 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
18d40 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
18d50 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
18d60 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  X..if (x509_read
18d70 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _ret > _POSIX_SS
18d80 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
18d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18da0 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ("x509_read_ret 
18db0 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
18dc0 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
18dd0 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
18de0 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65  x = %li, x509_re
18df0 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20  ad_ret = %lu)", 
18e00 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
18e10 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
18e20 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65  ed long) x509_re
18e30 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  ad_ret);....retu
18e40 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
18e50 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  dif.#endif...ret
18e60 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65  urn(x509_read_re
18e70 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  t);.}../* Return
18e80 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
18e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
18ea0 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
18eb0 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b  (void **mutex) {
18ec0 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
18ed0 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
18ee0 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
18ef0 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
18f00 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
18f10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18f20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
18f30 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
18f40 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
18f50 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
18f60 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
18f70 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
18f80 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  utex = malloc(si
18f90 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75  zeof(*pthread_mu
18fa0 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74  tex));...if (!pt
18fb0 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09  hread_mutex) {..
18fc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18fd0 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
18fe0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
18ff0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
19000 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72  -1);...}....pthr
19010 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
19020 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
19030 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e  pthread_mutex, N
19040 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72  ULL);...if (pthr
19050 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
19060 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
19070 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
19080 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20  ad_mutex_init() 
19090 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
190a0 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
190b0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
190c0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a  rn(-1);...}....*
190d0 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f  mutex = pthread_
190e0 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b  mutex;..} else {
190f0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
19100 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20  gs.CreateMutex) 
19110 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
19120 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
19130 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74  .CreateMutex(mut
19140 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
19150 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
19160 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
19170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19180 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  "cackey_args.Cre
19190 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72  ateMutex() retur
191a0 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
191b0 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
191c0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
191d0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
191e0 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
191f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19200 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
19210 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
19220 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
19230 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
19240 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
19250 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
19260 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
19270 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
19280 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
19290 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
192a0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
192b0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
192c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
192d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
192e0 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
192f0 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
19300 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
19310 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
19320 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
19330 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
19340 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
19350 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
19360 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  _lock(pthread_mu
19370 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
19380 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
19390 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
193a0 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
193b0 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20  ad_mutex_lock() 
193c0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
193d0 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
193e0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
193f0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
19400 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
19410 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
19420 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
19430 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
19440 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75  rgs.LockMutex(mu
19450 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
19460 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
19470 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
19480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19490 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ("cackey_args.Lo
194a0 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
194b0 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
194c0 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
194d0 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
194e0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
194f0 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
19500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
19510 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
19520 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
19530 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
19540 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
19550 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
19560 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
19570 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
19580 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
19590 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
195a0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
195b0 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
195c0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
195d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
195e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
195f0 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
19600 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
19610 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
19620 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
19630 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
19640 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
19650 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
19660 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
19670 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64  x_unlock(pthread
19680 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
19690 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
196a0 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
196b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
196c0 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
196d0 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
196e0 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
196f0 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
19700 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
19710 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
19720 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  (cackey_args.Unl
19730 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
19740 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
19750 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
19760 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
19770 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
19780 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
19790 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
197a0 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
197b0 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
197c0 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
197d0 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
197e0 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
197f0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
19800 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
19810 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19820 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
19830 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
19840 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
19850 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41  ;.}..static CK_A
19860 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63  TTRIBUTE_PTR cac
19870 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
19880 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  es(CK_OBJECT_CLA
19890 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  SS objectclass, 
198a0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
198b0 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
198c0 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
198d0 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75  long identity_nu
198e0 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  m, CK_ULONG_PTR 
198f0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
19900 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
19910 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69  true = 1;..stati
19920 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61  c CK_BBOOL ck_fa
19930 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63  lse = 0;..static
19940 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75   CK_TRUST ck_tru
19950 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45  sted = CK_TRUSTE
19960 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b  D_DELEGATOR;..CK
19970 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20  _ULONG numattrs 
19980 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  = 0, retval_coun
19990 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  t;..CK_ATTRIBUTE
199a0 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f  _TYPE curr_attr_
199b0 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  type;..CK_ATTRIB
199c0 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a  UTE curr_attr, *
199d0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44  retval;..CK_VOID
199e0 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
199f0 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
19a00 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  n;..CK_OBJECT_CL
19a10 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ASS ck_object_cl
19a20 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49  ass;..CK_CERTIFI
19a30 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72  CATE_TYPE ck_cer
19a40 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
19a50 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b  CK_KEY_TYPE ck_k
19a60 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46  ey_type;..CK_UTF
19a70 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31  8CHAR ucTmpBuf[1
19a80 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65  024];..SHA1Conte
19a90 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44  xt sha1_ctx;..MD
19aa0 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09  5_CTX md5_ctx;..
19ab0 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73  uint8_t sha1_has
19ac0 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b  h[SHA1HashSize];
19ad0 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61  ..uint8_t md5_ha
19ae0 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b  sh[MD5HashSize];
19af0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
19b00 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
19b10 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
19b20 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
19b30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
19b40 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
19b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19b60 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
19b70 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
19b80 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
19b90 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
19ba0 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
19bb0 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
19bc0 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  );...*pulCount =
19bd0 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74   0;...if (object
19be0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
19bf0 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
19c00 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
19c10 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a  UBLIC_KEY && obj
19c20 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19c30 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
19c40 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
19c50 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
19c60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19c70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
19c80 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
19c90 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f  NULL), invalid o
19ca0 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a  bject class");..
19cb0 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
19cc0 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74  .}.../* Get Cert
19cd0 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74   */..if (identit
19ce0 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
19cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
19d10 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
19d20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20  invalid identiy 
19d30 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72  provided");....r
19d40 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
19d50 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
19d60 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
19d70 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
19d80 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
19d90 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
19da0 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
19db0 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31  ficate_len == -1
19dc0 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20   || certificate 
19dd0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
19de0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19df0 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
19e00 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
19e10 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73  is identity does
19e20 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35   not have an X.5
19e30 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
19e40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69  ssociated with i
19e50 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77  t and will not w
19e60 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ork");....return
19e70 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
19e80 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  Verify that cert
19e90 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31  ificate is ASN.1
19ea0 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63   encoded X.509 c
19eb0 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69  ertificate */..i
19ec0 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61  f (x509_to_seria
19ed0 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
19ee0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19ef0 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43  NULL) < 0) {...C
19f00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19f10 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
19f20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
19f30 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66  the X.509 certif
19f40 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
19f50 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74   with this ident
19f60 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64  ity is not valid
19f70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
19f80 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  LL);..}...retval
19f90 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65  _count = 64;..re
19fa0 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65  tval = malloc(re
19fb0 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
19fc0 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a  eof(*retval));..
19fd0 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f  .for (curr_attr_
19fe0 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61  type = 0; curr_a
19ff0 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35  ttr_type < 0xce5
1a000 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72  363bf; curr_attr
1a010 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20  _type++) {...if 
1a020 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
1a030 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63  == 0x800) {....c
1a040 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
1a050 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a  0xce536300;...}.
1a060 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d  ...pValue_free =
1a070 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e   0;...pValue = N
1a080 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
1a090 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
1a0a0 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72  ;....switch (cur
1a0b0 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09  r_attr_type) {..
1a0c0 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
1a0d0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1a0e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1a0f0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1a100 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38  CKA_CLASS (0x%08
1a110 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1a120 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1a130 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1a140 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20  ck_object_class 
1a150 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a  = objectclass;..
1a160 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
1a170 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09  _object_class;..
1a180 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1a190 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74  sizeof(ck_object
1a1a0 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41  _class);......CA
1a1b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a1c0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1a1d0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
1a1e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1a1f0 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c   *((CK_OBJECT_CL
1a200 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  ASS *) pValue), 
1a210 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a220 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a230 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a240 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b  ....case CKA_TOK
1a250 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EN:.....CACKEY_D
1a260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1a270 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1a280 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25  e CKA_TOKEN (0x%
1a290 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a2a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a2b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a2c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
1a2d0 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
1a2e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1a2f0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
1a300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a310 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1a320 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
1a330 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1a340 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
1a350 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1a360 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1a370 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1a380 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1a390 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
1a3a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a3b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
1a3c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50   attribute CKA_P
1a3d0 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 29  RIVATE (0x%08lx)
1a3e0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
1a3f0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
1a400 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
1a410 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
1a420 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
1a430 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
1a440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a450 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1a460 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1a470 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
1a480 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
1a490 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
1a4a0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56  k;.....}......pV
1a4b0 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
1a4c0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1a4d0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
1a4e0 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
1a4f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
1a500 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
1a510 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
1a520 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
1a530 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
1a540 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
1a550 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1a560 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1a570 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1a580 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43  A_TRUSTED:.....C
1a590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a5a0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1a5b0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
1a5c0 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e  STED (0x%08lx) .
1a5d0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
1a5e0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
1a5f0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
1a600 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
1a610 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
1a620 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
1a630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1a640 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
1a650 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
1a660 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
1a670 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1a680 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a690 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  .}......pValue =
1a6a0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
1a6b0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
1a6c0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
1a6d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a6e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1a6f0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1a700 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1a710 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1a720 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1a730 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1a740 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1a750 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1a760 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49  .case CKA_MODIFI
1a770 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
1a780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1a790 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
1a7a0 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ute CKA_MODIFIAB
1a7b0 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
1a7c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1a7d0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1a7e0 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
1a7f0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
1a800 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
1a810 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
1a820 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a830 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1a840 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
1a850 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
1a860 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
1a870 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
1a880 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
1a890 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
1a8a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
1a8b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ....case CKA_LAB
1a8c0 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EL:.....CACKEY_D
1a8d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
1a8e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
1a8f0 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25  e CKA_LABEL (0x%
1a900 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1a910 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1a920 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1a930 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
1a940 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45  id_type == CACKE
1a950 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20 7b  Y_ID_TYPE_PIV) {
1a960 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69  ......pValue = i
1a970 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
1a980 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 6c  v.label;......ul
1a990 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c 65  ValueLen = strle
1a9a0 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  n(pValue);.....}
1a9b0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c 56   else {......ulV
1a9c0 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e  alueLen = snprin
1a9d0 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d  tf((char *) ucTm
1a9e0 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54  pBuf, sizeof(ucT
1a9f0 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74  mpBuf), "Identit
1aa00 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  y #%lu", (unsign
1aa10 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
1aa20 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 61  y_num);......pVa
1aa30 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a  lue = ucTmpBuf;.
1aa40 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75  ......if (ulValu
1aa50 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75  eLen >= sizeof(u
1aa60 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09  cTmpBuf)) {.....
1aa70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30  ..ulValueLen = 0
1aa80 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  ;.......pValue =
1aa90 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09   NULL;......}...
1aaa0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
1aab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1aac0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
1aad0 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
1aae0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1aaf0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1ab00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1ab10 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09   CKA_VALUE:.....
1ab20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ab30 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1ab40 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41  attribute CKA_VA
1ab50 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUE (0x%08lx) ..
1ab60 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1ab70 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1ab80 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68  pe);......switch
1ab90 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b   (objectclass) {
1aba0 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
1abb0 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09  RIVATE_KEY:.....
1abc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1abd0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1abe0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1abf0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1ac00 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a  private key.");.
1ac10 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1ac20 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53  ...case CKO_NETS
1ac30 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09  CAPE_TRUST:.....
1ac40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ac50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1ac60 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1ac70 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
1ac80 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1ac90 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09  bject");........
1aca0 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
1acb0 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a   CKO_PUBLIC_KEY:
1acc0 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69  .......if (certi
1acd0 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1ace0 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72   {........x509_r
1acf0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
1ad00 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69  o_pubkey(certifi
1ad10 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
1ad20 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
1ad30 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39  ........if (x509
1ad40 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
1ad50 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65   .........pValue
1ad60 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09   = NULL;........
1ad70 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
1ad80 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
1ad90 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
1ada0 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09  ....}.......}...
1adb0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1adc0 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46  .case CKO_CERTIF
1add0 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61  ICATE:.......pVa
1ade0 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74  lue = certificat
1adf0 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65  e;.......ulValue
1ae00 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74  Len = certificat
1ae10 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72  e_len;........br
1ae20 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1ae30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ae40 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1ae50 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
1ae60 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1ae70 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1ae80 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1ae90 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52  .case CKA_ISSUER
1aea0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1aeb0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1aec0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1aed0 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30  CKA_ISSUER (0x%0
1aee0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1aef0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1af00 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1af10 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1af20 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
1af30 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
1af40 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
1af50 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1af60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1af70 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1af80 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1af90 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
1afa0 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f   a certificate o
1afb0 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  r Netscape trust
1afc0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
1afd0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
1afe0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
1aff0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
1b000 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
1b010 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75  t = x509_to_issu
1b020 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  er(certificate, 
1b030 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
1b040 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
1b050 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
1b060 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
1b070 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
1b080 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1b090 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
1b0a0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
1b0b0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
1b0c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b0d0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
1b0e0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
1b0f0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1b100 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1b110 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1b120 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
1b130 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43  _NUMBER:.....CAC
1b140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b150 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
1b160 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41  ribute CKA_SERIA
1b170 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c  L_NUMBER (0x%08l
1b180 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1b190 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1b1a0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1b1b0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
1b1c0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
1b1d0 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
1b1e0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
1b1f0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1b200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b210 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1b220 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1b230 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1b240 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20   certificate or 
1b250 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
1b260 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
1b270 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
1b280 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
1b290 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
1b2a0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
1b2b0 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c  = x509_to_serial
1b2c0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
1b2d0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
1b2e0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
1b2f0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
1b300 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
1b310 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1b320 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1b330 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
1b340 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
1b350 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
1b360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b370 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1b380 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
1b390 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1b3a0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1b3b0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1b3c0 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
1b3d0 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
1b3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b3f0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b400 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78   CKA_SUBJECT (0x
1b410 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1b420 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1b430 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1b440 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1b450 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
1b460 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
1b470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b480 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
1b490 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
1b4a0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
1b4b0 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a  certificate");..
1b4c0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1b4d0 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
1b4e0 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
1b4f0 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
1b500 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
1b510 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
1b520 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
1b530 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
1b540 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
1b550 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
1b560 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
1b570 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
1b580 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
1b590 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
1b5a0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
1b5b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1b5c0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
1b5d0 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
1b5e0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
1b5f0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
1b600 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
1b610 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49  k;....case CKA_I
1b620 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
1b630 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1b640 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1b650 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78   CKA_ID (0x%08lx
1b660 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
1b670 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
1b680 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
1b690 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
1b6a0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1b6b0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1b6c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b6d0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1b6e0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1b6f0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
1b700 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
1b710 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
1b720 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70  ....}......ucTmp
1b730 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74  Buf[0] = ((ident
1b740 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20  ity_num + 1) >> 
1b750 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75  8) & 0xff;.....u
1b760 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69  cTmpBuf[1] =  (i
1b770 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
1b780 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56   & 0xff;......pV
1b790 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66  alue = &ucTmpBuf
1b7a0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
1b7b0 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45   = 2;......CACKE
1b7c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b7d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1b7e0 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1b7f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1b800 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1b810 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
1b820 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
1b830 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45  _TYPE:.....CACKE
1b840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b850 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
1b860 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49  bute CKA_CERTIFI
1b870 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38  CATE_TYPE (0x%08
1b880 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
1b890 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
1b8a0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
1b8b0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1b8c0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
1b8d0 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
1b8e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b8f0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
1b900 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
1b910 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
1b920 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09  tificate.");....
1b930 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
1b940 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
1b950 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74  support one cert
1b960 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a  ificate type */.
1b970 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61  ....ck_certifica
1b980 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f  te_type = CKC_X_
1b990 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  509;......pValue
1b9a0 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61   = &ck_certifica
1b9b0 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  te_type;.....ulV
1b9c0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
1b9d0 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  (ck_certificate_
1b9e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  type);......CACK
1b9f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ba00 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1ba10 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20  CKC_X_509 (%lu) 
1ba20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
1ba30 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
1ba40 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
1ba50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  E *) pValue), pV
1ba60 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1ba70 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1ba80 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1ba90 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54  ..case CKA_KEY_T
1baa0 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPE:.....CACKEY_
1bab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1bac0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
1bad0 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20  te CKA_KEY_TYPE 
1bae0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
1baf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1bb00 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
1bb10 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1bb20 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
1bb30 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65  VATE_KEY && obje
1bb40 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
1bb50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
1bb60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bb70 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
1bb80 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
1bb90 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
1bba0 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  t a key.");.....
1bbb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1bbc0 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
1bbd0 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74  upport one key t
1bbe0 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65  ype */.....ck_ke
1bbf0 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41  y_type = CKK_RSA
1bc00 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
1bc10 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09  &ck_key_type;...
1bc20 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1bc30 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70  izeof(ck_key_typ
1bc40 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
1bc50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1bc60 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b  .. returning CKK
1bc70 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25  _RSA (%lu) (%p/%
1bc80 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
1bc90 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
1bca0 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
1bcb0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1bcc0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1bcd0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1bce0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1bcf0 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09  e CKA_SIGN:.....
1bd00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bd10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
1bd20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
1bd30 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  GN (0x%08lx) ...
1bd40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1bd50 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
1bd60 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
1bd70 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1bd80 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
1bd90 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
1bda0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
1bdb0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
1bdc0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
1bdd0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
1bde0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
1bdf0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
1be00 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
1be10 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
1be20 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
1be30 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
1be40 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
1be50 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
1be60 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
1be70 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
1be80 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
1be90 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
1bea0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
1beb0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
1bec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bed0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
1bee0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
1bef0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
1bf00 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
1bf10 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
1bf20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
1bf30 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
1bf40 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
1bf50 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
1bf60 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
1bf70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
1bf80 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
1bf90 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
1bfa0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1bfb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1bfc0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1bfd0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1bfe0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
1bff0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1c000 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c010 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1c020 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1c030 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1c040 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
1c050 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
1c060 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
1c070 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e  ..../* We curren
1c080 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  tly only support
1c090 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65   "Sign with Appe
1c0a0 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61  ndix" */.....pVa
1c0b0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
1c0c0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1c0d0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
1c0e0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
1c0f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
1c100 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
1c110 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
1c120 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
1c130 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
1c140 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
1c150 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
1c160 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
1c170 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
1c180 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41  _DECRYPT:.....CA
1c190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c1a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1c1b0 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52  tribute CKA_DECR
1c1c0 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPT (0x%08lx) ..
1c1d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
1c1e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
1c1f0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
1c200 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
1c210 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
1c220 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
1c230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1c240 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
1c250 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
1c260 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
1c270 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
1c280 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1c290 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
1c2a0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
1c2b0 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a  IVATE_KEY || obj
1c2c0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
1c2d0 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
1c2e0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1c2f0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
1c300 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
1c310 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
1c320 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
1c330 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
1c340 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
1c350 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
1c360 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
1c370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c380 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1c390 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
1c3a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c3b0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
1c3c0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
1c3d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c3e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
1c3f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
1c400 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a  e CKA_SENSITIVE:
1c410 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1c420 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1c430 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1c440 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78  KA_SENSITIVE (0x
1c450 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1c460 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c470 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1c480 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1c490 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1c4a0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1c4b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4c0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1c4d0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1c4e0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1c4f0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1c500 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1c510 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1c520 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
1c530 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
1c540 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
1c550 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
1c560 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1c570 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
1c580 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1c590 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
1c5a0 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
1c5b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1c5c0 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
1c5d0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1c5e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
1c5f0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
1c600 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
1c610 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
1c620 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
1c630 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1c640 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1c650 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1c660 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58  ;....case CKA_EX
1c670 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43  TRACTABLE:.....C
1c680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c690 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1c6a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54  ttribute CKA_EXT
1c6b0 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c  RACTABLE (0x%08l
1c6c0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
1c6d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
1c6e0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
1c6f0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
1c700 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
1c710 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
1c720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c730 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
1c740 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
1c750 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
1c760 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
1c770 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
1c780 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
1c790 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
1c7a0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
1c7b0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
1c7c0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
1c7d0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1c7e0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
1c7f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1c800 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
1c810 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
1c820 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
1c830 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
1c840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c850 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1c860 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1c870 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1c880 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
1c890 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1c8a0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1c8b0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1c8c0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1c8d0 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
1c8e0 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
1c8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
1c900 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
1c910 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78   CKA_MODULUS (0x
1c920 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1c930 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1c940 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1c950 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1c960 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1c970 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1c980 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c990 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1c9a0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1c9b0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1c9c0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1c9d0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1c9e0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1c9f0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
1ca00 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
1ca10 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
1ca20 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73   x509_to_modulus
1ca30 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
1ca40 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
1ca50 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
1ca60 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
1ca70 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
1ca80 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
1ca90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1caa0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
1cab0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
1cac0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
1cad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cae0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
1caf0 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
1cb00 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1cb10 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1cb20 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1cb30 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43  .case CKA_PUBLIC
1cb40 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43  _EXPONENT:.....C
1cb50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cb60 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
1cb70 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42  ttribute CKA_PUB
1cb80 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78  LIC_EXPONENT (0x
1cb90 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
1cba0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1cbb0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
1cbc0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
1cbd0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
1cbe0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
1cbf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cc00 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
1cc10 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
1cc20 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
1cc30 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
1cc40 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
1cc50 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
1cc60 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
1cc70 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
1cc80 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
1cc90 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e   x509_to_exponen
1cca0 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
1ccb0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
1ccc0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
1ccd0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
1cce0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
1ccf0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
1cd00 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1cd10 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
1cd20 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
1cd30 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
1cd40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cd50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
1cd60 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
1cd70 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
1cd80 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
1cd90 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
1cda0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
1cdb0 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55  _DIGITAL_SIGNATU
1cdc0 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  RE:....case CKA_
1cdd0 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49  TRUST_NON_REPUDI
1cde0 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43  ATION:....case C
1cdf0 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43  KA_TRUST_KEY_ENC
1ce00 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
1ce10 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54  se CKA_TRUST_DAT
1ce20 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a  A_ENCIPHERMENT:.
1ce30 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
1ce40 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a  T_KEY_AGREEMENT:
1ce50 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
1ce60 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e  ST_KEY_CERT_SIGN
1ce70 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
1ce80 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09  UST_CRL_SIGN:...
1ce90 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
1cea0 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09  SERVER_AUTH:....
1ceb0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
1cec0 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63  LIENT_AUTH:....c
1ced0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f  ase CKA_TRUST_CO
1cee0 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63  DE_SIGNING:....c
1cef0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ase CKA_TRUST_EM
1cf00 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a  AIL_PROTECTION:.
1cf10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1cf20 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
1cf30 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
1cf40 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25  A_TRUST_... (0x%
1cf50 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
1cf60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
1cf70 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
1cf80 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
1cf90 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61  rusted;.....ulVa
1cfa0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
1cfb0 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09  ck_trusted);....
1cfc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cfd0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
1cfe0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
1cff0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
1d000 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54  ong) *((CK_TRUST
1d010 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
1d020 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
1d030 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
1d040 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
1d050 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53  .case CKA_CERT_S
1d060 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  HA1_HASH:.....CA
1d070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d080 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
1d090 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
1d0a0 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30  _SHA1_HASH (0x%0
1d0b0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
1d0c0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
1d0d0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
1d0e0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
1d0f0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
1d100 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
1d110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d120 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
1d130 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
1d140 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
1d150 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
1d160 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
1d170 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
1d180 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61  ..SHA1Reset(&sha
1d190 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31  1_ctx);.....SHA1
1d1a0 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c  Input(&sha1_ctx,
1d1b0 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65   certificate, ce
1d1c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
1d1d0 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26  ....SHA1Result(&
1d1e0 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68  sha1_ctx, sha1_h
1d1f0 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ash);......pValu
1d200 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09  e = sha1_hash;..
1d210 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
1d220 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68  sizeof(sha1_hash
1d230 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
1d240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
1d250 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
1d260 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
1d270 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
1d280 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
1d290 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
1d2a0 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a  A_CERT_MD5_HASH:
1d2b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d2c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
1d2d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
1d2e0 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
1d2f0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
1d300 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1d310 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
1d320 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
1d330 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
1d340 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
1d350 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d360 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
1d370 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
1d380 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1d390 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20   not a Netscape 
1d3a0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1d3b0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1d3c0 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28  .}......MD5Init(
1d3d0 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d  &md5_ctx);.....M
1d3e0 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74  D5Update(&md5_ct
1d3f0 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20  x, certificate, 
1d400 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
1d410 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d  ;.....MD5Final(m
1d420 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74  d5_hash, &md5_ct
1d430 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  x);......pValue 
1d440 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09  = md5_hash;.....
1d450 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1d460 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a  eof(md5_hash);..
1d470 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1d480 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1d490 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1d4a0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1d4b0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1d4c0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1d4d0 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
1d4e0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1d4f0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1d500 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
1d510 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
1d520 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29  ..if (((CK_LONG)
1d530 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20   ulValueLen) != 
1d540 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20  ((CK_LONG) -1)) 
1d550 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72  {..../* Push cur
1d560 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20  r_attr onto the 
1d570 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72  stack */....curr
1d580 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72  _attr.type = cur
1d590 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09  r_attr_type;....
1d5a0 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1d5b0 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
1d5c0 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  n;.....curr_attr
1d5d0 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
1d5e0 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  (curr_attr.ulVal
1d5f0 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70  ueLen);....memcp
1d600 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  y(curr_attr.pVal
1d610 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72  ue, pValue, curr
1d620 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1d630 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75  );.....if (pValu
1d640 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65  e_free && pValue
1d650 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61  ) {.....free(pVa
1d660 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  lue);....}.....i
1d670 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72  f (numattrs >= r
1d680 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09  etval_count) {..
1d690 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
1d6a0 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
1d6b0 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
1d6c0 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09  f(*retval));....
1d6d0 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65  }.....memcpy(&re
1d6e0 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20  tval[numattrs], 
1d6f0 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65  &curr_attr, size
1d700 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a  of(curr_attr));.
1d710 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09  ...numattrs++;..
1d720 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61  .}..}...if (numa
1d730 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72  ttrs != 0) {...r
1d740 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75  etval_count = nu
1d750 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c  mattrs;...retval
1d760 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
1d770 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
1d780 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
1d790 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ));..} else {...
1d7a0 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09  free(retval);...
1d7b0 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a  .retval = NULL;.
1d7c0 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
1d7d0 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43   numattrs;...CAC
1d7e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d7f0 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  ("Returning %lu 
1d800 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20  objects (%p).", 
1d810 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20  numattrs, (void 
1d820 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  *) retval);...re
1d830 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1d840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
1d850 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
1d860 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
1d870 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1d880 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
1d890 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73   long identities
1d8a0 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  _count) {..CK_AT
1d8b0 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
1d8c0 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  tr;..unsigned lo
1d8d0 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f  ng id_idx, attr_
1d8e0 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  idx;...if (ident
1d8f0 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ities == NULL ||
1d900 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1d910 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t == 0) {...retu
1d920 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
1d930 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78  _idx = 0; id_idx
1d940 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f   < identities_co
1d950 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b  unt; id_idx++) {
1d960 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1d970 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1d980 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28  utes) {....for (
1d990 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
1d9a0 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
1d9b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1d9c0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74  ibutes_count; at
1d9d0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
1d9e0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65  curr_attr = &ide
1d9f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1da00 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f  attributes[attr_
1da10 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63  idx];......if (c
1da20 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1da30 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
1da40 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
1da50 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
1da60 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
1da70 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1da80 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69  es) {.....free(i
1da90 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1daa0 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
1dab0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
1dac0 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69  ree_certs(identi
1dad0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1dae0 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31  c_identity, 1, 1
1daf0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65  );...}..}...free
1db00 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a  (identities);.}.
1db10 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
1db20 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61   long cackey_rea
1db30 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1db40 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
1db50 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1db60 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
1db70 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ng num_dod_certs
1db80 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
1db90 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f  ng cert_idx, id_
1dba0 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69  idx = 0;...if (i
1dbb0 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
1dbc0 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75  L) {...return(nu
1dbd0 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29  m_dod_certs * 3)
1dbe0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74  ;..}...for (cert
1dbf0 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69  _idx = 0; cert_i
1dc00 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  dx < num_dod_cer
1dc10 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1dc20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  {...identities[i
1dc30 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1dc40 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1dc50 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1dc60 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1dc70 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1dc80 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49  utes(CKO_CERTIFI
1dc90 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72  CATE, &extra_cer
1dca0 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
1dcb0 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
1dcc0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1dcd0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1dce0 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
1dcf0 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65  ++;....identitie
1dd00 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1dd10 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
1dd20 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1dd30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1dd40 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1dd50 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c  ributes(CKO_PUBL
1dd60 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63  IC_KEY, &extra_c
1dd70 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
1dd80 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
1dd90 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1dda0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1ddb0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
1ddc0 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74  dx++;....identit
1ddd0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1dde0 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
1ddf0 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ;...identities[i
1de00 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1de10 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1de20 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45  ttributes(CKO_NE
1de30 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65  TSCAPE_TRUST, &e
1de40 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
1de50 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
1de60 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1de70 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1de80 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1de90 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a  ..id_idx++;..}..
1dea0 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b  .return(id_idx);
1deb0 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  .}..static struc
1dec0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1ded0 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69  y *cackey_read_i
1dee0 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
1def0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
1df00 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ot, unsigned lon
1df10 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a  g *ids_found) {.
1df20 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
1df30 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
1df40 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
1df50 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1df60 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
1df70 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
1df80 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69  ng num_ids, id_i
1df90 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65  dx, curr_id_type
1dfa0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1dfb0 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f   num_certs, num_
1dfc0 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f  dod_certs, cert_
1dfd0 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64  idx;..int includ
1dfe0 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1dff0 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  0, include_dod_c
1e000 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  erts;...CACKEY_D
1e010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1e020 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64  led.");...if (id
1e030 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29  s_found == NULL)
1e040 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e050 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e060 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e    ids_found is N
1e070 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
1e080 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64  (NULL);..}..#ifd
1e090 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53  ef CACKEY_CARD_S
1e0a0 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52  LOT_INCLUDE_EXTR
1e0b0 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65  A_CERTS..include
1e0c0 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
1e0d0 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67  ;.#endif...if (g
1e0e0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f  etenv("CACKEY_DO
1e0f0 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
1e100 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
1e110 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
1e120 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a  _certs = 1;..}..
1e130 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1e140 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53  KEY_NO_DOD_CERTS
1e150 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
1e160 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1e170 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1e180 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  = 0;..}..#ifdef 
1e190 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1e1a0 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e  CERTS..if (geten
1e1b0 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f  v("CACKEY_EXTRA_
1e1c0 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1e1d0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1e1e0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65  _certs = 1;..} e
1e1f0 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1e200 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1e210 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74  }.#else..if (get
1e220 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45  env("CACKEY_NO_E
1e230 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20  XTRA_CERTS") != 
1e240 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1e250 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  e_dod_certs = 0;
1e260 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63  ..} else {...inc
1e270 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1e280 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09   1;..}.#endif...
1e290 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  if (include_dod_
1e2a0 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 64  certs) {...num_d
1e2b0 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f  od_certs = sizeo
1e2c0 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f  f(extra_certs) /
1e2d0 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65   sizeof(extra_ce
1e2e0 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 65  rts[0]);..} else
1e2f0 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
1e300 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 0;..}...if 
1e310 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
1e320 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63   {...num_ids = c
1e330 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1e340 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20  dentities(NULL, 
1e350 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1e360 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21  ...if (num_ids !
1e370 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69  = 0) {....identi
1e380 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1e390 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1e3a0 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1e3b0 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1e3c0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1e3d0 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64  ntities, num_dod
1e3e0 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73  _certs);...} els
1e3f0 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65  e {....identitie
1e400 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  s = NULL;...}...
1e410 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75  .*ids_found = nu
1e420 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e  m_ids;....return
1e430 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d  (identities);..}
1e440 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
1e450 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1e460 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
1e470 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
1e480 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
1e490 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
1e4a0 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d  ../* Convert num
1e4b0 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20  ber of Certs to 
1e4c0 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
1e4d0 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  s */...num_ids =
1e4e0 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45   (CKO_PRIVATE_KE
1e4f0 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  Y - CKO_CERTIFIC
1e500 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63  ATE + 1) * num_c
1e510 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63  erts;....if (inc
1e520 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1e530 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b  ) {....num_ids +
1e540 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  = cackey_read_do
1e550 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c  d_identities(NUL
1e560 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  L, num_dod_certs
1e570 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69  );...}....identi
1e580 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1e590 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1e5a0 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1e5b0 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63  ./* Add certific
1e5c0 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79  ates, public key
1e5d0 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b  s, and private k
1e5e0 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61  eys from the sma
1e5f0 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69  rtcard */...id_i
1e600 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
1e610 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
1e620 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
1e630 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
1e640 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
1e650 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
1e660 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
1e670 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
1e680 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
1e690 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
1e6a0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1e6b0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1e6c0 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1e6d0 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
1e6e0 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
1e6f0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1e700 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1e710 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1e720 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1e730 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1e740 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1e750 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
1e760 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1e770 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1e780 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  identity));.....
1e790 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
1e7a0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1e7b0 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69  dentity, &pcsc_i
1e7c0 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1e7d0 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65  dx], sizeof(*ide
1e7e0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1e7f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
1e800 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1e810 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1e820 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1e830 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ate = malloc(pcs
1e840 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1e850 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
1e860 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
1e870 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69  cpy(identities[i
1e880 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1e890 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
1e8a0 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
1e8b0 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1e8c0 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
1e8d0 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1e8e0 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
1e8f0 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64  len);......id_id
1e900 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  x++;....}...}...
1e910 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74  .if (include_ext
1e920 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43  ra_certs) {....C
1e930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e940 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53  TF("Including US
1e950 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74   Government Cert
1e960 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64  ificates on hard
1e970 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09  ware slot");....
1e980 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1e990 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1e9a0 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c  tities + id_idx,
1e9b0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1e9c0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
1e9d0 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
1e9e0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
1e9f0 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64  erts, 1);....*id
1ea00 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64  s_found = num_id
1ea10 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65  s;....return(ide
1ea20 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 2a  ntities);..}...*
1ea30 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09  ids_found = 0;..
1ea40 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a  return(NULL);.}.
1ea50 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
1ea60 65 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69  et cackey_get_pi
1ea70 6e 28 63 68 61 72 20 2a 70 69 6e 62 75 66 29 20  n(char *pinbuf) 
1ea80 7b 0a 09 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a  {..FILE *pinfd;.
1ea90 09 63 68 61 72 20 2a 66 67 65 74 73 5f 72 65 74  .char *fgets_ret
1eaa0 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72 65  ;..int pclose_re
1eab0 74 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  t;...if (cackey_
1eac0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
1ead0 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1eae0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
1eaf0 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20  NERIC);..}...if 
1eb00 28 70 69 6e 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  (pinbuf == NULL)
1eb10 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
1eb20 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
1eb30 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
1eb40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
1eb50 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1eb60 20 3d 20 25 73 22 2c 20 63 61 63 6b 65 79 5f 70   = %s", cackey_p
1eb70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 0a 09 70  in_command);...p
1eb80 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28 63 61 63  infd = popen(cac
1eb90 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c  key_pin_command,
1eba0 20 22 72 22 29 3b 0a 09 69 66 20 28 70 69 6e 66   "r");..if (pinf
1ebb0 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
1ebc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ebd0 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20  TF("Error.  %s: 
1ebe0 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22 2c 20  Unable to run", 
1ebf0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1ec00 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nd);....return(C
1ec10 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
1ec20 50 49 4e 29 3b 0a 09 7d 0a 0a 09 66 67 65 74 73  PIN);..}...fgets
1ec30 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 69 6e  _ret = fgets(pin
1ec40 62 75 66 2c 20 33 32 2c 20 70 69 6e 66 64 29 3b  buf, 32, pinfd);
1ec50 0a 09 69 66 20 28 66 67 65 74 73 5f 72 65 74 20  ..if (fgets_ret 
1ec60 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 69 6e  == NULL) {...pin
1ec70 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09  buf[0] = '\0';..
1ec80 7d 0a 0a 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d  }...pclose_ret =
1ec90 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b 0a   pclose(pinfd);.
1eca0 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20  .if (pclose_ret 
1ecb0 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e 6f 20 3d  == -1 && errno =
1ecc0 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09 09 43 41  = ECHILD) {...CA
1ecd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ece0 46 28 22 4e 6f 74 69 63 65 2e 20 20 70 63 6c 6f  F("Notice.  pclo
1ecf0 73 65 28 29 20 69 6e 64 69 63 61 74 65 64 20 69  se() indicated i
1ed00 74 20 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  t could not get 
1ed10 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
1ed20 65 20 63 68 69 6c 64 2c 20 61 73 73 75 6d 69 6e  e child, assumin
1ed30 67 20 69 74 20 73 75 63 63 65 65 65 64 65 64 20  g it succeeeded 
1ed40 21 22 29 3b 0a 0a 09 09 70 63 6c 6f 73 65 5f 72  !");....pclose_r
1ed50 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  et = 0;..}...if 
1ed60 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30  (pclose_ret != 0
1ed70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ed80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ed90 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77 69  .  %s: exited wi
1eda0 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61 74  th non-zero stat
1edb0 75 73 20 6f 66 20 25 69 22 2c 20 63 61 63 6b 65  us of %i", cacke
1edc0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 2c 20 70  y_pin_command, p
1edd0 63 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09 72  close_ret);....r
1ede0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
1edf0 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 7d 0a  C_E_BADPIN);..}.
1ee00 0a 09 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e  ..if (strlen(pin
1ee10 62 75 66 29 20 3c 20 31 29 20 7b 0a 09 09 43 41  buf) < 1) {...CA
1ee20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee30 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72  F("Error.  %s: r
1ee40 65 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22  eturned no data"
1ee50 2c 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  , cackey_pin_com
1ee60 6d 61 6e 64 29 3b 0a 0a 09 09 72 65 74 75 72 6e  mand);....return
1ee70 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
1ee80 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 69 66 20  ADPIN);..}...if 
1ee90 28 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70  (pinbuf[strlen(p
1eea0 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27  inbuf) - 1] == '
1eeb0 5c 6e 27 29 20 7b 0a 09 09 70 69 6e 62 75 66 5b  \n') {...pinbuf[
1eec0 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d  strlen(pinbuf) -
1eed0 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 7d 0a 0a   1] = '\0';..}..
1eee0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
1eef0 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  CSC_S_OK);.}..CK
1ef00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1ef10 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61  (CK_RV, C_Initia
1ef20 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
1ef30 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09  R pInitArgs) {..
1ef40 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CK_C_INITIALIZE_
1ef50 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73  ARGS CK_PTR args
1ef60 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c  ;..uint32_t idx,
1ef70 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09   highest_slot;..
1ef80 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72  int mutex_init_r
1ef90 65 74 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65  et;..int include
1efa0 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41  _dod_certs;...CA
1efb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1efc0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1efd0 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69  if (cackey_initi
1efe0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1eff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f000 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79  "Error.  Already
1f010 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f020 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f030 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f  RYPTOKI_ALREADY_
1f040 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f050 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67 73  ...if (pInitArgs
1f060 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72   != NULL) {...ar
1f070 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a  gs = pInitArgs;.
1f080 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79  ..memcpy(&cackey
1f090 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a  _args, args, siz
1f0a0 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29  eof(cackey_args)
1f0b0 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e  );....if (args->
1f0c0 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e  CreateMutex == N
1f0d0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73  ULL || args->Des
1f0e0 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  troyMutex == NUL
1f0f0 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d  L || args->LockM
1f100 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
1f110 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65  args->UnlockMute
1f120 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  x == NULL) {....
1f130 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
1f140 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
1f150 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
1f160 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1f170 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21  rgs->LockMutex !
1f180 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1f190 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  UnlockMutex != N
1f1a0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
1f1b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f1c0 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74  Error. Some, but
1f1d0 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69   not All threadi
1f1e0 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70 72  ng primitives pr
1f1f0 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09  ovided.");......
1f200 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1f210 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a  ENTS_BAD);....}.
1f220 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
1f230 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
1f240 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  teMutex = NULL;.
1f250 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65  ..cackey_args.De
1f260 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c  stroyMutex = NUL
1f270 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1f280 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  .LockMutex = NUL
1f290 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1f2a0 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e  .UnlockMutex = N
1f2b0 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
1f2c0 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  gs.flags = 0;..}
1f2d0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
1f2e0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1f2f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1f300 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f310 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1f320 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79  dx++) {...cackey
1f330 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1f340 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
1f350 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1f360 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1f370 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1f380 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1f390 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
1f3a0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f3b0 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
1f3c0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f3d0 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  x].pcsc_reader =
1f3e0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1f3f0 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
1f400 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
1f410 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1f420 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
1f430 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
1f440 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1f450 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
1f460 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  et = 0;...cackey
1f470 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65  _slots[idx].toke
1f480 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63  n_flags = 0;...c
1f490 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1f4a0 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
1f4b0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1f4c0 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b  x].internal = 0;
1f4d0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1f4e0 69 64 78 5d 2e 69 64 5f 74 79 70 65 5f 68 69 6e  idx].id_type_hin
1f4f0 74 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  t = CACKEY_ID_TY
1f500 50 45 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 7d 0a 0a  PE_UNKNOWN;..}..
1f510 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f  #ifdef CACKEY_NO
1f520 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66  _EXTRA_CERTS..if
1f530 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1f540 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1f550 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1f560 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1f570 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  1;..} else {...i
1f580 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1f590 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09   = 0;..}.#else..
1f5a0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1f5b0 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
1f5c0 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1f5d0 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1f5e0 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  ts = 0;..} else 
1f5f0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1f600 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65  certs = 1;..}.#e
1f610 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75  ndif...if (inclu
1f620 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20  de_dod_certs == 
1f630 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1f640 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65  BUG_PRINTF("Aske
1f650 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65  d not to include
1f660 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 65   DoD certificate
1f670 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  s");..} else {..
1f680 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20  .highest_slot = 
1f690 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1f6a0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1f6b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1f6c0 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   - 1;....CACKEY_
1f6d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
1f6e0 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74  cluding DoD cert
1f6f0 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20  s in slot %lu", 
1f700 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1f710 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a  highest_slot);..
1f720 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1f730 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74  ighest_slot].act
1f740 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65  ive = 1;...cacke
1f750 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1f760 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
1f770 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   1;...cackey_slo
1f780 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1f790 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e  .label = (unsign
1f7a0 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 47  ed char *) "US G
1f7b0 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66  overnment Certif
1f7c0 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65  icates";...cacke
1f7d0 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1f7e0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1f7f0 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09  r = "CACKey";...
1f800 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1f810 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  hest_slot].token
1f820 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _flags = 0;..}..
1f830 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1f840 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21  zed = 1;...if (!
1f850 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
1f860 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69  nit) {...mutex_i
1f870 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  nit_ret = cackey
1f880 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63  _mutex_create(&c
1f890 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f8a0 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69  ...if (mutex_ini
1f8b0 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
1f8c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f8d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75  INTF("Error.  Mu
1f8e0 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tex initializati
1f8f0 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  on failed.");...
1f900 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e  ..return(CKR_CAN
1f910 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09  T_LOCK);...}....
1f920 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
1f930 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a  nit = 1;..}.../*
1f940 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e   Define a comman
1f950 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72  d to prompt user
1f960 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69   for a PIN */.#i
1f970 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f  fdef CACKEY_PIN_
1f980 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a  COMMAND_DEFAULT.
1f990 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1f9a0 61 6e 64 20 3d 20 73 74 72 64 75 70 28 43 41 43  and = strdup(CAC
1f9b0 4b 45 59 5f 4d 41 43 52 4f 5f 44 45 46 41 55 4c  KEY_MACRO_DEFAUL
1f9c0 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49  T_XSTR(CACKEY_PI
1f9d0 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c  N_COMMAND_DEFAUL
1f9e0 54 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  T));.#endif..#if
1f9f0 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43  def CACKEY_PIN_C
1fa00 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46  OMMAND_XONLY_DEF
1fa10 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76  AULT..if (getenv
1fa20 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e  ("DISPLAY") != N
1fa30 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1fa40 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 73 74  pin_command = st
1fa50 72 64 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52  rdup(CACKEY_MACR
1fa60 4f 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  O_DEFAULT_XSTR(C
1fa70 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1fa80 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29  D_XONLY_DEFAULT)
1fa90 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69  );..}.#endif...i
1faa0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1fab0 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20  Y_PIN_COMMAND") 
1fac0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1fad0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1fae0 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76 28  = strdup(getenv(
1faf0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1fb00 41 4e 44 22 29 29 3b 0a 09 7d 0a 0a 09 69 66 20  AND"));..}...if 
1fb10 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1fb20 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c  PIN_COMMAND_XONL
1fb30 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67  Y") != NULL && g
1fb40 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29  etenv("DISPLAY")
1fb50 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   != NULL) {...ca
1fb60 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1fb70 20 3d 20 73 74 72 64 75 70 28 67 65 74 65 6e 76   = strdup(getenv
1fb80 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1fb90 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 29 3b 0a 09  MAND_XONLY"));..
1fba0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  }...if (cackey_p
1fbb0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 26 26 20 73 74  in_command && st
1fbc0 72 63 6d 70 28 63 61 63 6b 65 79 5f 70 69 6e 5f  rcmp(cackey_pin_
1fbd0 63 6f 6d 6d 61 6e 64 2c 20 22 22 29 20 3d 3d 20  command, "") == 
1fbe0 30 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  0) {...free(cack
1fbf0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 29 3b  ey_pin_command);
1fc00 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  ...cackey_pin_co
1fc10 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  mmand = NULL;..}
1fc20 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1fc30 52 45 41 44 45 52 53 5f 49 4e 43 4c 55 44 45 5f  READERS_INCLUDE_
1fc40 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61  ONLY_DEFAULT..ca
1fc50 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63  ckey_readers_inc
1fc60 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72 64  lude_only = strd
1fc70 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1fc80 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1fc90 4b 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c  KEY_READERS_INCL
1fca0 55 44 45 5f 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  UDE_ONLY_DEFAULT
1fcb0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ));.#endif..#ifd
1fcc0 65 66 20 43 41 43 4b 45 59 5f 52 45 41 44 45 52  ef CACKEY_READER
1fcd0 53 5f 45 58 43 4c 55 44 45 5f 44 45 46 41 55 4c  S_EXCLUDE_DEFAUL
1fce0 54 0a 09 63 61 63 6b 65 79 5f 72 65 61 64 65 72  T..cackey_reader
1fcf0 73 5f 65 78 63 6c 75 64 65 20 3d 20 73 74 72 64  s_exclude = strd
1fd00 75 70 28 43 41 43 4b 45 59 5f 4d 41 43 52 4f 5f  up(CACKEY_MACRO_
1fd10 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43  DEFAULT_XSTR(CAC
1fd20 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43 4c  KEY_READERS_EXCL
1fd30 55 44 45 5f 44 45 46 41 55 4c 54 29 29 3b 0a 23  UDE_DEFAULT));.#
1fd40 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65  endif...if (gete
1fd50 6e 76 28 22 43 41 43 4b 45 59 5f 52 45 41 44 45  nv("CACKEY_READE
1fd60 52 53 5f 49 4e 43 4c 55 44 45 5f 4f 4e 4c 59 22  RS_INCLUDE_ONLY"
1fd70 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1fd80 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e  ackey_readers_in
1fd90 63 6c 75 64 65 5f 6f 6e 6c 79 20 3d 20 73 74 72  clude_only = str
1fda0 64 75 70 28 67 65 74 65 6e 76 28 22 43 41 43 4b  dup(getenv("CACK
1fdb0 45 59 5f 52 45 41 44 45 52 53 5f 49 4e 43 4c 55  EY_READERS_INCLU
1fdc0 44 45 5f 4f 4e 4c 59 22 29 29 3b 0a 0a 09 09 69  DE_ONLY"));....i
1fdd0 66 20 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72  f (cackey_reader
1fde0 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 5b 30  s_include_only[0
1fdf0 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 09 09  ] == '\0') {....
1fe00 66 72 65 65 28 63 61 63 6b 65 79 5f 72 65 61 64  free(cackey_read
1fe10 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79  ers_include_only
1fe20 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1fe30 61 64 65 72 73 5f 69 6e 63 6c 75 64 65 5f 6f 6e  aders_include_on
1fe40 6c 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ly = NULL;...}..
1fe50 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1fe60 43 41 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45  CACKEY_READERS_E
1fe70 58 43 4c 55 44 45 22 29 20 21 3d 20 4e 55 4c 4c  XCLUDE") != NULL
1fe80 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 72 65 61  ) {...cackey_rea
1fe90 64 65 72 73 5f 65 78 63 6c 75 64 65 20 3d 20 73  ders_exclude = s
1fea0 74 72 64 75 70 28 67 65 74 65 6e 76 28 22 43 41  trdup(getenv("CA
1feb0 43 4b 45 59 5f 52 45 41 44 45 52 53 5f 45 58 43  CKEY_READERS_EXC
1fec0 4c 55 44 45 22 29 29 3b 0a 0a 09 09 69 66 20 28  LUDE"));....if (
1fed0 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65  cackey_readers_e
1fee0 78 63 6c 75 64 65 5b 30 5d 20 3d 3d 20 27 5c 30  xclude[0] == '\0
1fef0 27 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  ') {....free(cac
1ff00 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63 6c  key_readers_excl
1ff10 75 64 65 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ude);.....cackey
1ff20 5f 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65  _readers_exclude
1ff30 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1ff40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ff50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ff60 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1ff70 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1ff80 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1ff90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ffa0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
1ffb0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
1ffc0 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
1ffd0 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
1ffe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fff0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20000 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
20010 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
20020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20030 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
20040 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
20050 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
20060 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
20070 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20080 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
200a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
200b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
200c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
200d0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
200e0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
200f0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
20100 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20110 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20120 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20130 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
20140 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
20150 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
20160 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
20170 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
20180 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
20190 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
201a0 74 5f 61 6c 6c 28 31 29 3b 0a 0a 09 66 6f 72 20  t_all(1);...for 
201b0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
201c0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
201d0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
201e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
201f0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
20200 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
20210 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
20220 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
20230 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
20240 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
20250 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b  certs) {....cack
20260 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61  ey_free_certs(ca
20270 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
20280 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61  cached_certs, ca
20290 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
202a0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
202b0 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b  nt, 1);.....cack
202c0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
202d0 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
202e0 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  L;...}..}...cack
202f0 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
20300 63 74 28 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  ct();...if (cack
20310 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
20320 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65 65  = NULL) {...free
20330 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
20340 61 6e 64 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  and);....cackey_
20350 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55  pin_command = NU
20360 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  LL;..}...if (cac
20370 6b 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c  key_readers_incl
20380 75 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c  ude_only != NULL
20390 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
203a0 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
203b0 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 63 61 63 6b  e_only);....cack
203c0 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
203d0 64 65 5f 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  de_only = NULL;.
203e0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
203f0 72 65 61 64 65 72 73 5f 65 78 63 6c 75 64 65 20  readers_exclude 
20400 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 72 65  != NULL) {...fre
20410 65 28 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73  e(cackey_readers
20420 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 63 61  _exclude);....ca
20430 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
20440 6c 75 64 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  lude = NULL;..}.
20450 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
20460 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
20470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20480 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20490 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
204a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
204b0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
204c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
204d0 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
204e0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
204f0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
20500 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
20510 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
20520 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
20530 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
20540 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
20550 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
20560 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20570 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20580 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
20590 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
205a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
205b0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
205c0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
205d0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
205e0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
205f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20600 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20620 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20630 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20640 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20650 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20660 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
20670 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
20680 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
20690 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
206a0 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
206b0 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
206c0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
206d0 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
206e0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
206f0 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
20700 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
20710 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
20720 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
20730 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
20740 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
20750 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
20760 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
20770 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
20780 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
20790 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
207a0 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
207b0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
207c0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
207d0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
207e0 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
207f0 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
20800 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
20810 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
20820 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
20830 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
20840 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
20850 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
20860 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
20870 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
20880 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
20890 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
208a0 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
208b0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
208c0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
208d0 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
208e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
208f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20900 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
20910 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
20920 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
20930 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
20940 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
20950 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
20960 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
20970 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
20980 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20990 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
209a0 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
209b0 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
209c0 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
209d0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
209e0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
209f0 61 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63  atic int first_c
20a00 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  all = 1;..int mu
20a10 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
20a20 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
20a30 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75  t;..CK_ULONG cou
20a40 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  nt, slot_count =
20a50 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c   0, currslot, sl
20a60 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70  ot_idx;..char *p
20a70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63  csc_readers, *pc
20a80 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70  sc_readers_s, *p
20a90 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09  csc_readers_e;..
20aa0 63 68 61 72 20 2a 72 65 61 64 65 72 5f 63 68 65  char *reader_che
20ab0 63 6b 5f 70 61 74 74 65 72 6e 3b 0a 09 44 57 4f  ck_pattern;..DWO
20ac0 52 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f  RD pcsc_readers_
20ad0 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  len;..LONG scard
20ae0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
20af0 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72  ;..size_t curr_r
20b00 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20  eader_len;..int 
20b10 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 09 69 6e 74  slot_reset;..int
20b20 20 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 3b   include_reader;
20b30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20b40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20b50 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  );...if (pulCoun
20b60 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
20b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20b80 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f  TF("Error. pulCo
20b90 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
20ba0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
20bb0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
20bc0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20bd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20bf0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20c00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20c10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20c20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20c30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d  IALIZED);..}...m
20c40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20c50 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
20c60 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20c70 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20c80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20ca0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
20cb0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20cc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20cd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20ce0 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66  /* Clear list of
20cf0 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f   slots */..slot_
20d00 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28  reset = 0;..if (
20d10 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69  pSlotList) {...i
20d20 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b  f (first_call) {
20d30 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d  ....first_call =
20d40 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73   0;.....slot_res
20d50 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f  et = 1;...}..../
20d60 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
20d70 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20  slots have been 
20d80 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67 65  reset then purge
20d90 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
20da0 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e   and check again
20db0 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73   */...for (currs
20dc0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
20dd0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
20de0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
20df0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
20e00 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
20e10 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
20e20 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20e30 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
20e40 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
20e50 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
20e60 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
20e70 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
20e80 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
20e90 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
20ea0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f  ts[currslot].slo
20eb0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73  t_reset) {.....s
20ec0 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a  lot_reset = 1;..
20ed0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
20ee0 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
20ef0 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  reset) {....CACK
20f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20f10 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f  "Purging all slo
20f20 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29  t information.")
20f30 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ;...../* Only up
20f40 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
20f50 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
20f60 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
20f70 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
20f80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
20f90 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
20fa0 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 31 29  isconnect_all(1)
20fb0 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73  ;.....for (currs
20fc0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
20fd0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
20fe0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
20ff0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
21000 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
21010 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
21020 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
21030 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
21040 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
21050 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ..}......cackey_
21060 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21070 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d  active = 0;....}
21080 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
21090 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
210a0 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
210b0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
210c0 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
210d0 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
210e0 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
210f0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
21100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21110 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
21120 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
21130 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
21140 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 73 22   hardware slots"
21150 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  );..} else {...p
21160 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
21170 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
21180 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
21190 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
211a0 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
211b0 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
211c0 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
211d0 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
211e0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
211f0 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
21200 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
21210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21220 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
21230 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
21240 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
21250 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
21260 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
21270 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
21280 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
21290 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
212a0 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
212b0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
212c0 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
212d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
212e0 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
212f0 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
21300 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
21310 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
21320 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
21330 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
21340 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
21350 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
21360 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
21370 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
21380 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
21390 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45 4e  RD_E_INSUFFICIEN
213a0 54 5f 42 55 46 46 45 52 29 20 7b 0a 09 09 09 43  T_BUFFER) {....C
213b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
213c0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
213d0 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
213e0 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49  turned SCARD_E_I
213f0 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46  NSUFFICIENT_BUFF
21400 45 52 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 69  ER, assuming thi
21410 73 20 69 73 20 61 20 62 75 67 20 28 65 2e 67 2e  s is a bug (e.g.
21420 2c 20 47 6f 6f 67 6c 65 20 50 43 53 43 29 20 61  , Google PCSC) a
21430 6e 64 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  nd allocating a 
21440 6d 61 73 73 69 76 65 20 61 6d 6f 75 6e 74 20 6f  massive amount o
21450 66 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  f space to hold 
21460 74 68 65 20 72 65 61 64 65 72 20 6c 69 73 74 2e  the reader list.
21470 22 29 3b 0a 0a 09 09 09 70 63 73 63 5f 72 65 61  ");.....pcsc_rea
21480 64 65 72 73 5f 6c 65 6e 20 3d 20 33 32 37 36 38  ders_len = 32768
21490 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
214a0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 41  eaders_ret = SCA
214b0 52 44 5f 53 5f 53 55 43 43 45 53 53 3b 0a 09 09  RD_S_SUCCESS;...
214c0 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c  }....if (scard_l
214d0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
214e0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
214f0 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72  S && pcsc_reader
21500 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09  s_len != 0) {...
21510 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20  .pcsc_readers = 
21520 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64  malloc(pcsc_read
21530 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73  ers_len);....pcs
21540 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63  c_readers_s = pc
21550 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09  sc_readers;.....
21560 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
21570 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
21580 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
21590 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
215a0 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  LL, pcsc_readers
215b0 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
215c0 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61  len);....if (sca
215d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
215e0 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
215f0 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73  CCESS) {.....pcs
21600 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63  c_readers_e = pc
21610 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73  sc_readers + pcs
21620 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a  c_readers_len;..
21630 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74  ..../* Start wit
21640 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20  h Slot ID 1, to 
21650 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47  avoid a bug in G
21660 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09  DM on RHEL */...
21670 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a  ../* Bug 594911:
21680 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
21690 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f  a.redhat.com/sho
216a0 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34  w_bug.cgi?id=594
216b0 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73  911 */.....currs
216c0 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 77 68 69  lot = 1;.....whi
216d0 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
216e0 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
216f0 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e  e) {....../* Fin
21700 64 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  d next available
21710 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f   slot */......fo
21720 72 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  r (; currslot < 
21730 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21740 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21750 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21760 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
21770 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
21780 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
21790 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
217a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
217b0 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63  }......}.......c
217c0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
217d0 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
217e0 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
217f0 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
21800 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
21810 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
21820 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
21830 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
21840 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
21850 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
21860 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
21870 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
21880 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
21890 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
218a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
218b0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
218c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
218d0 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
218e0 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
218f0 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
21900 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
21910 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
21920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21930 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
21940 72 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20  r: %s (currslot 
21950 3d 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65  = %lu)", pcsc_re
21960 61 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64  aders, (unsigned
21970 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29   long) currslot)
21980 3b 0a 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b  ;.......if (cack
21990 65 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75  ey_readers_inclu
219a0 64 65 5f 6f 6e 6c 79 20 21 3d 20 4e 55 4c 4c 29  de_only != NULL)
219b0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
219c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
219d0 6b 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f  ked to include o
219e0 6e 6c 79 20 72 65 61 64 65 72 73 20 6d 61 74 63  nly readers matc
219f0 68 69 6e 67 3a 20 25 73 22 2c 20 63 61 63 6b 65  hing: %s", cacke
21a00 79 5f 72 65 61 64 65 72 73 5f 69 6e 63 6c 75 64  y_readers_includ
21a10 65 5f 6f 6e 6c 79 29 3b 0a 0a 09 09 09 09 09 09  e_only);........
21a20 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
21a30 20 30 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   0;.......reader
21a40 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
21a50 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72 73 5f   cackey_readers_
21a60 69 6e 63 6c 75 64 65 5f 6f 6e 6c 79 3b 0a 09 09  include_only;...
21a70 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 63 61  ...} else if (ca
21a80 63 6b 65 79 5f 72 65 61 64 65 72 73 5f 65 78 63  ckey_readers_exc
21a90 6c 75 64 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  lude != NULL) {.
21aa0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
21ab0 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64  UG_PRINTF("Asked
21ac0 20 74 6f 20 65 78 63 6c 75 64 65 20 72 65 61 64   to exclude read
21ad0 65 72 73 20 6d 61 74 63 68 69 6e 67 3a 20 25 73  ers matching: %s
21ae0 22 2c 20 63 61 63 6b 65 79 5f 72 65 61 64 65 72  ", cackey_reader
21af0 73 5f 65 78 63 6c 75 64 65 29 3b 0a 0a 09 09 09  s_exclude);.....
21b00 09 09 09 69 6e 63 6c 75 64 65 5f 72 65 61 64 65  ...include_reade
21b10 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 72 65 61  r = 1;.......rea
21b20 64 65 72 5f 63 68 65 63 6b 5f 70 61 74 74 65 72  der_check_patter
21b30 6e 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 65  n = cackey_reade
21b40 72 73 5f 65 78 63 6c 75 64 65 3b 0a 09 09 09 09  rs_exclude;.....
21b50 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
21b60 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20 3d  include_reader =
21b70 20 31 3b 0a 09 09 09 09 09 09 72 65 61 64 65 72   1;.......reader
21b80 5f 63 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 3d  _check_pattern =
21b90 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 0a 09   NULL;......}...
21ba0 09 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 63  ....if (reader_c
21bb0 68 65 63 6b 5f 70 61 74 74 65 72 6e 20 21 3d 20  heck_pattern != 
21bc0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 69 66  NULL) {.......if
21bd0 20 28 73 74 72 73 74 72 28 70 63 73 63 5f 72 65   (strstr(pcsc_re
21be0 61 64 65 72 73 2c 20 72 65 61 64 65 72 5f 63 68  aders, reader_ch
21bf0 65 63 6b 5f 70 61 74 74 65 72 6e 29 20 21 3d 20  eck_pattern) != 
21c00 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09 09 43  NULL) {........C
21c10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21c20 54 46 28 22 54 68 69 73 20 72 65 61 64 65 72 20  TF("This reader 
21c30 6d 61 74 63 68 65 64 20 74 68 65 20 70 61 74 74  matched the patt
21c40 65 72 6e 2e 22 29 3b 0a 09 09 09 09 09 09 0a 09  ern.");.........
21c50 09 09 09 09 09 09 69 6e 63 6c 75 64 65 5f 72 65  ......include_re
21c60 61 64 65 72 20 3d 20 21 69 6e 63 6c 75 64 65 5f  ader = !include_
21c70 72 65 61 64 65 72 3b 0a 09 09 09 09 09 09 7d 0a  reader;.......}.
21c80 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
21c90 28 69 6e 63 6c 75 64 65 5f 72 65 61 64 65 72 20  (include_reader 
21ca0 21 3d 20 31 29 20 7b 0a 09 09 09 09 09 09 43 41  != 1) {.......CA
21cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21cc0 46 28 22 53 6b 69 70 70 69 6e 67 20 74 68 69 73  F("Skipping this
21cd0 20 72 65 61 64 65 72 2e 22 29 3b 0a 0a 09 09 09   reader.");.....
21ce0 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
21cf0 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  += curr_reader_l
21d00 65 6e 20 2b 20 31 3b 0a 0a 09 09 09 09 09 09 63  en + 1;........c
21d10 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 09 7d 0a  ontinue;......}.
21d20 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ....../* Only up
21d30 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
21d40 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
21d50 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
21d60 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65  asked supply the
21d70 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
21d80 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53  n */......if (pS
21d90 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09  lotList) {......
21da0 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
21db0 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79   {........cackey
21dc0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
21dd0 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
21de0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
21df0 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
21e00 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  nal = 0;........
21e10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
21e20 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
21e30 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63  er = strdup(pcsc
21e40 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09  _readers);......
21e50 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
21e60 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
21e70 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
21e80 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
21e90 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
21ea0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
21eb0 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  h = 0;........ca
21ec0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
21ed0 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
21ee0 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
21ef0 30 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61  0;........if (ca
21f00 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
21f10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
21f20 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
21f30 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
21f40 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
21f50 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
21f60 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
21f70 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
21f80 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65  s[currslot].toke
21f90 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09  n_flags = 0;....
21fa0 09 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63  ....}........cac
21fb0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
21fc0 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
21fd0 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  ;.........cackey
21fe0 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
21ff0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
22000 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09  urrslot]);......
22010 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
22020 0a 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b  .......if (!cack
22030 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
22040 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
22050 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61  ..../* Artificia
22060 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65  lly increase the
22070 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76   number of activ
22080 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20  e slots by what 
22090 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69  will become acti
220a0 76 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43  ve */........CAC
220b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
220c0 28 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76  ("Found in-activ
220d0 65 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20  e slot %lu, but 
220e0 69 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76  it will be activ
220f0 65 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20  e after a reset 
22100 2d 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63  -- marking as ac
22110 74 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74  tive for account
22120 69 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28  ing purposes", (
22130 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
22140 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  urrslot);.......
22150 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
22160 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09  ......}......}..
22170 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
22180 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
22190 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
221a0 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
221b0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
221c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
221d0 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c  INTF("Second cal
221e0 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
221f0 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
22200 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
22210 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
22220 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
22230 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
22240 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
22250 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
22260 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  _ret);....}.....
22270 66 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72  free(pcsc_reader
22280 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  s_s);...} else {
22290 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
222a0 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63  _PRINTF("First c
222b0 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
222c0 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
222d0 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
222e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
222f0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
22300 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
22310 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
22320 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
22330 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a  rs_ret);...}..}.
22340 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
22350 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
22360 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22370 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
22380 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
22390 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
223a0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
223b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
223c0 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
223d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
223e0 6f 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74  ound active slot
223f0 20 25 6c 75 2c 20 72 65 61 64 65 72 20 3d 20 25   %lu, reader = %
22400 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
22410 6e 67 29 20 63 75 72 72 73 6c 6f 74 2c 20 63 61  ng) currslot, ca
22420 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
22430 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
22440 29 3b 0a 0a 09 09 09 73 6c 6f 74 5f 63 6f 75 6e  );.....slot_coun
22450 74 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  t++;...}..}...mu
22460 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22470 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22480 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22490 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
224a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
224b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
224c0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
224d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
224e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
224f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22500 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
22510 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
22520 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
22530 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
22540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
22550 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22560 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
22570 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74  readers, but not
22580 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53   storing IDs (pS
22590 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
225a0 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
225b0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
225c0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
225d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
225e0 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e  count = *pulCoun
225f0 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  t;..if (count < 
22600 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  slot_count) {...
22610 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22620 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
22630 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
22640 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68  ntries, but we h
22650 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e  ave %lu entries.
22660 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  ", count, slot_c
22670 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  ount);....CACKEY
22680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22690 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
226a0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b  FER_TOO_SMALL");
226b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
226c0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
226d0 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  ;...}...mutex_re
226e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
226f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
22700 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22710 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22740 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22760 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22770 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64  R);..}...slot_id
22780 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
22790 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72  rslot = 0; (curr
227a0 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
227b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
227c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
227d0 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c  ts[0]))); currsl
227e0 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  ot++) {...if (!c
227f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
22800 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
22810 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
22820 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78  ....if (slot_idx
22830 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09   >= count) {....
22840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22850 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
22860 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
22870 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a  ntries, but we j
22880 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69  ust tried to wri
22890 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e  te to the %lu in
228a0 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22  dex -- ignoring"
228b0 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64  , count, slot_id
228c0 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  x);.....continue
228d0 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69  ;...}....pSlotLi
228e0 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63  st[slot_idx] = c
228f0 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f  urrslot;...slot_
22900 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  idx++;..}...mute
22910 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22920 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22930 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22940 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22950 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22970 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22980 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22990 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
229a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
229b0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
229c0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
229d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
229e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
229f0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
22a00 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
22a10 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
22a20 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
22a30 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
22a40 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
22a50 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
22a60 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
22a70 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
22a80 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
22a90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22aa0 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
22ab0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
22ac0 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
22ad0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
22ae0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
22af0 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
22b00 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
22b10 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
22b20 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
22b30 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
22b40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22b50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22b60 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
22b70 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22b80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22b90 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
22ba0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
22bb0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
22bc0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
22bd0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22be0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22bf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22c00 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22c10 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22c20 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22c30 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22c40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
22c50 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
22c60 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
22c70 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
22c80 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
22c90 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
22ca0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22cb0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
22cc0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
22cd0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
22ce0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
22cf0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
22d00 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
22d10 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
22d20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
22d30 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
22d40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22d50 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22d60 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22d70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22d80 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
22d90 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
22da0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22db0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
22dc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22dd0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
22de0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22e00 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
22e10 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
22e20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
22e30 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
22e40 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
22e50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22e60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22e70 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
22e80 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
22e90 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
22ea0 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
22eb0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
22ec0 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e  s[slotID].intern
22ed0 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  al) {...pInfo->f
22ee0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f  lags |= CKF_REMO
22ef0 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d  VABLE_DEVICE;..}
22f00 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
22f10 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
22f20 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22f30 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
22f40 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
22f50 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
22f60 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
22f70 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79  PRESENT;..}...by
22f80 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74  tes_to_copy = st
22f90 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74  rlen(cackey_slot
22fa0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
22fb0 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a  eader);..if (siz
22fc0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
22fd0 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74  acturerID) < byt
22fe0 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
22ff0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
23000 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
23010 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09  nufacturerID);..
23020 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  }..memcpy(pInfo-
23030 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
23040 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
23050 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
23060 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  r, bytes_to_copy
23070 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
23080 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23090 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
230a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
230b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
230c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
230d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
230e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
230f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23100 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23110 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74  OR);..}...memset
23120 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
23130 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
23140 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  zeof(pInfo->slot
23150 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
23160 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c  memcpy(pInfo->sl
23170 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
23180 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
23190 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72  sizeof(slotDescr
231a0 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
231b0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
231c0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
231d0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
231e0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
231f0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
23200 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
23210 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
23220 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
23230 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
23240 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
23250 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
23260 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
23270 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
23280 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
23290 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
232a0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
232b0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
232c0 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59  = 0x00;...CACKEY
232d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
232e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
232f0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
23300 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
23310 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
23320 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
23330 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43  _GetTokenInfo)(C
23340 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
23350 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f  , CK_TOKEN_INFO_
23360 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
23370 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
23380 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b   manufacturerID[
23390 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e  ] = "U.S. Govern
233a0 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43  ment";..static C
233b0 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75  K_UTF8CHAR defau
233c0 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b  ltLabel[] = "Unk
233d0 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  nown Token";..st
233e0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
233f0 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20   model[] = "CAC 
23400 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20  Token";..struct 
23410 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
23420 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
23430 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
23440 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
23450 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f  ..ssize_t label_
23460 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
23470 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65  retval;..int use
23480 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a  _default_label;.
23490 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
234a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
234b0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
234c0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
234d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
234e0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
234f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
23500 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
23510 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
23520 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23530 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23540 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23550 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23560 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23570 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23580 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23590 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
235a0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
235b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
235c0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
235d0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
235e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
235f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23600 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23610 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23620 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
23630 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
23640 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
23650 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
23660 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
23670 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23680 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
23690 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
236a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
236b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
236c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
236d0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
236e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
236f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23700 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
23710 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23720 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
23730 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23740 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23750 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
23760 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
23770 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
23780 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
23790 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
237a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
237b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
237c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
237d0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
237e0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
237f0 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
23800 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23810 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
23820 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
23830 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23840 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b  G_PRINTF("No tok
23850 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  en is present in
23860 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20   slotID = %lu", 
23870 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23880 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23890 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
238a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ....return(CKR_T
238b0 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54  OKEN_NOT_PRESENT
238c0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
238d0 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
238e0 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
238f0 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
23900 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
23910 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
23920 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
23930 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
23940 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
23950 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
23960 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
23970 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
23980 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
23990 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
239a0 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
239b0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
239c0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
239d0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
239e0 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
239f0 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
23a00 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
23a10 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
23a20 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
23a30 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
23a40 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
23a50 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
23a60 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
23a70 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
23a80 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
23a90 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
23aa0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
23ab0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
23ac0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
23ad0 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
23ae0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23af0 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
23b00 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
23b10 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
23b20 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
23b30 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
23b40 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
23b50 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
23b60 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
23b70 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
23b80 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
23b90 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
23ba0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
23bb0 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
23bc0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
23bd0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
23be0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23bf0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23c00 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
23c10 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
23c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23c40 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
23c50 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23c60 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23c70 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  OR);..}...if (us
23c80 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
23c90 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
23ca0 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
23cb0 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
23cc0 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
23cd0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
23ce0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
23cf0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
23d00 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
23d10 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
23d20 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
23d30 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
23d40 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
23d50 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
23d60 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
23d70 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
23d80 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
23d90 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
23da0 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
23db0 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
23dc0 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
23dd0 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
23de0 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
23df0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
23e00 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
23e10 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
23e20 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
23e30 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
23e40 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
23e50 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
23e60 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
23e70 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
23e80 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
23e90 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
23ea0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
23eb0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
23ec0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
23ed0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
23ee0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
23ef0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
23f00 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
23f10 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
23f20 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
23f30 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
23f40 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
23f50 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
23f60 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
23f70 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  | cackey_slots[s
23f80 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
23f90 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  gs;...if (cackey
23fa0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20  _pin_command != 
23fb0 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  NULL) {...pInfo-
23fc0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52  >flags |= CKF_PR
23fd0 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49  OTECTED_AUTHENTI
23fe0 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a  CATION_PATH;..}.
23ff0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65  ..pInfo->ulMaxSe
24000 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69  ssionCount = (si
24010 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
24020 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
24030 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
24040 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d  ])) - 1;..pInfo-
24050 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  >ulSessionCount 
24060 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
24070 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
24080 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73  Info->ulMaxRwSes
24090 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  sionCount = 0;..
240a0 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69  pInfo->ulRwSessi
240b0 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
240c0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
240d0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
240e0 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b  MaxPinLen = 128;
240f0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69  ..pInfo->ulMinPi
24100 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  nLen = 0;..pInfo
24110 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d  ->ulTotalPublicM
24120 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
24130 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
24140 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
24150 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d  eePublicMemory =
24160 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
24170 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
24180 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76  nfo->ulTotalPriv
24190 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
241a0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
241b0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
241c0 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d  ulFreePrivateMem
241d0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
241e0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
241f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
24200 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24210 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
24220 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
24230 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
24240 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24250 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46  N(CK_RV, C_WaitF
24260 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f  orSlotEvent)(CK_
24270 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f  FLAGS flags, CK_
24280 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
24290 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52  tID, CK_VOID_PTR
242a0 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43   pReserved) {..C
242b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
242c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
242d0 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
242e0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
242f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24300 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
24310 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
24320 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24330 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
24340 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
24350 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24380 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24390 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
243a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
243b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
243c0 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49  ./* XXX: TODO: I
243d0 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e  mplement this...
243e0 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55   */..CACKEY_DEBU
243f0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24400 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
24410 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
24420 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
24430 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24440 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24450 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24460 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
24470 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24480 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
24490 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f  nismList)(CK_SLO
244a0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
244b0 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50  MECHANISM_TYPE_P
244c0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  TR pMechanismLis
244d0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
244e0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43  pulCount) {..CAC
244f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24500 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24510 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24520 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24540 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
24550 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
24560 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
24570 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
24580 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
24590 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
245a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
245b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
245c0 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55    pulCount is NU
245d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
245e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
245f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
24600 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20  echanismList == 
24610 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
24620 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b  unt = 1;....CACK
24630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24640 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24650 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
24660 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24670 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70  OK);..}...if (*p
24680 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09  ulCount < 1) {..
24690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
246a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75  INTF("Error.  Bu
246b0 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22  ffer too small."
246c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
246d0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
246e0 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e  L);..}...pMechan
246f0 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d  ismList[0] = CKM
24700 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c  _RSA_PKCS;..*pul
24710 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43  Count = 1;...CAC
24720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24730 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24740 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
24750 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24760 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
24770 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24780 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
24790 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
247a0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
247b0 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c  ANISM_TYPE type,
247c0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e   CK_MECHANISM_IN
247d0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
247e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
247f0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
24800 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24810 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
24820 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
24830 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24840 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
24850 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
24860 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
24870 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
24880 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24890 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
248a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
248b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
248c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
248d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
248e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
248f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
24900 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
24910 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
24920 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
24930 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
24940 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
24950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24960 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24970 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24980 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24990 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
249a0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
249b0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
249c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
249d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
249e0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
249f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24a00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24a10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24a20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24a30 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24a40 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24a50 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24a60 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24a70 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
24a80 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
24a90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24ab0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
24ac0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
24ad0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
24ae0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
24af0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
24b00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24b10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24b20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
24b30 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
24b40 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
24b50 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
24b60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24b70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24b80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24b90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24ba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24bb0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
24bc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
24bd0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
24be0 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
24bf0 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
24c00 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
24c10 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
24c20 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
24c30 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
24c40 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
24c50 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
24c60 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
24c70 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
24c80 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
24c90 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
24ca0 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ak;..}...CACKEY_
24cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24cc0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
24cd0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
24ce0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24cf0 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
24d00 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
24d10 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
24d20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24d30 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43  , C_InitToken)(C
24d40 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
24d50 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
24d60 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
24d70 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54   ulPinLen, CK_UT
24d80 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65  F8CHAR_PTR pLabe
24d90 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  l) {..CACKEY_DEB
24da0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24db0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24dc0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24dd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24de0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24df0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24e00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24e10 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
24e20 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
24e30 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24e40 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24e50 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
24e60 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
24e70 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
24e80 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
24e90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
24ea0 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
24eb0 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  ED);.}../* We do
24ec0 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
24ed0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
24ee0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
24ef0 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29  K_RV, C_InitPIN)
24f00 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
24f10 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
24f20 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
24f30 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
24f40 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
24f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24f60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24f70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24f80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24fa0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24fb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24fc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24fd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24fe0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24ff0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25000 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f  rning CKR_TOKEN_
25010 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
25020 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e  (%i)", CKR_TOKEN
25030 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
25040 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25050 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
25060 45 43 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ECTED);.}..CK_DE
25070 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
25080 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43  _RV, C_SetPIN)(C
25090 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
250a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
250b0 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50  F8CHAR_PTR pOldP
250c0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  in, CK_ULONG ulO
250d0 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ldPinLen, CK_UTF
250e0 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69  8CHAR_PTR pNewPi
250f0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65  n, CK_ULONG ulNe
25100 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 63 68 61 72  wPinLen) {..char
25110 20 6f 6c 64 70 69 6e 62 75 66 5b 36 34 5d 2c 20   oldpinbuf[64], 
25120 6e 65 77 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  newpinbuf[64];..
25130 63 61 63 6b 65 79 5f 72 65 74 20 73 65 74 5f 70  cackey_ret set_p
25140 69 6e 5f 72 65 74 2c 20 67 65 74 5f 70 69 6e 5f  in_ret, get_pin_
25150 72 65 74 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  ret;..CK_SLOT_ID
25160 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
25170 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
25180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25190 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
251a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
251b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
251c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
251d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
251e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
251f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25200 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25210 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
25220 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25230 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
25240 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25250 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25260 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25280 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
25290 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
252a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
252b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
252c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
252d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
252e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
252f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25300 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
25330 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
25340 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
25350 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
25360 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
25370 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
25380 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25390 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
253a0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
253b0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
253c0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
253d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
253e0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
253f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25400 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
25410 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
25420 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
25430 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
25440 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25450 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25460 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25470 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25480 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25490 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
254a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
254b0 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
254c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
254d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
254e0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
254f0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
25500 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
25510 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
25520 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
25530 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25540 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
25550 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
25560 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
25570 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
25580 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
25590 2f 2a 20 47 65 74 20 6f 6c 64 20 50 49 4e 20 2a  /* Get old PIN *
255a0 2f 0a 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20  /...get_pin_ret 
255b0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e  = cackey_get_pin
255c0 28 6f 6c 64 70 69 6e 62 75 66 29 3b 0a 0a 09 09  (oldpinbuf);....
255d0 69 66 20 28 67 65 74 5f 70 69 6e 5f 72 65 74 20  if (get_pin_ret 
255e0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
255f0 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
25600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25610 72 72 6f 72 20 77 68 69 6c 65 20 67 65 74 74 69  rror while getti
25620 6e 67 20 4f 6c 64 20 50 49 4e 2c 20 72 65 74 75  ng Old PIN, retu
25630 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e  rning CKR_PIN_IN
25640 43 4f 52 52 45 43 54 2e 22 29 3b 0a 0a 09 09 09  CORRECT.");.....
25650 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25670 63 6b 29 3b 0a 09 09 09 0a 09 09 09 72 65 74 75  ck);........retu
25680 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
25690 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 4f  RECT);...}....pO
256a0 6c 64 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  ldPin = (CK_UTF8
256b0 43 48 41 52 5f 50 54 52 29 20 6f 6c 64 70 69 6e  CHAR_PTR) oldpin
256c0 62 75 66 3b 0a 09 09 75 6c 4f 6c 64 50 69 6e 4c  buf;...ulOldPinL
256d0 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 6c 64 70  en = strlen(oldp
256e0 69 6e 62 75 66 29 3b 0a 0a 09 09 2f 2a 20 47 65  inbuf);..../* Ge
256f0 74 20 6e 65 77 20 50 49 4e 20 2a 2f 0a 09 09 67  t new PIN */...g
25700 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63  et_pin_ret = cac
25710 6b 65 79 5f 67 65 74 5f 70 69 6e 28 6e 65 77 70  key_get_pin(newp
25720 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
25730 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
25740 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
25750 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
25760 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 20  G_PRINTF("Error 
25770 77 68 69 6c 65 20 67 65 74 74 69 6e 67 20 4e 65  while getting Ne
25780 77 20 50 49 4e 2c 20 72 65 74 75 72 6e 69 6e 67  w PIN, returning
25790 20 43 4b 52 5f 50 49 4e 5f 49 4e 56 41 4c 49 44   CKR_PIN_INVALID
257a0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
257b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
257c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
257d0 09 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
257e0 50 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  PIN_INVALID);...
257f0 7d 0a 0a 09 09 70 4e 65 77 50 69 6e 20 3d 20 28  }....pNewPin = (
25800 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29  CK_UTF8CHAR_PTR)
25810 20 6e 65 77 70 69 6e 62 75 66 3b 0a 09 09 75 6c   newpinbuf;...ul
25820 4e 65 77 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c  NewPinLen = strl
25830 65 6e 28 6e 65 77 70 69 6e 62 75 66 29 3b 0a 09  en(newpinbuf);..
25840 7d 0a 0a 09 69 66 20 28 70 4f 6c 64 50 69 6e 20  }...if (pOldPin 
25850 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
25860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25870 28 22 4f 6c 64 20 50 49 4e 20 76 61 6c 75 65 20  ("Old PIN value 
25880 69 73 20 77 72 6f 6e 67 20 28 6e 75 6c 6c 29 2e  is wrong (null).
25890 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
258a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
258b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
258c0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
258d0 43 4f 52 52 45 43 54 29 3b 0a 09 7d 0a 0a 09 69  CORRECT);..}...i
258e0 66 20 28 75 6c 4f 6c 64 50 69 6e 4c 65 6e 20 3d  f (ulOldPinLen =
258f0 3d 20 30 20 7c 7c 20 75 6c 4f 6c 64 50 69 6e 4c  = 0 || ulOldPinL
25900 65 6e 20 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b  en > 8) {...CACK
25910 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25920 22 4f 6c 64 20 50 49 4e 20 6c 65 6e 67 74 68 20  "Old PIN length 
25930 69 73 20 77 72 6f 6e 67 3a 20 25 6c 75 2e 22 2c  is wrong: %lu.",
25940 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
25950 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 29 3b 0a 0a   ulOldPinLen);..
25960 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25970 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25980 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25990 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
259a0 43 54 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4e  CT);..}...if (pN
259b0 65 77 50 69 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ewPin == NULL) {
259c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
259d0 50 52 49 4e 54 46 28 22 4e 65 77 20 50 49 4e 20  PRINTF("New PIN 
259e0 76 61 6c 75 65 20 69 73 20 77 72 6f 6e 67 20 28  value is wrong (
259f0 65 69 74 68 65 72 20 4e 55 4c 4c 2c 20 6f 72 20  either NULL, or 
25a00 74 6f 6f 20 6c 6f 6e 67 2f 73 68 6f 72 74 29 2e  too long/short).
25a10 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  ");....cackey_mu
25a20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25a30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
25a40 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
25a50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
25a60 28 75 6c 4e 65 77 50 69 6e 4c 65 6e 20 3c 20 35  (ulNewPinLen < 5
25a70 20 7c 7c 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 20   || ulNewPinLen 
25a80 3e 20 38 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 8) {...CACKEY_
25a90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 65  DEBUG_PRINTF("Ne
25aa0 77 20 50 49 4e 20 6c 65 6e 67 74 68 20 69 73 20  w PIN length is 
25ab0 77 72 6f 6e 67 3a 20 25 6c 75 2c 20 6d 75 73 74  wrong: %lu, must
25ac0 20 62 65 20 61 74 6c 65 61 73 74 20 35 20 61 6e   be atleast 5 an
25ad0 64 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 38  d no more than 8
25ae0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
25af0 6e 67 29 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29  ng) ulNewPinLen)
25b00 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
25b10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25b20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
25b30 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 45 4e 5f  urn(CKR_PIN_LEN_
25b40 52 41 4e 47 45 29 3b 0a 09 7d 0a 0a 09 73 65 74  RANGE);..}...set
25b50 5f 70 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  _pin_ret = cacke
25b60 79 5f 73 65 74 5f 70 69 6e 28 26 63 61 63 6b 65  y_set_pin(&cacke
25b70 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
25b80 20 70 4f 6c 64 50 69 6e 2c 20 75 6c 4f 6c 64 50   pOldPin, ulOldP
25b90 69 6e 4c 65 6e 2c 20 70 4e 65 77 50 69 6e 2c 20  inLen, pNewPin, 
25ba0 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 3b 0a 0a 09  ulNewPinLen);...
25bb0 69 66 20 28 73 65 74 5f 70 69 6e 5f 72 65 74 20  if (set_pin_ret 
25bc0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
25bd0 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  _OK) {...if (cac
25be0 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
25bf0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61  == NULL) {....ca
25c00 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
25c10 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
25c20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
25c30 49 52 45 44 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  IRED;...}....if 
25c40 28 73 65 74 5f 70 69 6e 5f 72 65 74 20 3d 3d 20  (set_pin_ret == 
25c50 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
25c60 43 4b 45 44 29 20 7b 0a 09 09 09 63 61 63 6b 65  CKED) {....cacke
25c70 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
25c80 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
25c90 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b  KF_USER_PIN_LOCK
25ca0 45 44 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  ED;...}..}...mut
25cb0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25cc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25cd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25ce0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25cf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25d10 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
25d20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25d40 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25d50 0a 09 73 77 69 74 63 68 20 28 73 65 74 5f 70 69  ..switch (set_pi
25d60 6e 5f 72 65 74 29 20 7b 0a 09 09 63 61 73 65 20  n_ret) {...case 
25d70 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
25d80 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
25d90 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
25da0 73 66 75 6c 6c 79 20 73 65 74 20 50 49 4e 2e 22  sfully set PIN."
25db0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
25dc0 52 5f 4f 4b 29 3b 0a 09 09 63 61 73 65 20 43 41  R_OK);...case CA
25dd0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
25de0 49 4e 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  IN:....CACKEY_DE
25df0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
25e00 77 61 73 20 69 6e 76 61 6c 69 64 2e 22 29 3b 0a  was invalid.");.
25e10 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
25e20 49 4e 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 63  IN_INVALID);...c
25e30 61 73 65 20 43 41 43 4b 45 59 5f 50 43 53 43 5f  ase CACKEY_PCSC_
25e40 45 5f 4c 4f 43 4b 45 44 3a 0a 09 09 09 43 41 43  E_LOCKED:....CAC
25e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e60 28 22 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65  ("Token is locke
25e70 64 20 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65  d or this change
25e80 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
25e90 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
25ea0 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
25eb0 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
25ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25ed0 4e 54 46 28 22 53 6f 6d 65 74 68 69 6e 67 20 65  NTF("Something e
25ee0 6c 73 65 20 77 65 6e 74 20 77 72 6f 6e 67 20 63  lse went wrong c
25ef0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 49 4e 3a  hanging the PIN:
25f00 20 25 69 22 2c 20 73 65 74 5f 70 69 6e 5f 72 65   %i", set_pin_re
25f10 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
25f20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25f30 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
25f40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25f50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
25f60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
25f70 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
25f80 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
25f90 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
25fa0 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
25fb0 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
25fc0 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
25fd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
25fe0 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
25ff0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
26000 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
26010 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
26020 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
26030 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26040 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26050 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
26060 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
26070 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
26080 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
26090 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
260a0 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
260b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
260c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
260d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
260e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
260f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26100 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26110 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26120 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26130 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
26140 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
26150 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
26160 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
26170 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26180 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
26190 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
261a0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
261b0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
261c0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
261d0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
261e0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
261f0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
26200 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26210 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26220 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
26230 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26240 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26250 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26260 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26270 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
26280 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
26290 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
262a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
262b0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
262c0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
262d0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
262e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
262f0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
26300 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
26310 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
26320 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
26330 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
26340 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26350 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26360 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26370 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
26380 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
26390 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
263a0 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
263b0 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
263c0 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
263d0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
263e0 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
263f0 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
26400 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
26410 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
26420 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
26430 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
26440 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
26450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26460 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26470 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
26480 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
26490 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
264a0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
264b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
264c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
264d0 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
264e0 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
264f0 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
26500 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
26510 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
26520 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26530 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
26540 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
26550 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
26560 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
26570 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
26580 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
26590 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
265a0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
265b0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
265c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
265d0 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
265e0 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
265f0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
26600 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
26610 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
26620 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
26630 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
26640 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26650 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
26660 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
26670 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26680 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
26690 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
266a0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
266b0 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
266c0 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
266d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
266e0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
266f0 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
26700 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
26710 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
26720 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
26730 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
26740 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
26750 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
26760 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
26770 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
26780 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
26790 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
267a0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
267b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
267c0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
267d0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
267e0 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
267f0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
26800 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
26810 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
26820 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
26830 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
26840 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26850 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26860 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
26870 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
26880 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
26890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
268a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
268b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
268c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
268d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
268e0 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
268f0 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
26900 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26910 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
26920 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
26930 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
26940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26950 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
26960 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
26970 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
26980 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
26990 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
269a0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
269b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
269c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
269d0 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
269e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
269f0 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
26a00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
26a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26a20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
26a30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
26a40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
26a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26a60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
26a70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
26a80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
26a90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
26aa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
26ab0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
26ac0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
26ad0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
26ae0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
26af0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
26b00 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
26b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26b20 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
26b30 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
26b40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
26b50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
26b60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
26b70 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
26b80 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
26b90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26ba0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26bb0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26bc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26bd0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
26be0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
26bf0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26c00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
26c10 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
26c20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
26c30 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
26c40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26c50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26c80 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
26c90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26ca0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
26cb0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
26cc0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26cd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
26ce0 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
26cf0 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
26d00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26d10 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
26d20 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
26d30 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26d40 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
26d50 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
26d60 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26d70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26d80 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26d90 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26da0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26db0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26dc0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26dd0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26de0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26df0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
26e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26e10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
26e20 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
26e30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
26e40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26e50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26e60 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
26e70 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
26e80 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
26e90 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
26ea0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
26eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ec0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26ed0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26ee0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26ef0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26f00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26f10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26f20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26f30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
26f40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
26f50 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
26f60 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
26f70 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
26f80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
26f90 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
26fa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26fb0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
26fc0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
26fd0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
26fe0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
26ff0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
27000 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
27010 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27020 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27030 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27040 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27050 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27060 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27080 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
27090 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
270a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
270b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
270c0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
270d0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
270e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
270f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27100 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
27110 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
27120 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
27130 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
27140 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
27150 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27160 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27170 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
27180 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
27190 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
271a0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
271b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
271c0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
271d0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
271e0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
271f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27200 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
27210 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
27220 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
27230 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
27240 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
27250 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
27260 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27270 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
27280 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
27290 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
272a0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
272b0 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
272c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
272d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
272e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
272f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27300 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
27330 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
27340 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27350 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27360 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27370 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27380 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
27390 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
273a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
273b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
273c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
273d0 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
273e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
273f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
27400 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
27410 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
27420 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
27430 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27440 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27450 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
27460 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27470 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27480 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
27490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
274a0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
274b0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
274c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
274d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
274e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
274f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27500 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27510 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27520 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27530 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
27540 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
27550 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
27560 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
27570 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27580 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
27590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
275b0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
275c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
275d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
275e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
275f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27600 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27620 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
27630 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
27640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27650 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
27660 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27680 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27690 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
276a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
276b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
276c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
276d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
276e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
276f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27700 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27710 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27720 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27730 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27740 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
27750 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
27760 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27770 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
27780 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
27790 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
277a0 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
277b0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
277c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
277d0 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
277e0 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
277f0 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
27800 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
27810 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
27820 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
27830 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27840 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27850 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
27860 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
27870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27880 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
27890 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
278a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
278b0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
278c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
278d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
278e0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
278f0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
27900 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
27910 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27920 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
27930 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
27940 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27950 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
27960 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
27970 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
27980 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
27990 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
279a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
279b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
279c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
279d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
279e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
279f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27a00 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27a20 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27a30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27a50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27a60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27a70 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27a80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27a90 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27aa0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27ab0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27ac0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
27ad0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
27ae0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
27af0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27b00 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27b10 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
27b20 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
27b30 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
27b40 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
27b50 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
27b60 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
27b70 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
27b80 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
27b90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27ba0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27bb0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27bc0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27be0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27bf0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27c00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27c10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27c20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27c30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27c40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27c50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27c60 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
27c70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27c80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
27c90 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
27ca0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27cb0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
27cc0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27cd0 20 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67   C_LoginMutexArg
27ce0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27cf0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27d00 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54  _USER_TYPE userT
27d10 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ype, CK_UTF8CHAR
27d20 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
27d30 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69 6e  ONG ulPinLen, in
27d40 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a  t lock_mutex) {.
27d50 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
27d60 49 44 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ID;..cackey_ret 
27d70 67 65 74 5f 70 69 6e 5f 72 65 74 3b 0a 09 63 68  get_pin_ret;..ch
27d80 61 72 20 70 69 6e 62 75 66 5b 36 34 5d 3b 0a 09  ar pinbuf[64];..
27d90 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
27da0 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
27db0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
27dc0 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
27dd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27de0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27df0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27e00 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27e20 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
27e30 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
27e40 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27e50 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27e60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
27e70 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
27e80 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
27e90 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27ea0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
27eb0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
27ec0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27ed0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27ee0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
27ef0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
27f00 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27f10 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27f20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
27f30 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
27f40 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
27f50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27f60 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
27f70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
27f80 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
27f90 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
27fa0 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
27fb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
27fc0 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
27fd0 0a 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  ..}...if (lock_m
27fe0 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
27ff0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28000 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28010 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66  y_biglock);...if
28020 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28030 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
28040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28050 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
28060 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
28070 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28080 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a  _ERROR);...}..}.
28090 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
280a0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
280b0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20  .active) {...if 
280c0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
280d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
280e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
280f0 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  lock);...}....CA
28100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28110 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28120 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28130 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28140 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28150 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28160 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
28170 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28180 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
28190 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
281a0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
281b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
281c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
281d0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
281e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
281f0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
28200 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
28210 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
28220 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
28230 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66  , slotID);....if
28240 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
28250 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28260 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28270 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72  glock);...}....r
28280 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28290 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
282a0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
282b0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
282c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
282d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
282e0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
282f0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
28300 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
28310 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
28320 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c  lotID);....if (l
28330 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
28340 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28360 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ck);...}....retu
28370 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28380 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28390 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
283a0 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
283b0 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c  if (pPin != NULL
283c0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
283d0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
283e0 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61  ected authentica
283f0 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66  tion path in eff
28400 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76  ect and PIN prov
28410 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a  ided !?");...}..
28420 09 09 67 65 74 5f 70 69 6e 5f 72 65 74 20 3d 20  ..get_pin_ret = 
28430 63 61 63 6b 65 79 5f 67 65 74 5f 70 69 6e 28 70  cackey_get_pin(p
28440 69 6e 62 75 66 29 3b 0a 0a 09 09 69 66 20 28 67  inbuf);....if (g
28450 65 74 5f 70 69 6e 5f 72 65 74 20 21 3d 20 43 41  et_pin_ret != CA
28460 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
28470 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
28480 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
28490 5f 67 65 74 5f 70 69 6e 28 29 20 72 65 74 75 72  _get_pin() retur
284a0 6e 65 64 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ned in failure, 
284b0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 50 49 4e  assuming the PIN
284c0 20 77 61 73 20 69 6e 63 6f 72 72 65 63 74 2e 22   was incorrect."
284d0 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f  );.....if (lock_
284e0 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63  mutex) {.....cac
284f0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28500 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28510 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
28520 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
28530 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  ECT);...}....pPi
28540 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
28550 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
28560 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
28570 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
28580 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
28590 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
285a0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
285b0 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
285c0 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
285d0 2c 20 33 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e  , 3);..if (login
285e0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
285f0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
28600 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
28610 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28620 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28630 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 69  glock);...}....i
28640 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
28650 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
28660 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CKED) {....CACKE
28670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28680 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73  Error.  Token is
28690 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09   locked.");.....
286a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
286b0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
286c0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
286d0 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43  _LOCKED;.....CAC
286e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
286f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28700 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22  PIN_LOCKED (%i)"
28710 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f  , (int) CKR_PIN_
28720 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74  LOCKED);.....ret
28730 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b  urn(CKR_PIN_LOCK
28740 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  ED);...} else if
28750 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
28760 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
28770 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  PIN) {....CACKEY
28780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28790 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50  rror.  Invalid P
287a0 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  IN.");.....cacke
287b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
287c0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
287d0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
287e0 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74  T_LOW;.....if (t
287f0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
28800 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  = 1) {.....cacke
28810 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
28820 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
28830 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
28840 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09  L_TRY;....}.....
28850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28860 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28870 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
28880 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
28890 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
288a0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
288b0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
288c0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
288d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
288e0 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72  or.  Unknown err
288f0 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  or returned from
28900 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20   cackey_login() 
28910 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74  (%i)", login_ret
28920 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28930 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28940 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ..}...cackey_slo
28950 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
28960 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f  _flags &= ~(CKF_
28970 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20  USER_PIN_LOCKED 
28980 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  | CKF_USER_PIN_C
28990 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c  OUNT_LOW | CKF_L
289a0 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20  OGIN_REQUIRED | 
289b0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
289c0 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65  AL_TRY);...cacke
289d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
289e0 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  ion].state = CKS
289f0 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f  _RO_USER_FUNCTIO
28a00 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d  NS;...if (lock_m
28a10 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f  utex) {...mutex_
28a20 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28a30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28a40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
28a50 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28a60 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
28a70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28a80 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28a90 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28aa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28ab0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  ERAL_ERROR);...}
28ac0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28ad0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28ae0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
28af0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
28b00 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
28b10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28b20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67  ION(CK_RV, C_Log
28b30 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  in)(CK_SESSION_H
28b40 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28b50 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65  CK_USER_TYPE use
28b60 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48  rType, CK_UTF8CH
28b70 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
28b80 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
28b90 7b 0a 09 72 65 74 75 72 6e 28 43 5f 4c 6f 67 69  {..return(C_Logi
28ba0 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69  nMutexArg(hSessi
28bb0 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20 70 50  on, userType, pP
28bc0 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 31 29  in, ulPinLen, 1)
28bd0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
28be0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
28bf0 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53  C_Logout)(CK_SES
28c00 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
28c10 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  sion) {..CK_SLOT
28c20 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
28c30 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
28c40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28c50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
28c60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
28c70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
28c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28c90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
28ca0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
28cb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
28cc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
28cd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
28ce0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
28cf0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
28d00 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
28d10 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
28d20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28d30 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
28d40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28d50 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28d60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
28d70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28d80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28d90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28da0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
28db0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
28dc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28dd0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28de0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28df0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28e00 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
28e10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28e20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28e30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28e40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28e50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28e60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
28e70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28e80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28e90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28ea0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28eb0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
28ec0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
28ed0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
28ee0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28ef0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
28f00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28f10 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
28f20 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
28f30 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
28f40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
28f50 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
28f60 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
28f70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28f80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28f90 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
28fa0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
28fb0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
28fc0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
28fd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
28fe0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
28ff0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
29000 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
29010 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
29020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29030 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
29040 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
29050 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
29060 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
29070 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
29080 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29090 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
290a0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
290b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
290c0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
290d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
290e0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
290f0 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
29100 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
29110 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
29120 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  L) {...cackey_sl
29130 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
29140 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
29150 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 7d  GIN_REQUIRED;..}
29160 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
29170 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
29180 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
29190 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
291a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
291b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
291c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
291d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
291e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
291f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29200 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
29210 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29220 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29230 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
29240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29250 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
29260 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
29270 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
29280 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
29290 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
292a0 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43  _CreateObject)(C
292b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
292c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
292d0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
292e0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
292f0 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45  ulCount, CK_OBJE
29300 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  CT_HANDLE_PTR ph
29310 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
29320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29330 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29340 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29350 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29370 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29380 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29390 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
293a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
293b0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
293c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
293d0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
293e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
293f0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
29400 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29410 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
29420 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29430 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29440 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29450 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79  ON(CK_RV, C_Copy
29460 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
29470 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29480 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
29490 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
294a0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
294b0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
294c0 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
294d0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
294e0 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a   phNewObject) {.
294f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29500 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
29510 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
29520 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29540 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29550 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29560 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29570 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29580 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
29590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
295a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
295b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
295c0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
295d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
295e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
295f0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
29600 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29610 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29620 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29630 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29  C_DestroyObject)
29640 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
29650 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
29660 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
29670 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
29680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29690 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
296a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
296b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
296c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
296d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
296e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
296f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29700 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29710 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29720 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29730 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29740 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29750 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29760 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29770 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29780 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29790 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
297a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
297b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62  N(CK_RV, C_GetOb
297c0 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53  jectSize)(CK_SES
297d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
297e0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
297f0 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
29800 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
29810 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f  Size) {..CACKEY_
29820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29830 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29840 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29850 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29860 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29870 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29880 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29890 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
298a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
298b0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
298c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
298d0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
298e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
298f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29900 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29910 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29920 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29930 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29940 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29950 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74  (CK_RV, C_GetAtt
29960 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
29970 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29980 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
29990 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
299a0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
299b0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
299c0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
299d0 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45   {..CK_ATTRIBUTE
299e0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74   *curr_attr;..st
299f0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
29a00 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a  tity *identity;.
29a10 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
29a20 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74  dentity_idx, att
29a30 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
29a40 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09  _idx, num_ids;..
29a50 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
29a60 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
29a70 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f  = CKR_OK;..CK_VO
29a80 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
29a90 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
29aa0 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  Len;...CACKEY_DE
29ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29ac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29ad0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29ae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29af0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29b00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29b10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29b20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29b30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29b40 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
29b50 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
29b60 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
29b70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
29b80 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
29b90 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
29ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29bb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
29bc0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
29bd0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
29be0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
29bf0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
29c00 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63  ..}...if (hObjec
29c10 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
29c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29c30 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
29c40 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
29c50 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
29c60 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
29c70 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
29c80 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74  .}...if (ulCount
29c90 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
29ca0 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
29cb0 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
29cc0 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
29cd0 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
29ce0 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43  mediately */...C
29cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29d00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29d10 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
29d20 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
29d30 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
29d40 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
29d50 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55  (pTemplate == NU
29d60 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
29d70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29d80 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69  or.  pTemplate i
29d90 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
29da0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
29db0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64  TS_BAD);..}...id
29dc0 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62  entity_idx = hOb
29dd0 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65  ject - 1;...mute
29de0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
29df0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
29e00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
29e10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
29e20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
29e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29e40 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
29e50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
29e60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
29e70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
29e80 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
29e90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
29ea0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
29eb0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29ec0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
29ed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29ee0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
29ef0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
29f00 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29f10 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
29f20 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
29f30 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b  ..num_ids = cack
29f40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29f50 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29f60 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64  _count;...if (id
29f70 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75  entity_idx >= nu
29f80 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65  m_ids) {...cacke
29f90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29fa0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29fb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29fc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29fd0 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75  Object handle ou
29fe0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65  t of range.  ide
29ff0 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c  ntity_idx = %lu,
2a000 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22   num_ids = %lu."
2a010 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2a020 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  ) identity_idx, 
2a030 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2a040 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74  num_ids);....ret
2a050 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48  urn(CKR_OBJECT_H
2a060 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2a070 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20  .}...identity = 
2a080 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2a090 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2a0a0 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69  ities[identity_i
2a0b0 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72  dx];...for (attr
2a0c0 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
2a0d0 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74  dx < ulCount; at
2a0e0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75  tr_idx++) {...cu
2a0f0 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70  rr_attr = &pTemp
2a100 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  late[attr_idx];.
2a110 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
2a120 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
2a130 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
2a140 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a150 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66  RINTF("Looking f
2a160 6f 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25  or attribute 0x%
2a170 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25  08lx (identity:%
2a180 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lu) ...", (unsig
2a190 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
2a1a0 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69  ttr->type, (unsi
2a1b0 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
2a1c0 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72  ity_idx);....for
2a1d0 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
2a1e0 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
2a1f0 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61  dx < identity->a
2a200 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
2a210 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
2a220 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74  ) {....if (ident
2a230 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
2a240 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74  sess_attr_idx].t
2a250 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72  ype == curr_attr
2a260 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41  ->type) {.....CA
2a270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a280 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74  F(" ... found it
2a290 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75  , pValue = %p, u
2a2a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22  lValueLen = %lu"
2a2b0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72  , identity->attr
2a2c0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
2a2d0 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64  _idx].pValue, id
2a2e0 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
2a2f0 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
2a300 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
2a310 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
2a320 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
2a330 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
2a340 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09  idx].pValue;....
2a350 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64  .ulValueLen = id
2a360 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
2a370 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
2a380 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09  ].ulValueLen;...
2a390 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75  .}...}....if (cu
2a3a0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20  rr_attr->pValue 
2a3b0 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09  && pValue) {....
2a3c0 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75  if (curr_attr->u
2a3d0 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56  lValueLen >= ulV
2a3e0 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d  alueLen) {.....m
2a3f0 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d  emcpy(curr_attr-
2a400 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  >pValue, pValue,
2a410 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09   ulValueLen);...
2a420 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c  .} else {.....ul
2a430 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
2a440 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65  ONG) -1;......re
2a450 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
2a460 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09  R_TOO_SMALL;....
2a470 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74  }...}....curr_at
2a480 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  tr->ulValueLen =
2a490 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a   ulValueLen;..}.
2a4a0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2a4b0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2a4c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a4d0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2a4e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2a4f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a500 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2a510 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2a520 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a530 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2a540 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61  ;..}...if (retva
2a550 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55  l == CKR_ATTRIBU
2a560 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  TE_TYPE_INVALID)
2a570 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a580 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a590 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54  ing CKR_ATTRIBUT
2a5a0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28  E_TYPE_INVALID (
2a5b0 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
2a5c0 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  al);..} else if 
2a5d0 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42  (retval == CKR_B
2a5e0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2a5f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a600 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a610 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
2a620 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20  OO_SMALL (%i)", 
2a630 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
2a640 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
2a650 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l == CKR_OK) {..
2a660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a670 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2a680 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69  CKR_OK (%i)", (i
2a690 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
2a6a0 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f  else {...CACKEY_
2a6b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2a6c0 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
2a6d0 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a  t) retval);..}..
2a6e0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
2a6f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2a700 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2a710 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
2a720 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2a730 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2a740 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2a750 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
2a760 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2a770 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2a780 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
2a790 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a7a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a7b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a7c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a7d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a7e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a7f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a800 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a810 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a820 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a840 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a850 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a860 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a870 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a880 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a890 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a8a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a8b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a8c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f  N(CK_RV, C_FindO
2a8d0 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53  bjectsInit)(CK_S
2a8e0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2a8f0 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49  ession, CK_ATTRI
2a900 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2a910 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
2a920 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  ount) {..CK_SLOT
2a930 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
2a940 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
2a950 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2a960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a970 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2a980 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2a990 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2a9a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a9b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2a9c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2a9d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2a9e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2a9f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2aa00 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2aa10 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2aa20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2aa30 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2aa40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2aa50 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2aa60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2aa70 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2aa80 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2aa90 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2aaa0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2aab0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2aac0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2aad0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2aae0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2aaf0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2ab00 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2ab10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ab20 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2ab30 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2ab40 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2ab50 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ab60 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2ab70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2ab80 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2ab90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2aba0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2abb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2abc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2abd0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2abe0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2abf0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2ac00 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2ac10 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2ac20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ac30 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
2ac40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2ac50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2ac60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2ac70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ac80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
2ac90 68 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  h already active
2aca0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2acb0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41  (CKR_OPERATION_A
2acc0 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  CTIVE);..}...slo
2acd0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
2ace0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2acf0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
2ad00 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
2ad10 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
2ad20 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
2ad30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2ad40 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ad50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ad60 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2ad70 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2ad80 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
2ad90 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
2ada0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
2adb0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2adc0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
2add0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2ade0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
2adf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ae00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ae10 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2ae20 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
2ae30 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
2ae40 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
2ae50 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
2ae60 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2ae70 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
2ae80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2ae90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2aea0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
2aeb0 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73  slotID].slot_res
2aec0 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
2aed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65  EBUG_PRINTF("The
2aee0 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72   slot has been r
2aef0 65 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61  eset since we la
2af00 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64  st looked for id
2af10 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63  entities -- resc
2af20 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20  anning");....if 
2af30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2af40 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2af50 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
2af60 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
2af70 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
2af80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2af90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
2afa0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2afb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2afc0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
2afd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2afe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2aff0 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
2b000 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b010 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2b020 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
2b030 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
2b040 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b050 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29  ].label != NULL)
2b060 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
2b070 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2b080 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65  label);....cacke
2b090 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2b0a0 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
2b0b0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  }....cackey_mark
2b0c0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
2b0d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2b0e0 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ]);...cackey_slo
2b0f0 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
2b100 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  reset = 0;..}...
2b110 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2b120 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2b130 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
2b140 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
2b150 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b160 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
2b170 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
2b180 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
2b190 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
2b1a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b1b0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2b1c0 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66  _count);..}...if
2b1d0 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e   (pTemplate != N
2b1e0 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43  ULL) {...if (ulC
2b1f0 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09  ount != 0) {....
2b200 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b210 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b220 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75  _query_count = u
2b230 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65  lCount;....cacke
2b240 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b250 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
2b260 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75  y = malloc(ulCou
2b270 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
2b280 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65  mplate));.....me
2b290 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73  mcpy(cackey_sess
2b2a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b2b0 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65  earch_query, pTe
2b2c0 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20  mplate, ulCount 
2b2d0 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c  * sizeof(*pTempl
2b2e0 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69  ate));....for (i
2b2f0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c  dx = 0; idx < ul
2b300 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  Count; idx++) {.
2b310 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74  ....if (pTemplat
2b320 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
2b330 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63  n == 0) {......c
2b340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b350 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2b360 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2b370 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09  e = NULL;.......
2b380 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
2b390 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2b3a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b3b0 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
2b3c0 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
2b3d0 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
2b3e0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
2b3f0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2b400 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b410 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
2b420 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ].pValue) {.....
2b430 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
2b440 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b450 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
2b460 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
2b470 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75  plate[idx].pValu
2b480 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  e, pTemplate[idx
2b490 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  ].ulValueLen);..
2b4a0 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  ...}....}...} el
2b4b0 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  se {....cackey_s
2b4c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b4d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
2b4e0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63  ount = 0;....cac
2b4f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b500 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
2b510 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ery = NULL;...}.
2b520 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
2b530 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
2b540 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2b550 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2b560 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b  glock);.....CACK
2b570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b580 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
2b590 71 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20  query specified 
2b5a0 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d  as NULL, but num
2b5b0 62 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72  ber of query ter
2b5c0 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  ms not specified
2b5d0 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65   as 0.");.....re
2b5e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2b5f0 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09  TS_BAD);...}....
2b600 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b610 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2b620 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
2b630 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2b640 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2b650 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c  arch_query = NUL
2b660 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  L;..}...cackey_s
2b670 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b680 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
2b690 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 1;..cackey_ses
2b6a0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b6b0 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
2b6c0 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   0;...mutex_retv
2b6d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2b6e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b6f0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2b700 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2b710 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b730 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2b740 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2b750 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2b760 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2b770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b780 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2b790 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2b7a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2b7b0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
2b7c0 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63   cackey_pkcs11_c
2b7d0 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
2b7e0 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  s(CK_ATTRIBUTE *
2b7f0 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20  a, CK_ATTRIBUTE 
2b800 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  *b) {..unsigned 
2b810 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20  char *smallbuf, 
2b820 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65  *largebuf;..size
2b830 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c  _t smallbuf_len,
2b840 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a   largebuf_len;..
2b850 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20  .if (a->type != 
2b860 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74  b->type) {...ret
2b870 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43  urn(0);..}...CAC
2b880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b890 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20  ("    ... found 
2b8a0 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e  matching type ..
2b8b0 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
2b8c0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
2b8d0 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a    ... our value:
2b8e0 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d  ", a->pValue, a-
2b8f0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09  >ulValueLen);...
2b900 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (b->pValue ==
2b910 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2b920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b930 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
2b940 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22   wildcard match"
2b950 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
2b960 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61  ..}...if (a->pVa
2b970 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  lue == NULL) {..
2b980 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a  .return(0);..}..
2b990 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65   .if (b->ulValue
2b9a0 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75  Len == a->ulValu
2b9b0 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61  eLen && memcmp(a
2b9c0 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61  ->pValue, b->pVa
2b9d0 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  lue, b->ulValueL
2b9e0 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  en) == 0) {...CA
2b9f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ba00 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
2ba10 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22  und exact match"
2ba20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b  );....return(1);
2ba30 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d  ..}...switch (a-
2ba40 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  >type) {...case 
2ba50 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
2ba60 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  if (a->ulValueLe
2ba70 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  n == b->ulValueL
2ba80 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
2ba90 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d  ....}.....if (a-
2baa0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d  >ulValueLen > b-
2bab0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
2bac0 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d  ...smallbuf = b-
2bad0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
2bae0 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75  llbuf_len = b->u
2baf0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
2bb00 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56  largebuf = a->pV
2bb10 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
2bb20 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
2bb30 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73  lueLen;....} els
2bb40 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  e {.....smallbuf
2bb50 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
2bb60 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d  ..smallbuf_len =
2bb70 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
2bb80 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20  .....largebuf = 
2bb90 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c  b->pValue;.....l
2bba0 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  argebuf_len = b-
2bbb0 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  >ulValueLen;....
2bbc0 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72  }.....for (; lar
2bbd0 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
2bbe0 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65  llbuf_len; large
2bbf0 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c  buf++,largebuf_l
2bc00 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28  en--) {.....if (
2bc10 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30  largebuf[0] != 0
2bc20 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  ) {......break;.
2bc30 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
2bc40 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  f (largebuf_len 
2bc50 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29  != smallbuf_len)
2bc60 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
2bc70 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d  .}.....if (memcm
2bc80 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c  p(largebuf, smal
2bc90 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c  lbuf, smallbuf_l
2bca0 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  en) == 0) {.....
2bcb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bcc0 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
2bcd0 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74  found approximat
2bce0 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09  e match");......
2bcf0 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a  return(1);....}.
2bd00 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2bd10 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b  return(0);.}..CK
2bd20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bd30 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
2bd40 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f  jects)(CK_SESSIO
2bd50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2bd60 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
2bd70 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
2bd80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78  , CK_ULONG ulMax
2bd90 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f  ObjectCount, CK_
2bda0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a  ULONG_PTR pulObj
2bdb0 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72  ectCount) {..str
2bdc0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
2bdd0 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43  ity *curr_id;..C
2bde0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
2bdf0 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e  r_attr;..CK_ULON
2be00 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63  G curr_id_idx, c
2be10 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20  urr_out_id_idx, 
2be20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73  curr_attr_idx, s
2be30 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43  ess_attr_idx;..C
2be40 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f  K_ULONG matched_
2be50 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63  count, prev_matc
2be60 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20  hed_count;..int 
2be70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69  mutex_retval;.#i
2be80 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2be90 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2bea0 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76  ST..struct timev
2beb0 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09  al start, end;..
2bec0 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69  uint64_t start_i
2bed0 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e  nt, end_int;.#en
2bee0 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
2bef0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2bf00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2bf10 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2bf20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bf30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bf40 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2bf50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2bf60 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2bf70 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2bf80 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63  }...if (pulObjec
2bf90 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  tCount == NULL) 
2bfa0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bfb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bfc0 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20   pulObjectCount 
2bfd0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2bfe0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2bff0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c000 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
2c010 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  ULL && ulMaxObje
2c020 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
2c030 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
2c040 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65  it, if zero obje
2c050 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69  cts were specifi
2c060 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69  ed return zero i
2c070 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  tems immediately
2c080 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74   */...*pulObject
2c090 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41  Count = 0;....CA
2c0a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c0b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c0c0 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2c0d0 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2c0e0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2c0f0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2c100 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c  phObject == NULL
2c110 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c120 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c130 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e  .  phObject is N
2c140 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2c150 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2c160 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  BAD);..}...if (u
2c170 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
2c180 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2c190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c1a0 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e  rror.  Maximum n
2c1b0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
2c1c0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65   specified as ze
2c1d0 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ro.");....return
2c1e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2c1f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  AD);..}...if (hS
2c200 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2c210 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2c220 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2c230 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2c240 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2c250 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2c260 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c270 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2c280 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2c290 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2c2a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2c2b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
2c2c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2c2d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2c2e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2c2f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2c300 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2c310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c320 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2c330 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2c340 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2c350 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2c360 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c370 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2c380 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2c390 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c3a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2c3b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c3c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2c3d0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2c3e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2c3f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2c400 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2c410 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2c420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c430 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b  search_active) {
2c440 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2c450 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2c460 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2c470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c480 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e  Error.  Search n
2c490 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2c4a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2c4b0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2c4c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69  IALIZED);..}..#i
2c4d0 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2c4e0 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2c4f0 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
2c500 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a  (&start, NULL);.
2c510 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75  #endif...curr_ou
2c520 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66  t_id_idx = 0;..f
2c530 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20  or (curr_id_idx 
2c540 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2c550 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2c560 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72  ch_curr_id; curr
2c570 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79  _id_idx < cackey
2c580 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c590 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2c5a0 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a  ount && ulMaxObj
2c5b0 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69  ectCount; curr_i
2c5c0 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  d_idx++) {...cur
2c5d0 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73  r_id = &cackey_s
2c5e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c5f0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72  ].identities[cur
2c600 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41  r_id_idx];....CA
2c610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c620 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64  F("Processing id
2c630 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e  entity:%lu", (un
2c640 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
2c650 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61  r_id_idx);....ma
2c660 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b  tched_count = 0;
2c670 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ....for (curr_at
2c680 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72  tr_idx = 0; curr
2c690 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b  _attr_idx < cack
2c6a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c6b0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
2c6c0 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61  ry_count; curr_a
2c6d0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
2c6e0 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
2c6f0 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  nt = matched_cou
2c700 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  nt;.....curr_att
2c710 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  r = &cackey_sess
2c720 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c730 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72  earch_query[curr
2c740 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09  _attr_idx];.....
2c750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c760 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e 67 20  NTF("  Checking 
2c770 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73  for attribute %s
2c780 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64   (0x%08lx) in id
2c790 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43  entity:%i...", C
2c7a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2c7b0 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
2c7c0 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  R(curr_attr->typ
2c7d0 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e), (unsigned lo
2c7e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
2c7f0 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  ype, (int) curr_
2c800 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b  id_idx);....CACK
2c810 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
2c820 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f  F("    Value loo
2c830 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72  king for:", curr
2c840 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63  _attr->pValue, c
2c850 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
2c860 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28  eLen);.....for (
2c870 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20  sess_attr_idx = 
2c880 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  0; sess_attr_idx
2c890 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72   < curr_id->attr
2c8a0 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65  ibutes_count; se
2c8b0 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  ss_attr_idx++) {
2c8c0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
2c8d0 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
2c8e0 74 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f  ttributes(&curr_
2c8f0 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  id->attributes[s
2c900 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63  ess_attr_idx], c
2c910 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09  urr_attr)) {....
2c920 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b  ..matched_count+
2c930 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  +;.......break;.
2c940 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
2c950 2a 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75  * If the attribu
2c960 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  te could not be 
2c970 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20  matched, do not 
2c980 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64  try to match add
2c990 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74  itional attribut
2c9a0 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65  es */....if (pre
2c9b0 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20  v_matched_count 
2c9c0 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  == matched_count
2c9d0 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ) {.....break;..
2c9e0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d  ..}...}....if (m
2c9f0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20  atched_count == 
2ca00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ca10 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
2ca20 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a  _query_count) {.
2ca30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ca40 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c  PRINTF("  ... Al
2ca50 6c 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20  l %i attributes 
2ca60 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
2ca70 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  d, adding identi
2ca80 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65  ty:%i to returne
2ca90 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63  d list", (int) c
2caa0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cab0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2cac0 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e  query_count, (in
2cad0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
2cae0 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75  .....phObject[cu
2caf0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d  rr_out_id_idx] =
2cb00 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31   curr_id_idx + 1
2cb10 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63  ;.....ulMaxObjec
2cb20 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75  tCount--;.....cu
2cb30 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b  rr_out_id_idx++;
2cb40 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
2cb50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb60 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c  TF("  ... Not al
2cb70 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64  l %i (only found
2cb80 20 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20   %i) attributes 
2cb90 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e  checked for foun
2cba0 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64  d, not adding id
2cbb0 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74  entity:%i", (int
2cbc0 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
2cbd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2cbe0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
2cbf0 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f  (int) matched_co
2cc00 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
2cc10 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a  id_idx);...}..}.
2cc20 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2cc30 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2cc40 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72  h_curr_id = curr
2cc50 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62  _id_idx;..*pulOb
2cc60 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72  jectCount = curr
2cc70 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69  _out_id_idx;..#i
2cc80 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55  fdef CACKEY_DEBU
2cc90 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45  G_SEARCH_SPEEDTE
2cca0 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79  ST..gettimeofday
2ccb0 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73  (&end, NULL);..s
2ccc0 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72  tart_int = (star
2ccd0 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30  t.tv_sec * 10000
2cce0 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75  00) + start.tv_u
2ccf0 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20  sec;..end_int = 
2cd00 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30  (end.tv_sec * 10
2cd10 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f  00000) + end.tv_
2cd20 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73  usec;..fprintf(s
2cd30 74 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74  tderr, "Search t
2cd40 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63  ook %lu microsec
2cd50 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e  onds\n", (unsign
2cd60 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e  ed long) (end_in
2cd70 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b  t - start_int));
2cd80 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f  .#endif...mutex_
2cd90 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2cda0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2cdb0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2cdc0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2cdd0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2cde0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cdf0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2ce00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2ce10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2ce20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2ce30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ce40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2ce50 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f  R_OK (%i), num o
2ce60 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43  bjects = %lu", C
2ce70 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63  KR_OK, *pulObjec
2ce80 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72  tCount);...retur
2ce90 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2cea0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2ceb0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
2cec0 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53  jectsFinal)(CK_S
2ced0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2cee0 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ession) {..CK_UL
2cef0 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ONG idx;..int mu
2cf00 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2cf10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cf20 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2cf30 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2cf40 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2cf50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cf60 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2cf70 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2cf80 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2cf90 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2cfa0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2cfb0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2cfc0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2cfd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2cfe0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2cff0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2d000 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2d010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d020 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2d030 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2d040 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d050 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d060 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2d070 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d080 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2d090 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d0a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d0b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d0d0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2d0e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d0f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d100 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2d110 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d120 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2d130 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2d140 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d150 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2d160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d170 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d180 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2d190 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2d1a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d1b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2d1c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d1d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d1e0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
2d1f0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2d200 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2d210 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2d220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d230 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
2d240 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d250 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d260 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2d270 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2d280 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2d290 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d2a0 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
2d2b0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
2d2c0 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
2d2d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
2d2e0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
2d2f0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
2d300 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d310 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d320 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
2d330 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63  lue) {....free(c
2d340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d350 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
2d360 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
2d370 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  e);...}..}...if 
2d380 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d390 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
2d3a0 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65  h_query) {...fre
2d3b0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2d3c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
2d3d0 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09  ch_query);..}...
2d3e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2d3f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2d400 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2d410 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2d420 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2d430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2d450 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2d460 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d470 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2d480 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d490 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d4a0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2d4b0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2d4c0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2d4d0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d4e0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
2d4f0 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
2d500 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d510 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2d520 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2d530 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2d540 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2d550 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d560 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d570 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d580 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d5a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d5b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d5c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d5d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d5e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d5f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d600 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d610 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d620 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d630 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d640 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d650 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d660 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d670 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d680 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
2d690 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
2d6a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d6b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2d6c0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2d6d0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2d6e0 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44  _PTR pEncryptedD
2d6f0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ata, CK_ULONG_PT
2d700 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61  R pulEncryptedDa
2d710 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
2d720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2d730 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2d740 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2d750 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2d760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d770 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2d780 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2d790 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2d7a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d7b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d7c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d7d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2d7e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d7f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2d800 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d810 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d820 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d830 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d840 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d850 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
2d860 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
2d870 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2d880 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2d890 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2d8a0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
2d8b0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2d8c0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2d8d0 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
2d8e0 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2d8f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d900 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2d910 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2d920 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2d930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d940 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2d950 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2d960 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2d970 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2d980 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2d990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d9a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2d9b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d9c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2d9d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d9e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2d9f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2da00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2da10 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2da20 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
2da30 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f  ncryptFinal)(CK_
2da40 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2da50 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2da60 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70  _PTR pLastEncryp
2da70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2da80 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63  G_PTR pulLastEnc
2da90 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
2daa0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dab0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2dac0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2dad0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2dae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2daf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2db00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2db10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2db20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2db30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2db40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2db50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2db60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2db70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2db80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2db90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2dba0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2dbb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2dbc0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2dbd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2dbe0 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28   C_DecryptInit)(
2dbf0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dc00 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2dc10 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2dc20 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2dc30 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2dc40 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
2dc50 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
2dc60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2dc70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2dc80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2dc90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2dca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dcb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2dcc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2dcd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2dce0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2dcf0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2dd00 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
2dd10 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2dd20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dd30 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
2dd40 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
2dd50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2dd60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2dd70 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
2dd80 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
2dd90 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
2dda0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ddb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
2ddc0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2ddd0 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
2dde0 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
2ddf0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2de00 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
2de10 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2de20 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2de30 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2de40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2de50 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2de60 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2de70 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2de80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2de90 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2dea0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2deb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2dec0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2ded0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2dee0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2def0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2df00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2df10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2df20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2df30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2df40 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2df50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2df60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2df70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2df80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2df90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2dfa0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2dfb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2dfc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2dfd0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2dfe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2dff0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2e000 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2e010 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2e020 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2e030 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2e040 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e050 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2e060 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2e070 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2e080 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2e090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e0a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2e0b0 63 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e  crypt already in
2e0c0 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
2e0d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2e0e0 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
2e0f0 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
2e100 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2e110 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2e120 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
2e130 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e140 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e150 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e170 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
2e180 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
2e190 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
2e1a0 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
2e1b0 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
2e1c0 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2e1d0 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
2e1e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
2e1f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e200 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2e210 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
2e220 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
2e230 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2e240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e250 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2e260 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  t_active = 1;...
2e270 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e280 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2e290 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  t_mechanism = pM
2e2a0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2e2b0 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ism;..cackey_ses
2e2c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e2d0 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
2e2e0 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
2e2f0 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63  pParameter;..cac
2e300 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e310 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
2e320 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d  ech_parmlen = pM
2e330 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61  echanism->ulPara
2e340 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65  meterLen;..cacke
2e350 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e360 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2e370 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
2e380 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e390 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
2e3a0 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
2e3b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2e3c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2e3d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2e3e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2e3f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2e400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e410 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2e420 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2e430 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2e440 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2e450 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e460 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2e470 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2e480 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2e490 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2e4a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e4b0 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53   C_Decrypt)(CK_S
2e4c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e4d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2e4e0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
2e4f0 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  ta, CK_ULONG ulE
2e500 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c  ncryptedDataLen,
2e510 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2e520 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
2e530 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09   pulDataLen) {..
2e540 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e  CK_ULONG datalen
2e550 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e  _update, datalen
2e560 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64  _final;..CK_RV d
2e570 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74  ecrypt_ret;..int
2e580 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2e590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e5a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2e5b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2e5c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2e5d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e5e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2e5f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2e600 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2e610 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2e620 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2e630 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d  f (pulDataLen ==
2e640 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2e650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e660 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65  Error. pulDataLe
2e670 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2e680 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2e690 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2e6a0 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20  .datalen_update 
2e6b0 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a  = *pulDataLen;..
2e6c0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
2e6d0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68  _DecryptUpdate(h
2e6e0 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70  Session, pEncryp
2e6f0 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79  tedData, ulEncry
2e700 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61  ptedDataLen, pDa
2e710 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64  ta, &datalen_upd
2e720 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79  ate);..if (decry
2e730 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
2e740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e760 2e 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65  .  DecryptUpdate
2e770 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
2e780 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
2e790 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2e7a0 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
2e7b0 0a 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ...if (decrypt_r
2e7c0 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
2e7d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2e7e0 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65  ./* Terminate de
2e7f0 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69  cryption operati
2e800 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f  on */.....mutex_
2e810 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2e820 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2e830 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
2e840 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2e850 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
2e860 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e870 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2e880 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2e890 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2e8a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2e8b0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2e8c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e8d0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2e8e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e8f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e900 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2e910 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e920 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2e930 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2e940 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2e950 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2e960 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
2e970 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2e980 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e990 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2e9a0 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2e9b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2e9c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2e9d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e9e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e9f0 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2ea00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2ea10 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2ea20 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2ea30 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
2ea40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ea50 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2ea60 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
2ea70 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2ea80 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ea90 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2eaa0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
2eab0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2eac0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ead0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2eae0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2eaf0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
2eb00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2eb10 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
2eb20 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
2eb30 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
2eb40 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61  pData) {...pData
2eb50 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61   += datalen_upda
2eb60 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f  te;..}..datalen_
2eb70 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61  final = *pulData
2eb80 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70  Len - datalen_up
2eb90 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f  date;...decrypt_
2eba0 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46  ret = C_DecryptF
2ebb0 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70  inal(hSession, p
2ebc0 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66  Data, &datalen_f
2ebd0 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72  inal);..if (decr
2ebe0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ypt_ret != CKR_O
2ebf0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2ec00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ec10 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c  r.  DecryptFinal
2ec20 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
2ec30 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
2ec40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2ec50 29 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  ) decrypt_ret);.
2ec60 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70  ...return(decryp
2ec70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75  t_ret);..}...*pu
2ec80 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c  lDataLen = datal
2ec90 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61  en_update + data
2eca0 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43  len_final;...CAC
2ecb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ecc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ecd0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2ece0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ecf0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2ed00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ed10 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  , C_DecryptUpdat
2ed20 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2ed30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2ed40 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
2ed50 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
2ed60 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
2ed70 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2ed80 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2ed90 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
2eda0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
2edb0 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d  _BYTE buf[16384]
2edc0 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65  ;..ssize_t bufle
2edd0 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  n;..CK_SLOT_ID s
2ede0 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65  lotID;..CK_RV re
2edf0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2ee00 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d  AL_ERROR;..int m
2ee10 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2ee20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ee30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ee40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ee50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ee60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ee70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ee80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ee90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2eea0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2eeb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2eec0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2eed0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2eee0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2eef0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2ef00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ef10 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2ef20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ef30 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2ef40 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2ef50 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2ef60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2ef70 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2ef80 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
2ef90 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e   == NULL && ulEn
2efa0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
2efb0 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
2efc0 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
2efd0 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63  are asked to dec
2efe0 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20  rypt nothing... 
2eff0 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
2f000 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f010 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20  ing CKR_OK (%i) 
2f020 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22  (short circuit)"
2f030 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65  , CKR_OK);....re
2f040 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
2f050 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
2f060 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  dPart == NULL) {
2f070 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f080 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2f090 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73  EncryptedPart is
2f0a0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63   NULL, but ulEnc
2f0b0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
2f0c0 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
2f0d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2f0e0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2f0f0 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   (ulEncryptedPar
2f100 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
2f110 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f120 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63  TF("Error. ulEnc
2f130 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73  ryptedPartLen is
2f140 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
2f150 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
2f160 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2f170 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2f180 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20  .if (pulPartLen 
2f190 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2f1a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f1b0 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74  ("Error. pulPart
2f1c0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2f1d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2f1e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2f1f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2f200 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2f210 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2f220 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2f230 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2f240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f250 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2f260 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2f270 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2f280 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2f290 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2f2a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2f2b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2f2c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2f2d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2f2e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2f2f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f300 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2f310 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2f320 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2f330 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2f340 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2f350 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2f360 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2f370 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2f380 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2f390 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2f3a0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2f3b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f3c0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2f3d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2f3e0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2f3f0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2f400 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
2f410 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2f420 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
2f430 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
2f440 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
2f450 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2f460 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
2f470 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
2f480 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2f490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f4a0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2f4b0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2f4c0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
2f4d0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
2f4e0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
2f4f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2f500 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2f510 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2f520 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
2f530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2f550 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2f560 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
2f570 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
2f580 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
2f590 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2f5a0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2f5b0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
2f5c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2f5d0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
2f5e0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
2f5f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2f600 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20  rypt_mechanism) 
2f610 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2f620 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
2f630 20 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74   card to decrypt
2f640 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20   */....buflen = 
2f650 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2f660 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2f670 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2f680 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2f690 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
2f6a0 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64  tity, pEncrypted
2f6b0 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65  Part, ulEncrypte
2f6c0 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73  dPartLen, buf, s
2f6d0 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31  izeof(buf), 0, 1
2f6e0 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65  );.....if (bufle
2f6f0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2f700 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20  _E_NEEDLOGIN && 
2f710 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
2f720 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
2f730 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d 75 74  ..if (C_LoginMut
2f740 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20  exArg(hSession, 
2f750 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20  CKU_USER, NULL, 
2f760 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29  0, 0) == CKR_OK)
2f770 20 7b 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d   {......buflen =
2f780 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2f790 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2f7a0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2f7b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2f7c0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65  ion].decrypt_ide
2f7d0 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65  ntity, pEncrypte
2f7e0 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74  dPart, ulEncrypt
2f7f0 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20  edPartLen, buf, 
2f800 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20  sizeof(buf), 0, 
2f810 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  1);.....}....}..
2f820 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20  ...if (buflen < 
2f830 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  0) {...../* Decr
2f840 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a  yption failed. *
2f850 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  /.....if (buflen
2f860 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2f870 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  E_NEEDLOGIN) {..
2f880 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2f890 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44  _USER_NOT_LOGGED
2f8a0 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  _IN;.....} else 
2f8b0 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
2f8c0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
2f8d0 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  NABSENT) {......
2f8e0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56  retval = CKR_DEV
2f8f0 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09  ICE_REMOVED;....
2f900 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43  .} else {......C
2f910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f920 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
2f930 6e 64 20 41 50 44 55 2c 20 65 72 72 6f 72 20 3d  nd APDU, error =
2f940 20 25 6c 69 22 2c 20 28 6c 6f 6e 67 20 69 6e 74   %li", (long int
2f950 29 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  ) buflen);......
2f960 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45  .retval = CKR_GE
2f970 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09  NERAL_ERROR;....
2f980 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20  .}....} else if 
2f990 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
2f9a0 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  ) buflen) > *pul
2f9b0 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74  PartLen && pPart
2f9c0 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2f9d0 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  pted data too la
2f9e0 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61  rge */.....retva
2f9f0 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2fa00 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65  OO_SMALL;....} e
2fa10 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50  lse {.....if (pP
2fa20 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  art) {......memc
2fa30 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62  py(pPart, buf, b
2fa40 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09  uflen);.....}...
2fa50 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d  ...*pulPartLen =
2fa60 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65   buflen;......re
2fa70 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
2fa80 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
2fa90 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2faa0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2fab0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fac0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2fad0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2fae0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2faf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2fb00 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2fb10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2fb20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2fb30 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2fb40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2fb50 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e  turning %i", (in
2fb60 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  t) retval);...re
2fb70 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2fb80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2fb90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2fba0 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ryptFinal)(CK_SE
2fbb0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2fbc0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2fbd0 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b  TR pLastPart, CK
2fbe0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
2fbf0 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e  stPartLen) {..in
2fc00 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2fc10 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64  .int terminate_d
2fc20 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41  ecrypt = 1;...CA
2fc30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fc40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2fc50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2fc60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2fc70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fc80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2fc90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2fca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2fcb0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2fcc0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2fcd0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2fce0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2fcf0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2fd00 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2fd10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2fd20 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2fd30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2fd40 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2fd50 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2fd60 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2fd70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2fd80 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2fd90 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20  (pulLastPartLen 
2fda0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2fdb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fdc0 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74  ("Error. pulLast
2fdd0 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  PartLen is NULL.
2fde0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2fdf0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2fe00 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2fe10 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2fe20 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2fe30 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2fe40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2fe50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2fe60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2fe70 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2fe80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2fe90 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2fea0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2feb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2fec0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2fed0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2fee0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2fef0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2ff00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ff10 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2ff20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2ff30 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2ff40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2ff50 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2ff60 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2ff70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2ff80 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
2ff90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2ffa0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2ffb0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2ffc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ffd0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
2ffe0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2fff0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
30000 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
30010 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75  LIZED);..}...*pu
30020 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30  lLastPartLen = 0
30030 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72  ;...if (pLastPar
30040 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74  t == NULL) {...t
30050 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
30060 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74   = 0;..}...if (t
30070 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
30080 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
30090 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
300a0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
300b0 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72   0;..}...mutex_r
300c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
300d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
300e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
300f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
30100 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
30110 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30120 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
30130 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
30140 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
30150 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
30160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30170 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30180 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
30190 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
301a0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
301b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
301c0 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29  V, C_DigestInit)
301d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
301e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
301f0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
30200 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43  echanism) {..CAC
30210 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30220 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
30230 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
30240 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
30250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30260 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
30270 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
30280 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
30290 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
302a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
302b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
302c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
302d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
302e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
302f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30300 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
30310 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30320 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
30330 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30340 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
30350 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gest)(CK_SESSION
30360 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
30370 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
30380 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
30390 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
303a0 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
303b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
303c0 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
303d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
303e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
303f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30400 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30420 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30430 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30440 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30450 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30460 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30480 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30490 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
304a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
304b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
304c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
304d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
304e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
304f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30500 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
30510 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
30520 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30530 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30540 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
30550 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
30560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30570 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30580 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30590 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
305a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
305b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
305c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
305d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
305e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
305f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
30600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30610 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30630 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30640 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30650 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30660 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30670 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30680 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30690 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
306a0 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f  C_DigestKey)(CK_
306b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
306c0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
306d0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
306e0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
306f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30700 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30710 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30730 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30740 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30760 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30770 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30790 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
307a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
307b0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
307c0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
307d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
307e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
307f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30800 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
30810 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30820 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29  , C_DigestFinal)
30830 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30840 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30850 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
30860 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
30870 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
30880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30890 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
308a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
308b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
308c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
308d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
308e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
308f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30900 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30910 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30930 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30940 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30950 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30960 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30970 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30980 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30990 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
309a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
309b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
309c0 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45  _SignInit)(CK_SE
309d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
309e0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
309f0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
30a00 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
30a10 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
30a20 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
30a30 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
30a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30a50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30a60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
30a70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
30a80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30a90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
30aa0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
30ab0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
30ac0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30ad0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
30ae0 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
30af0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30b00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30b10 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
30b20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
30b30 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
30b40 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
30b50 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
30b60 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
30b70 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
30b80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30b90 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
30ba0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
30bb0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
30bc0 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
30bd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
30be0 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
30bf0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
30c00 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
30c10 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
30c20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
30c30 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
30c40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
30c50 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
30c60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30c70 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
30c80 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
30c90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
30ca0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
30cb0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
30cc0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
30cd0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
30ce0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
30cf0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
30d00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
30d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
30d20 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
30d30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
30d40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
30d50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
30d60 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
30d70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
30d80 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
30d90 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
30da0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
30db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30dc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
30dd0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
30de0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
30df0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
30e00 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
30e10 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
30e20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
30e30 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09  sign_active) {..
30e40 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
30e50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
30e60 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
30e70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30e80 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61  ror.  Sign alrea
30e90 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22  dy in progress."
30ea0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
30eb0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
30ec0 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  IVE);..}...if (h
30ed0 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65  Key >= cackey_se
30ee0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
30ef0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
30f00 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  t) {...cackey_mu
30f10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
30f20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
30f30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30f40 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20  TF("Error.  Key 
30f50 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
30f60 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b  nge (requested k
30f70 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75  ey %lu, only %lu
30f80 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69   identities avai
30f90 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67  lable).", (unsig
30fa0 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20  ned long) hKey, 
30fb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
30fc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
30fd0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
30fe0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
30ff0 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
31000 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
31010 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
31020 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31030 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ign_active = 1;.
31040 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
31050 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
31060 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
31070 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
31080 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  sm;...cackey_ses
31090 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
310a0 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32  sign_buflen = 12
310b0 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  8;..cackey_sessi
310c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
310d0 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a  gn_bufused = 0;.
310e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
310f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
31100 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  buf = malloc(siz
31110 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
31120 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31130 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
31140 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
31150 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
31160 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
31170 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f  G_PRINTF("Sessio
31180 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74  n %lu sign_ident
31190 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e 74  ity is %p (ident
311a0 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73  ity #%lu)", (uns
311b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
311c0 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26  sion, (void *) &
311d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
311e0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
311f0 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73  ties[hKey], (uns
31200 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79  igned long) hKey
31210 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  );..cackey_sessi
31220 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31230 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63  gn_identity = &c
31240 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
31250 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
31260 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74  ies[hKey];...mut
31270 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
31280 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
31290 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
312a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
312b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
312c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
312d0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
312e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
312f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
31300 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
31310 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31320 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
31330 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
31340 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
31350 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
31360 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
31370 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43  CK_RV, C_Sign)(C
31380 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
31390 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
313a0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
313b0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
313c0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
313d0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
313e0 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
313f0 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67  ureLen) {..unsig
31400 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73  ned long start_s
31410 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b  ign_bufused;..CK
31420 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69  _RV sign_ret;..i
31430 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
31440 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31450 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
31460 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
31470 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
31480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31490 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
314a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
314b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
314c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
314d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
314e0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
314f0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
31500 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
31510 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
31520 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
31530 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
31540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31550 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
31560 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
31570 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
31580 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
31590 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
315a0 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  ..start_sign_buf
315b0 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65  used = cackey_se
315c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
315d0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  .sign_bufused;..
315e0 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69  .sign_ret = C_Si
315f0 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  gnUpdate(hSessio
31600 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61  n, pData, ulData
31610 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
31620 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
31630 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
31640 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
31650 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65 74  SignUpdate() ret
31660 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
31670 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
31680 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
31690 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69  _ret);....if (si
316a0 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55  gn_ret != CKR_BU
316b0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
316c0 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  {....mutex_retva
316d0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
316e0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
316f0 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
31700 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
31710 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
31720 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
31730 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
31740 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
31750 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
31760 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
31770 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
31780 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
31790 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
317a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
317b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
317c0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
317d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
317e0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
317f0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
31800 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
31810 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
31820 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
31830 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
31840 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
31850 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  gn_active) {....
31860 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
31870 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31880 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
31890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
318a0 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
318b0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
318c0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
318d0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
318e0 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a  IALIZED);....}..
318f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
31900 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
31910 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
31920 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
31930 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
31940 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
31950 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
31960 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
31970 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
31980 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
31990 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
319a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
319b0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
319c0 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
319d0 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
319e0 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f  ret);..}...sign_
319f0 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  ret = C_SignFina
31a00 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67  l(hSession, pSig
31a10 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61  nature, pulSigna
31a20 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73  tureLen);..if (s
31a30 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
31a40 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f  K) {...if (sign_
31a50 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  ret == CKR_BUFFE
31a60 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
31a70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
31a80 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c  RINTF("SignFinal
31a90 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f  () returned CKR_
31aa0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
31ab0 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64   (rv = %lu), und
31ac0 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74  oing C_SignUpdat
31ad0 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e()", (unsigned 
31ae0 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
31af0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
31b00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
31b10 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
31b20 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
31b30 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67  ;.....return(sig
31b40 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43  n_ret);...}....C
31b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31b60 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
31b70 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
31b80 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
31b90 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
31ba0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
31bb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
31bc0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _ret);..}...if (
31bd0 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55  pSignature == NU
31be0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
31bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69  EBUG_PRINTF("pSi
31c00 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69 65  gnature specifie
31c10 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69  d as NULL, undoi
31c20 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
31c30 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73  )");....cackey_s
31c40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
31c50 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
31c60 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75   start_sign_bufu
31c70 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73  sed;....return(s
31c80 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43  ign_ret);..}...C
31c90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31ca0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
31cb0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
31cc0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
31cd0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
31ce0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
31cf0 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65  RV, C_SignUpdate
31d00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
31d10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
31d20 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
31d30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
31d40 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
31d50 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 72  x_retval;..int r
31d60 65 73 69 7a 65 52 65 74 72 79 3b 0a 09 69 6e 74  esizeRetry;..int
31d70 20 6e 65 65 64 52 65 73 69 7a 65 3b 0a 0a 09 43   needResize;...C
31d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31d90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
31da0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
31db0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
31dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31dd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
31de0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
31df0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
31e00 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
31e10 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
31e20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
31e30 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
31e40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
31e50 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
31e60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
31e70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
31e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31e90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
31ea0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
31eb0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
31ec0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
31ed0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
31ee0 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20   (pPart == NULL 
31ef0 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  && ulPartLen == 
31f00 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
31f10 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61 72  circuit if we ar
31f20 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20  e asked to sign 
31f30 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
31f40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31f50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
31f60 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
31f70 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
31f80 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
31f90 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
31fa0 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (pPart == NULL)
31fb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
31fc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
31fd0 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20   pPart is NULL, 
31fe0 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  but ulPartLen is
31ff0 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65   not 0.");....re
32000 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
32010 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
32020 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30   (ulPartLen == 0
32030 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32040 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32050 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30  . ulPartLen is 0
32060 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20 6e  , but pPart is n
32070 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
32080 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
32090 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
320a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
320b0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
320c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
320d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
320e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
320f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32100 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
32110 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
32120 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
32130 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
32140 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
32150 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
32160 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
32170 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
32180 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
32190 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
321a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
321b0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
321c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
321d0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
321e0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
321f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
32200 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
32210 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
32220 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
32230 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
32240 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
32250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
32260 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
32270 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
32280 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
32290 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
322a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
322b0 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65  witch (cackey_se
322c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
322d0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29  .sign_mechanism)
322e0 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53   {...case CKM_RS
322f0 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63  A_PKCS:..../* Ac
32300 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c  cumulate directl
32310 79 20 2a 2f 0a 09 09 09 66 6f 72 20 28 72 65 73  y */....for (res
32320 69 7a 65 52 65 74 72 79 20 3d 20 30 3b 20 72 65  izeRetry = 0; re
32330 73 69 7a 65 52 65 74 72 79 20 3c 20 31 31 3b 20  sizeRetry < 11; 
32340 72 65 73 69 7a 65 52 65 74 72 79 2b 2b 29 20 7b  resizeRetry++) {
32350 0a 09 09 09 09 6e 65 65 64 52 65 73 69 7a 65 20  .....needResize 
32360 3d 20 30 3b 0a 09 09 09 09 69 66 20 28 28 63 61  = 0;.....if ((ca
32370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
32380 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
32390 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
323a0 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
323b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
323c0 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
323d0 09 09 6e 65 65 64 52 65 73 69 7a 65 20 3d 20 31  ..needResize = 1
323e0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
323f0 28 21 6e 65 65 64 52 65 73 69 7a 65 29 20 7b 0a  (!needResize) {.
32400 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
32410 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
32420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 69  BUG_PRINTF("Resi
32430 7a 69 6e 67 20 73 69 67 6e 69 6e 67 20 62 75 66  zing signing buf
32440 66 65 72 20 28 74 72 79 20 23 25 69 20 6f 66 20  fer (try #%i of 
32450 31 30 20 2d 2d 20 31 31 74 68 20 69 73 20 66 61  10 -- 11th is fa
32460 74 61 6c 29 22 2c 20 72 65 73 69 7a 65 52 65 74  tal)", resizeRet
32470 72 79 29 3b 0a 0a 09 09 09 09 69 66 20 28 72 65  ry);......if (re
32480 73 69 7a 65 52 65 74 72 79 20 3d 3d 20 31 30 29  sizeRetry == 10)
32490 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
324a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
324b0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29  ssion].sign_buf)
324c0 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
324d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
324e0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20  ].sign_buflen = 
324f0 30 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  0;......cackey_s
32500 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32510 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 4e 55 4c  ].sign_buf = NUL
32520 4c 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  L;.......break;.
32530 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65  ....}......cacke
32540 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32550 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
32560 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
32570 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
32580 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
32590 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
325a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
325b0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
325c0 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
325d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
325e0 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
325f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
32600 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
32610 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
32620 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32630 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
32640 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  uf == NULL) {...
32650 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
32660 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
32670 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
32680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
32690 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 69 6e 67  "Error.  Signing
326a0 20 62 75 66 66 65 72 20 69 73 20 4e 55 4c 4c 2e   buffer is NULL.
326b0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
326c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
326d0 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  R);....}.....mem
326e0 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
326f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32700 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f  gn_buf + cackey_
32710 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
32720 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
32730 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65   pPart, ulPartLe
32740 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  n);.....cackey_s
32750 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
32760 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
32770 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09  = ulPartLen;....
32780 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
32790 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
327a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
327b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
327c0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
327d0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
327e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
327f0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
32800 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
32810 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
32820 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
32830 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32840 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
32850 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
32860 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
32870 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
32880 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
32890 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e  CK_RV, C_SignFin
328a0 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
328b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
328c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
328d0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
328e0 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
328f0 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  eLen) {..static 
32900 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31  CK_BYTE sigbuf[1
32910 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73  024];..ssize_t s
32920 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c  igbuflen;..CK_SL
32930 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
32940 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
32950 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
32960 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
32970 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d  sign = 1;..int m
32980 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
32990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
329a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
329b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
329c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
329d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
329e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
329f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
32a00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
32a10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
32a20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
32a30 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  (pulSignatureLen
32a40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
32a50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32a60 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67  F("Error. pulSig
32a70 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c  natureLen is NUL
32a80 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
32a90 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
32aa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
32ab0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
32ac0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
32ad0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
32ae0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
32af0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
32b00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
32b10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
32b20 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
32b30 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
32b40 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
32b50 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
32b60 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
32b70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
32b80 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
32b90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
32ba0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
32bb0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
32bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32bd0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
32be0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
32bf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
32c00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
32c10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
32c20 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
32c30 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
32c40 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
32c50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
32c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
32c70 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
32c80 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
32c90 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
32ca0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
32cb0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
32cc0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
32cd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
32ce0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
32cf0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
32d00 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
32d10 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
32d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
32d30 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
32d40 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
32d50 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
32d60 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
32d70 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ED);..}...slotID
32d80 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
32d90 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
32da0 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
32db0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
32dc0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
32dd0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
32de0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
32df0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
32e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
32e10 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
32e20 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
32e30 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
32e40 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
32e50 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
32e60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
32e70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
32e80 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
32e90 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
32ea0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32eb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
32ec0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
32ed0 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
32ee0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
32ef0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
32f00 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
32f10 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
32f20 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
32f30 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
32f40 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  RROR);..}...swit
32f50 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ch (cackey_sessi
32f60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
32f70 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  gn_mechanism) {.
32f80 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50  ..case CKM_RSA_P
32f90 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63  KCS:..../* Ask c
32fa0 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09  ard to sign */..
32fb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
32fc0 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f  RINTF("Asking to
32fd0 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74   sign from ident
32fe0 69 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f  ity %p in sessio
32ff0 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29  n %lu", (void *)
33000 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
33010 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33020 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67  identity, (unsig
33030 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
33040 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65  on);....sigbufle
33050 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
33060 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
33070 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
33080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
33090 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
330a0 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65  ntity, cackey_se
330b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
330c0 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65  .sign_buf, cacke
330d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
330e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
330f0 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f  d, sigbuf, sizeo
33100 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29  f(sigbuf), 1, 0)
33110 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  ;.....if (sigbuf
33120 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
33130 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
33140 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
33150 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
33160 09 09 09 09 69 66 20 28 43 5f 4c 6f 67 69 6e 4d  ....if (C_LoginM
33170 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f 6e  utexArg(hSession
33180 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c  , CKU_USER, NULL
33190 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f  , 0, 0) == CKR_O
331a0 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62 75 66  K) {......sigbuf
331b0 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
331c0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
331d0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
331e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
331f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
33200 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
33210 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
33220 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
33230 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
33240 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
33250 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
33260 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
33270 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  0);.....}....}..
33280 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
33290 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53   < 0) {...../* S
332a0 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a  igning failed. *
332b0 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66  /.....if (sigbuf
332c0 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
332d0 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
332e0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
332f0 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
33300 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
33310 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e  se if (sigbuflen
33320 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
33330 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
33340 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
33350 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
33360 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  D;.....} else {.
33370 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
33380 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
33390 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
333a0 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
333b0 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
333c0 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
333d0 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
333e0 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
333f0 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
33400 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f  e */.....CACKEY_
33410 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65  DEBUG_PRINTF("re
33420 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
33430 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69  R_TOO_SMALL;  si
33440 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70  gbuflen = %lu, p
33450 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
33460 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
33470 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
33480 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
33490 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ) *pulSignatureL
334a0 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  en);......retval
334b0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
334c0 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65  O_SMALL;......te
334d0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
334e0 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
334f0 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
33500 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70   = 0;......if (p
33510 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
33520 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74  ..memcpy(pSignat
33530 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67  ure, sigbuf, sig
33540 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74  buflen);.......t
33550 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
33560 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  1;.....}......*p
33570 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
33580 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09   sigbuflen;.....
33590 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
335a0 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
335b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
335c0 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69  nate_sign) {...i
335d0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
335e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
335f0 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65  n_buf) {....free
33600 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
33610 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
33620 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  buf);...}....cac
33630 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
33640 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
33650 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
33660 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
33670 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
33680 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
33690 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
336a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
336b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
336c0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
336d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
336e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
336f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
33700 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33710 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33720 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
33730 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
33740 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
33750 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
33760 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
33770 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
33780 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33790 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
337a0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
337b0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
337c0 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
337d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
337e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
337f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
33800 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
33810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
33820 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
33830 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
33840 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
33850 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
33860 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
33870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
33880 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
33890 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
338a0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
338b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
338c0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
338d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
338e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
338f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
33900 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
33910 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
33920 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
33930 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
33940 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
33950 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
33960 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
33970 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
33980 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
33990 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
339a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
339b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
339c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
339d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
339e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
339f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33a00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33a10 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33a20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33a30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33a40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33a50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33a60 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33a70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33a80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33a90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33aa0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33ab0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33ac0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33ad0 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29  V, C_VerifyInit)
33ae0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
33af0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
33b00 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
33b10 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
33b20 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
33b30 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33b40 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33b50 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33b60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33b70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33b80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
33b90 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33ba0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33bb0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33bc0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33bd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33be0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33bf0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33c00 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33c10 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33c20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33c30 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33c40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33c50 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33c60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33c70 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f  V, C_Verify)(CK_
33c80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
33c90 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
33ca0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
33cb0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
33cc0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
33cd0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
33ce0 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
33cf0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
33d00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
33d10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
33d20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
33d30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
33d40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
33d50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
33d60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
33d70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
33d80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
33d90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
33da0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
33db0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
33dc0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
33dd0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
33de0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
33df0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
33e00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
33e10 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
33e20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
33e30 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74  V, C_VerifyUpdat
33e40 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
33e50 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
33e60 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
33e70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
33e80 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
33e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
33ea0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
33eb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
33ec0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
33ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
33ee0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
33ef0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
33f00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
33f10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
33f20 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
33f30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
33f40 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
33f50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
33f60 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
33f70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
33f80 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
33f90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
33fa0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
33fb0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
33fc0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
33fd0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
33fe0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
33ff0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34000 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
34010 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
34020 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
34030 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
34040 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
34050 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
34060 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
34070 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
34080 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
34090 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
340a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
340b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
340c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
340d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
340e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
340f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
34100 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
34110 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
34120 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
34130 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
34140 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
34150 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
34160 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
34170 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
34180 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
34190 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
341a0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
341b0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
341c0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
341d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
341e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
341f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34200 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34210 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
34220 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
34230 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
34240 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
34250 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
34260 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
34270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34280 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
34290 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
342a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
342b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
342c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
342d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
342e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
342f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34300 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
34310 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b  erifyRecover)(CK
34320 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34330 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
34340 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
34350 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
34360 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59  natureLen, CK_BY
34370 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
34380 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
34390 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
343a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
343b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
343c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
343d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
343e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
343f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
34400 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
34410 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
34420 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
34430 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
34440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
34450 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
34460 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
34470 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
34480 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34490 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
344a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
344b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
344c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
344d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
344e0 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  tEncryptUpdate)(
344f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
34500 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
34510 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
34520 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
34530 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
34540 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
34550 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
34560 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
34570 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34580 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34590 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
345a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
345b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
345c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
345d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
345e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
345f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34600 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34610 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34620 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34630 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34640 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34650 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34660 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34670 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34680 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34690 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
346a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
346b0 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65  V, C_DecryptDige
346c0 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
346d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
346e0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
346f0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
34700 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
34710 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
34720 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
34730 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
34740 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
34750 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34760 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
34770 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
34780 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
34790 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
347a0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
347b0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
347c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
347d0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
347e0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
347f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
34800 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
34810 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34820 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
34830 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34840 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
34850 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
34860 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34870 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
34880 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
34890 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
348a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
348b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
348c0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
348d0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
348e0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
348f0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
34900 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
34910 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
34920 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
34930 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
34940 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
34950 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
34960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
34970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
34980 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
34990 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
349a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
349b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
349c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
349d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
349e0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
349f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
34a00 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
34a10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34a20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
34a30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
34a40 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
34a50 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
34a60 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65  _RV, C_DecryptVe
34a70 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
34a80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
34a90 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
34aa0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
34ab0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
34ac0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
34ad0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
34ae0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
34af0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
34b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
34b10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
34b20 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
34b30 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
34b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
34b50 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
34b60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
34b70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
34b80 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
34b90 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
34ba0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
34bb0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
34bc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
34bd0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
34be0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
34bf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
34c00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
34c10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
34c20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
34c30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
34c40 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b  _GenerateKey)(CK
34c50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
34c60 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
34c70 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
34c80 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
34c90 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
34ca0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
34cb0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
34cc0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
34cd0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
34ce0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
34cf0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
34d00 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
34d10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
34d20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
34d30 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
34d40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
34d50 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
34d60 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
34d70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
34d80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
34d90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
34da0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
34db0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
34dc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
34dd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
34de0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
34df0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
34e00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
34e10 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
34e20 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Pair)(CK_SESSION
34e30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
34e40 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
34e50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
34e60 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
34e70 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61  pPublicKeyTempla
34e80 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
34e90 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74  ublicKeyAttribut
34ea0 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49  eCount, CK_ATTRI
34eb0 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74  BUTE_PTR pPrivat
34ec0 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  eKeyTemplate, CK
34ed0 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65  _ULONG ulPrivate
34ee0 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
34ef0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
34f00 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63  DLE_PTR phPublic
34f10 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
34f20 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76  ANDLE_PTR phPriv
34f30 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ateKey) {..CACKE
34f40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
34f50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
34f60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
34f70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
34f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
34f90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
34fa0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
34fb0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
34fc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
34fd0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
34fe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
34ff0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
35000 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
35010 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
35020 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
35030 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
35040 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
35050 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
35060 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
35070 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70  ON(CK_RV, C_Wrap
35080 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
35090 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
350a0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
350b0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
350c0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
350d0 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  WrappingKey, CK_
350e0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
350f0 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
35100 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
35110 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61  ULONG_PTR pulWra
35120 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43  ppedKeyLen) {..C
35130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
35140 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
35150 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
35160 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
35170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35180 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
35190 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
351a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
351b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
351c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
351d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
351e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
351f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35200 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
35210 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
35220 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
35230 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
35240 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
35250 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
35260 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
35270 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  UnwrapKey)(CK_SE
35280 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
35290 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
352a0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
352b0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
352c0 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67  NDLE hUnwrapping
352d0 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
352e0 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
352f0 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64  _ULONG ulWrapped
35300 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49  KeyLen, CK_ATTRI
35310 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
35320 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
35330 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
35340 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
35350 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
35360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
35370 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
35380 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
35390 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
353a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
353b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
353c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
353d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
353e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
353f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
35400 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
35410 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
35420 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
35430 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
35440 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
35450 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
35460 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
35470 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
35480 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
35490 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
354a0 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53  eriveKey)(CK_SES
354b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
354c0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
354d0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
354e0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
354f0 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b  DLE hBaseKey, CK
35500 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
35510 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
35520 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
35530 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
35540 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
35550 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
35560 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
35570 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
35580 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
35590 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
355a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
355b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
355c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
355d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
355e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
355f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35600 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
35610 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
35620 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
35630 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
35640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
35650 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
35660 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
35670 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
35680 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
35690 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29  V, C_SeedRandom)
356a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
356b0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
356c0 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20  BYTE_PTR pSeed, 
356d0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c  CK_ULONG ulSeedL
356e0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
356f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
35700 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
35710 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
35720 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
35730 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
35740 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
35750 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
35760 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
35770 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
35780 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
35790 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
357a0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
357b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
357c0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
357d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
357e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
357f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
35800 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
35810 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
35820 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
35830 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49  Random)(CK_SESSI
35840 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
35850 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
35860 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f  pRandomData, CK_
35870 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65  ULONG ulRandomLe
35880 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
35890 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
358a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
358b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
358c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
358d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
358e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
358f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
35900 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
35910 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
35920 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
35930 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
35940 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
35950 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
35960 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
35970 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
35980 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
35990 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
359a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65  ORTED);.}../* De
359b0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
359c0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
359d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
359e0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
359f0 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  us)(CK_SESSION_H
35a00 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
35a10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
35a20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
35a30 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
35a40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
35a50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
35a60 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
35a70 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
35a80 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
35a90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
35aa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
35ab0 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
35ac0 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
35ad0 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
35ae0 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
35af0 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  */.}../* Depreca
35b00 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
35b10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
35b20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63  ON(CK_RV, C_Canc
35b30 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53  elFunction)(CK_S
35b40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
35b50 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
35b60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
35b70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
35b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
35b90 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
35ba0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
35bb0 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
35bc0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
35bd0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
35be0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
35bf0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
35c00 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
35c10 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
35c20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
35c30 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
35c40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
35c50 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
35c60 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55  ctionList)(CK_FU
35c70 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f  NCTION_LIST_PTR_
35c80 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  PTR ppFunctionLi
35c90 73 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  st) {..static CK
35ca0 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
35cb0 54 52 20 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73  TR spFunctionLis
35cc0 74 20 3d 20 4e 55 4c 4c 3b 0a 09 43 4b 5f 46 55  t = NULL;..CK_FU
35cd0 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20  NCTION_LIST_PTR 
35ce0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
35cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
35d00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
35d10 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f  ...if (ppFunctio
35d20 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nList == NULL) {
35d30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
35d40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
35d50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73  pFunctionList is
35d60 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
35d70 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
35d80 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
35d90 28 73 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (spFunctionList 
35da0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 70  != NULL) {...*pp
35db0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 73  FunctionList = s
35dc0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a  pFunctionList;..
35dd0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
35de0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
35df0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
35e00 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
35e10 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
35e20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  pFunctionList = 
35e30 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
35e40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a  FunctionList));.
35e50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
35e60 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  >version.major =
35e70 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
35e80 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
35e90 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
35ea0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
35eb0 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  version.minor = 
35ec0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
35ed0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
35ee0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
35ef0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
35f00 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f  _Initialize = C_
35f10 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75  Initialize;..pFu
35f20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
35f30 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c  nalize = C_Final
35f40 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
35f50 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d  ist->C_GetInfo =
35f60 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75   C_GetInfo;..pFu
35f70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
35f80 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65  tSlotList = C_Ge
35f90 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e  tSlotList;..pFun
35fa0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
35fb0 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  SlotInfo = C_Get
35fc0 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  SlotInfo;..pFunc
35fd0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54  tionList->C_GetT
35fe0 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  okenInfo = C_Get
35ff0 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e  TokenInfo;..pFun
36000 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69  ctionList->C_Wai
36010 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20  tForSlotEvent = 
36020 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
36030 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  nt;..pFunctionLi
36040 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
36050 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65  smList = C_GetMe
36060 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46  chanismList;..pF
36070 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
36080 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20  etMechanismInfo 
36090 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  = C_GetMechanism
360a0 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
360b0 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65  List->C_InitToke
360c0 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b  n = C_InitToken;
360d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
360e0 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49  >C_InitPIN = C_I
360f0 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  nitPIN;..pFuncti
36100 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e  onList->C_SetPIN
36110 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46   = C_SetPIN;..pF
36120 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f  unctionList->C_O
36130 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f  penSession = C_O
36140 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75  penSession;..pFu
36150 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c  nction