Hex Artifact Content

Artifact fd9c15d1e5651824fb6707179101fbd992e023a6:


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 31 2e 68 22 0a 23  clude "sha1.h".#
0510: 69 6e 63 6c 75 64 65 20 22 6d 64 35 2e 68 22 0a  include "md5.h".
0520: 0a 2f 2a 0a 20 2a 20 49 6e 63 6c 75 64 65 20 74  ./*. * Include t
0530: 68 65 73 65 20 73 6f 75 72 63 65 20 66 69 6c 65  hese source file
0540: 73 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 6c  s in this transl
0550: 61 74 69 6f 6e 20 75 6e 69 74 20 73 6f 20 74 68  ation unit so th
0560: 61 74 20 77 65 20 63 61 6e 20 62 69 6e 64 20 74  at we can bind t
0570: 6f 0a 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61  o. * functions a
0580: 6e 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 61  nd not include a
0590: 6e 79 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  ny symbols in th
05a0: 65 20 6f 75 74 70 75 74 20 73 68 61 72 65 64 20  e output shared 
05b0: 6f 62 6a 65 63 74 2e 0a 20 2a 2f 0a 23 69 6e 63  object.. */.#inc
05c0: 6c 75 64 65 20 22 61 73 6e 31 2d 78 35 30 39 2e  lude "asn1-x509.
05d0: 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 73 68 61  c".#include "sha
05e0: 31 2e 63 22 0a 23 69 6e 63 6c 75 64 65 20 22 6d  1.c".#include "m
05f0: 64 35 2e 63 22 0a 0a 23 69 66 6e 64 65 66 20 43  d5.c"..#ifndef C
0600: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
0610: 45 52 53 49 4f 4e 5f 43 4f 44 45 0a 23 20 20 64  ERSION_CODE.#  d
0620: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 43 52 59  efine CACKEY_CRY
0630: 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
0640: 44 45 20 30 78 30 32 31 65 30 30 0a 23 65 6e 64  DE 0x021e00.#end
0650: 69 66 0a 0a 2f 2a 20 47 53 43 2d 49 53 20 76 32  if../* GSC-IS v2
0660: 2e 31 20 44 65 66 69 6e 69 74 69 6f 6e 73 20 2a  .1 Definitions *
0670: 2f 0a 2f 2a 2a 20 43 6c 61 73 73 65 73 20 2a 2a  /./** Classes **
0680: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0690: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 20 20  CLASS_ISO7816   
06a0: 20 20 20 20 20 20 20 20 30 78 30 30 0a 23 64 65          0x00.#de
06b0: 66 69 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53  fine GSCIS_CLASS
06c0: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
06d0: 20 20 20 30 78 38 30 0a 0a 2f 2a 2a 20 49 6e 73     0x80../** Ins
06e0: 74 72 75 63 74 69 6f 6e 73 20 2a 2a 2f 0a 23 64  tructions **/.#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 52 45 53 50 4f 4e 53 45 20 20  R_GET_RESPONSE  
0710: 20 20 20 20 30 78 43 30 0a 23 64 65 66 69 6e 65      0xC0.#define
0720: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41   GSCIS_INSTR_REA
0730: 44 5f 42 49 4e 41 52 59 20 20 20 20 20 20 20 30  D_BINARY       0
0740: 78 42 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xB0.#define GSCI
0750: 53 5f 49 4e 53 54 52 5f 55 50 44 41 54 45 5f 42  S_INSTR_UPDATE_B
0760: 49 4e 41 52 59 20 20 20 20 20 30 78 44 36 0a 23  INARY     0xD6.#
0770: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0780: 54 52 5f 53 45 4c 45 43 54 20 20 20 20 20 20 20  TR_SELECT       
0790: 20 20 20 20 20 30 78 41 34 0a 23 64 65 66 69 6e       0xA4.#defin
07a0: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 45 58  e GSCIS_INSTR_EX
07b0: 54 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20  TERNAL_AUTH     
07c0: 30 78 38 32 0a 23 64 65 66 69 6e 65 20 47 53 43  0x82.#define GSC
07d0: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 43 48 41  IS_INSTR_GET_CHA
07e0: 4c 4c 45 4e 47 45 20 20 20 20 20 30 78 38 34 0a  LLENGE     0x84.
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 49 4e 54 45 52 4e 41 4c 5f 41 55 54  STR_INTERNAL_AUT
0810: 48 20 20 20 20 20 30 78 38 38 0a 23 64 65 66 69  H     0x88.#defi
0820: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  ne GSCIS_INSTR_V
0830: 45 52 49 46 59 20 20 20 20 20 20 20 20 20 20 20  ERIFY           
0840: 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53   0x20.#define GS
0850: 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 20 20  CIS_INSTR_SIGN  
0860: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32 41              0x2A
0870: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49  .#define GSCIS_I
0880: 4e 53 54 52 5f 47 45 54 5f 50 52 4f 50 20 20 20  NSTR_GET_PROP   
0890: 20 20 20 20 20 20 20 30 78 35 36 0a 23 64 65 66         0x56.#def
08a0: 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  ine GSCIS_INSTR_
08b0: 47 45 54 5f 41 43 52 20 20 20 20 20 20 20 20 20  GET_ACR         
08c0: 20 20 30 78 34 43 0a 23 64 65 66 69 6e 65 20 47    0x4C.#define G
08d0: 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f  SCIS_INSTR_READ_
08e0: 42 55 46 46 45 52 20 20 20 20 20 20 20 30 78 35  BUFFER       0x5
08f0: 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  2.#define GSCIS_
0900: 49 4e 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50  INSTR_SIGNDECRYP
0910: 54 20 20 20 20 20 20 20 30 78 34 32 0a 0a 23 64  T       0x42..#d
0920: 65 66 69 6e 65 20 47 53 43 49 53 5f 50 41 52 41  efine GSCIS_PARA
0930: 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 20  M_SELECT_APPLET 
0940: 20 20 20 20 30 78 30 34 0a 0a 2f 2a 2a 20 54 61      0x04../** Ta
0950: 67 73 20 2a 2a 2f 0a 2f 2a 2a 2a 20 43 43 43 20  gs **/./*** CCC 
0960: 54 61 67 73 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  Tags ***/.#defin
0970: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
0980: 49 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ID              
0990: 30 78 46 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF0.#define GSC
09a0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 20 20  IS_TAG_CCC_VER  
09b0: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 31 0a             0xF1.
09c0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
09d0: 47 5f 43 43 47 5f 56 45 52 20 20 20 20 20 20 20  G_CCG_VER       
09e0: 20 20 20 20 20 20 30 78 46 32 0a 23 64 65 66 69        0xF2.#defi
09f0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
0a00: 44 55 52 4c 20 20 20 20 20 20 20 20 20 20 20 20  DURL            
0a10: 20 30 78 46 33 0a 23 64 65 66 69 6e 65 20 47 53   0xF3.#define GS
0a20: 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 20 20  CIS_TAG_PKCS15  
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 34              0xF4
0a40: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0a50: 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44 45  AG_REG_DATA_MODE
0a60: 4c 20 20 20 20 20 20 30 78 46 35 0a 23 64 65 66  L      0xF5.#def
0a70: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ine GSCIS_TAG_AC
0a80: 52 5f 54 41 42 4c 45 20 20 20 20 20 20 20 20 20  R_TABLE         
0a90: 20 20 30 78 46 36 0a 23 64 65 66 69 6e 65 20 47    0xF6.#define G
0aa0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41 50  SCIS_TAG_CARD_AP
0ab0: 44 55 20 20 20 20 20 20 20 20 20 20 20 30 78 46  DU           0xF
0ac0: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
0ad0: 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 20  TAG_REDIRECTION 
0ae0: 20 20 20 20 20 20 20 20 30 78 46 41 0a 23 64 65          0xFA.#de
0af0: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
0b00: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T               
0b10: 20 20 20 30 78 46 42 0a 23 64 65 66 69 6e 65 20     0xFB.#define 
0b20: 47 53 43 49 53 5f 54 41 47 5f 53 54 20 20 20 20  GSCIS_TAG_ST    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78                0x
0b40: 46 43 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  FC.#define GSCIS
0b50: 5f 54 41 47 5f 4e 45 58 54 43 43 43 20 20 20 20  _TAG_NEXTCCC    
0b60: 20 20 20 20 20 20 20 20 20 30 78 46 44 0a 0a 2f           0xFD../
0b70: 2a 2a 2a 20 47 65 6e 65 72 61 6c 20 2d 20 45 46  *** General - EF
0b80: 20 32 32 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69   2200 ***/.#defi
0b90: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 46 4e 41  ne GSCIS_TAG_FNA
0ba0: 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ME              
0bb0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 47 53   0x01.#define GS
0bc0: 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 20 20 20  CIS_TAG_MNAME   
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30 32              0x02
0be0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0bf0: 41 47 5f 4c 4e 41 4d 45 20 20 20 20 20 20 20 20  AG_LNAME        
0c00: 20 20 20 20 20 20 20 30 78 30 33 0a 23 64 65 66         0x03.#def
0c10: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 55  ine GSCIS_TAG_SU
0c20: 46 46 49 58 20 20 20 20 20 20 20 20 20 20 20 20  FFIX            
0c30: 20 20 30 78 30 34 0a 23 64 65 66 69 6e 65 20 47    0x04.#define G
0c40: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
0c50: 45 4e 43 59 20 20 20 20 20 20 20 20 20 30 78 30  ENCY         0x0
0c60: 35 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  5.#define GSCIS_
0c70: 54 41 47 5f 42 55 52 45 41 55 20 20 20 20 20 20  TAG_BUREAU      
0c80: 20 20 20 20 20 20 20 20 30 78 30 36 0a 23 64 65          0x06.#de
0c90: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42  fine GSCIS_TAG_B
0ca0: 55 52 45 41 55 5f 43 4f 44 45 20 20 20 20 20 20  UREAU_CODE      
0cb0: 20 20 20 30 78 30 37 0a 23 64 65 66 69 6e 65 20     0x07.#define 
0cc0: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
0cd0: 4f 44 45 20 20 20 20 20 20 20 20 20 20 20 30 78  ODE           0x
0ce0: 30 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  08.#define GSCIS
0cf0: 5f 54 41 47 5f 54 49 54 4c 45 20 20 20 20 20 20  _TAG_TITLE      
0d00: 20 20 20 20 20 20 20 20 20 30 78 30 39 0a 23 64           0x09.#d
0d10: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0d20: 42 55 49 4c 44 49 4e 47 20 20 20 20 20 20 20 20  BUILDING        
0d30: 20 20 20 20 30 78 31 30 0a 23 64 65 66 69 6e 65      0x10.#define
0d40: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0d50: 45 5f 41 44 44 52 31 20 20 20 20 20 20 20 20 30  E_ADDR1        0
0d60: 78 31 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x11.#define GSCI
0d70: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44  S_TAG_OFFICE_ADD
0d80: 52 32 20 20 20 20 20 20 20 20 30 78 31 32 0a 23  R2        0x12.#
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 43 49 54 59 20 20 20 20  _OFFICE_CITY    
0db0: 20 20 20 20 20 30 78 31 33 0a 23 64 65 66 69 6e       0x13.#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 53 54 41 54 45 20 20 20 20 20 20 20 20  CE_STATE        
0de0: 30 78 31 34 0a 23 64 65 66 69 6e 65 20 47 53 43  0x14.#define GSC
0df0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49  IS_TAG_OFFICE_ZI
0e00: 50 20 20 20 20 20 20 20 20 20 20 30 78 31 35 0a  P          0x15.
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 43 4f 55 4e 54 52 59  G_OFFICE_COUNTRY
0e30: 20 20 20 20 20 20 30 78 31 36 0a 23 64 65 66 69        0x16.#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 50 48 4f 4e 45 20 20 20 20 20 20 20  ICE_PHONE       
0e60: 20 30 78 31 37 0a 23 64 65 66 69 6e 65 20 47 53   0x17.#define GS
0e70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
0e80: 48 4f 4e 45 5f 45 58 54 20 20 20 20 30 78 31 38  HONE_EXT    0x18
0e90: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ea0: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 20 20 20  AG_OFFICE_FAX   
0eb0: 20 20 20 20 20 20 20 30 78 31 39 0a 23 64 65 66         0x19.#def
0ec0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ine GSCIS_TAG_OF
0ed0: 46 49 43 45 5f 45 4d 41 49 4c 20 20 20 20 20 20  FICE_EMAIL      
0ee0: 20 20 30 78 31 41 0a 23 64 65 66 69 6e 65 20 47    0x1A.#define G
0ef0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
0f00: 52 4f 4f 4d 20 20 20 20 20 20 20 20 20 30 78 31  ROOM         0x1
0f10: 42 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  B.#define GSCIS_
0f20: 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43  TAG_NONGOV_AGENC
0f30: 59 20 20 20 20 20 20 20 30 78 31 43 0a 23 64 65  Y       0x1C.#de
0f40: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53  fine GSCIS_TAG_S
0f50: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 20 20 20  SN_DESIGNATOR   
0f60: 20 20 20 30 78 31 44 0a 0a 2f 2a 2a 2a 20 50 49     0x1D../*** PI
0f70: 49 20 2d 20 45 46 20 32 31 30 30 20 2a 2a 2a 2f  I - EF 2100 ***/
0f80: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0f90: 41 47 5f 53 53 4e 20 20 20 20 20 20 20 20 20 20  AG_SSN          
0fa0: 20 20 20 20 20 20 20 30 78 32 30 0a 23 64 65 66         0x20.#def
0fb0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f  ine GSCIS_TAG_DO
0fc0: 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
0fd0: 20 20 30 78 32 31 0a 23 64 65 66 69 6e 65 20 47    0x21.#define G
0fe0: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 20  SCIS_TAG_GENDER 
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 32               0x2
1000: 32 0a 0a 2f 2a 2a 2a 20 4c 6f 67 69 6e 20 49 6e  2../*** Login In
1010: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 34  formation - EF 4
1020: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1030: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
1040: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  D              0
1050: 78 34 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x40.#define GSCI
1060: 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 20 20 20 20  S_TAG_DOMAIN    
1070: 20 20 20 20 20 20 20 20 20 20 30 78 34 31 0a 23            0x41.#
1080: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
1090: 5f 50 41 53 53 57 4f 52 44 20 20 20 20 20 20 20  _PASSWORD       
10a0: 20 20 20 20 20 30 78 34 32 0a 0a 2f 2a 2a 2a 20       0x42../*** 
10b0: 43 61 72 64 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  Card Information
10c0: 20 2d 20 45 46 20 35 30 30 30 20 2a 2a 2a 2f 0a   - EF 5000 ***/.
10d0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
10e0: 47 5f 49 53 53 55 45 52 49 44 20 20 20 20 20 20  G_ISSUERID      
10f0: 20 20 20 20 20 20 30 78 35 30 0a 23 64 65 66 69        0x50.#defi
1100: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52  ne GSCIS_TAG_SER
1110: 4e 4f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NO              
1120: 20 30 78 35 31 0a 23 64 65 66 69 6e 65 20 47 53   0x51.#define GS
1130: 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44 41  CIS_TAG_ISSUE_DA
1140: 54 45 20 20 20 20 20 20 20 20 20 20 30 78 35 32  TE          0x52
1150: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1160: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  AG_EXPIRE_DATE  
1170: 20 20 20 20 20 20 20 30 78 35 33 0a 23 64 65 66         0x53.#def
1180: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ine GSCIS_TAG_CA
1190: 52 44 5f 54 59 50 45 20 20 20 20 20 20 20 20 20  RD_TYPE         
11a0: 20 20 30 78 35 34 0a 23 64 65 66 69 6e 65 20 47    0x54.#define G
11b0: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
11c0: 59 5f 43 4f 44 45 20 20 20 20 20 20 20 30 78 35  Y_CODE       0x5
11d0: 37 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  7.#define GSCIS_
11e0: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 20 20  TAG_CARDID_AID  
11f0: 20 20 20 20 20 20 20 20 30 78 35 38 0a 0a 2f 2a          0x58../*
1200: 2a 2a 20 50 49 56 20 43 6f 64 65 73 20 2a 2a 2a  ** PIV Codes ***
1210: 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  /.#define NISTSP
1220: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
1230: 45 54 5f 44 41 54 41 20 30 78 43 42 0a 23 64 65  ET_DATA 0xCB.#de
1240: 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37  fine NISTSP800_7
1250: 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
1260: 48 20 20 30 78 38 37 0a 0a 2f 2a 2a 2a 20 50 4b  H  0x87../*** PK
1270: 49 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  I Information - 
1280: 45 46 20 37 30 30 30 20 2a 2a 2a 2f 0a 23 64 65  EF 7000 ***/.#de
1290: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43  fine GSCIS_TAG_C
12a0: 45 52 54 49 46 49 43 41 54 45 20 20 20 20 20 20  ERTIFICATE      
12b0: 20 20 20 30 78 37 30 0a 23 64 65 66 69 6e 65 20     0x70.#define 
12c0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
12d0: 53 53 55 45 5f 44 41 54 45 20 20 20 20 20 30 78  SSUE_DATE     0x
12e0: 37 31 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  71.#define GSCIS
12f0: 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45  _TAG_CERT_EXPIRE
1300: 5f 44 41 54 45 20 20 20 20 30 78 37 32 0a 0a 2f  _DATE    0x72../
1310: 2a 2a 20 41 70 70 6c 65 74 20 49 44 73 20 2a 2a  ** Applet IDs **
1320: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
1330: 41 49 44 5f 43 43 43 20 20 20 20 20 20 20 20 20  AID_CCC         
1340: 20 20 20 20 20 20 20 20 30 78 41 30 2c 20 30 78          0xA0, 0x
1350: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20  00, 0x00, 0x01, 
1360: 30 78 31 36 2c 20 30 78 44 42 2c 20 30 78 30 30  0x16, 0xDB, 0x00
1370: 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38  .#define NISTSP8
1380: 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49 44 20  00_73_3_PIV_AID 
1390: 20 20 20 20 20 20 20 30 78 41 30 2c 20 30 78 30         0xA0, 0x0
13a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 33 2c 20 30  0, 0x00, 0x03, 0
13b0: 78 30 38 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x08, 0x00, 0x00,
13c0: 20 30 78 31 30 2c 20 30 78 30 30 2c 20 30 78 30   0x10, 0x00, 0x0
13d0: 31 2c 20 30 78 30 30 0a 0a 2f 2a 20 50 49 56 20  1, 0x00../* PIV 
13e0: 49 44 73 20 2a 2f 0a 2f 2a 2a 20 4b 65 79 20 49  IDs */./** Key I
13f0: 64 65 6e 74 69 66 69 65 72 73 20 28 4e 49 53 54  dentifiers (NIST
1400: 20 53 50 20 38 30 30 2d 37 38 2d 33 2c 20 54 61   SP 800-78-3, Ta
1410: 62 6c 65 20 36 2d 31 20 2a 2a 2f 0a 23 64 65 66  ble 6-1 **/.#def
1420: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38  ine NISTSP800_78
1430: 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48 20 20  _3_KEY_PIVAUTH  
1440: 20 30 78 39 41 0a 23 64 65 66 69 6e 65 20 4e 49   0x9A.#define NI
1450: 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
1460: 5f 53 49 47 4e 41 54 55 52 45 20 30 78 39 43 0a  _SIGNATURE 0x9C.
1470: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
1480: 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47  0_78_3_KEY_KEYMG
1490: 54 20 20 20 20 30 78 39 44 0a 23 64 65 66 69 6e  T    0x9D.#defin
14a0: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
14b0: 5f 4b 45 59 5f 43 41 52 44 41 55 54 48 20 20 30  _KEY_CARDAUTH  0
14c0: 78 39 45 0a 0a 2f 2a 2a 20 41 6c 67 6f 72 69 74  x9E../** Algorit
14d0: 68 6d 20 49 64 65 6e 74 69 66 69 65 72 73 20 28  hm Identifiers (
14e0: 4e 49 53 54 20 53 50 20 38 30 30 2d 37 38 2d 33  NIST SP 800-78-3
14f0: 2c 20 54 61 62 6c 65 20 36 2d 32 20 2a 2a 2f 0a  , Table 6-2 **/.
1500: 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30  #define NISTSP80
1510: 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 31  0_78_3_ALGO_RSA1
1520: 30 32 34 20 20 30 78 30 36 0a 23 64 65 66 69 6e  024  0x06.#defin
1530: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  e NISTSP800_78_3
1540: 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 20 20 30  _ALGO_RSA2048  0
1550: 78 30 37 0a 0a 2f 2a 2a 20 4f 62 6a 65 63 74 20  x07../** Object 
1560: 49 64 65 6e 74 69 66 69 65 72 73 20 28 4e 49 53  Identifiers (NIS
1570: 54 20 53 50 20 38 30 30 2d 37 33 2d 33 20 50 61  T SP 800-73-3 Pa
1580: 72 74 20 31 2c 20 54 61 62 6c 65 20 32 29 20 2a  rt 1, Table 2) *
1590: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  */.#define NISTS
15a0: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49  P800_73_3_OID_PI
15b0: 56 41 55 54 48 20 20 20 30 78 35 46 2c 20 30 78  VAUTH   0x5F, 0x
15c0: 43 31 2c 20 30 78 30 35 0a 23 64 65 66 69 6e 65  C1, 0x05.#define
15d0: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
15e0: 4f 49 44 5f 53 49 47 4e 41 54 55 52 45 20 30 78  OID_SIGNATURE 0x
15f0: 35 46 2c 20 30 78 43 31 2c 20 30 78 30 41 0a 23  5F, 0xC1, 0x0A.#
1600: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1610: 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54  _73_3_OID_KEYMGT
1620: 20 20 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20      0x5F, 0xC1, 
1630: 30 78 30 42 0a 23 64 65 66 69 6e 65 20 4e 49 53  0x0B.#define NIS
1640: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
1650: 43 41 52 44 41 55 54 48 20 20 30 78 35 46 2c 20  CARDAUTH  0x5F, 
1660: 30 78 43 31 2c 20 30 78 30 31 0a 0a 2f 2a 20 4d  0xC1, 0x01../* M
1670: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 64  aximum size of d
1680: 61 74 61 20 70 6f 72 74 69 6f 6e 20 6f 66 20 41  ata portion of A
1690: 50 44 55 73 20 2a 2f 0a 2f 2a 2a 20 44 6f 20 6e  PDUs */./** Do n
16a0: 6f 74 20 73 65 74 20 74 68 69 73 20 61 62 6f 76  ot set this abov
16b0: 65 20 32 35 30 20 2a 2a 2f 0a 23 64 65 66 69 6e  e 250 **/.#defin
16c0: 65 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  e CACKEY_APDU_MT
16d0: 55 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  U               
16e0: 32 35 30 0a 0a 2f 2a 20 41 54 52 20 49 66 20 6e  250../* ATR If n
16f0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
1700: 23 69 66 6e 64 65 66 20 4d 41 58 5f 41 54 52 5f  #ifndef MAX_ATR_
1710: 53 49 5a 45 0a 23 64 65 66 69 6e 65 20 4d 41 58  SIZE.#define MAX
1720: 5f 41 54 52 5f 53 49 5a 45 20 31 30 32 34 0a 23  _ATR_SIZE 1024.#
1730: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 43 41  endif..#ifdef CA
1740: 43 4b 45 59 5f 44 45 42 55 47 0a 23 20 20 69 66  CKEY_DEBUG.#  if
1750: 64 65 66 20 48 41 56 45 5f 54 49 4d 45 5f 48 0a  def HAVE_TIME_H.
1760: 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c 74 69  #    include <ti
1770: 6d 65 2e 68 3e 0a 73 74 61 74 69 63 20 74 69 6d  me.h>.static tim
1780: 65 5f 74 20 63 61 63 6b 65 79 5f 64 65 62 75 67  e_t cackey_debug
1790: 5f 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 30 3b  _start_time = 0;
17a0: 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
17b0: 20 6c 6f 6e 67 20 43 41 43 4b 45 59 5f 44 45 42   long CACKEY_DEB
17c0: 55 47 5f 47 45 54 54 49 4d 45 28 76 6f 69 64 29  UG_GETTIME(void)
17d0: 20 7b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 64   {..if (cackey_d
17e0: 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65 20  ebug_start_time 
17f0: 3d 3d 20 30 29 20 7b 0a 09 09 63 61 63 6b 65 79  == 0) {...cackey
1800: 5f 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d  _debug_start_tim
1810: 65 20 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b 0a  e = time(NULL);.
1820: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 74 69 6d 65  .}...return(time
1830: 28 4e 55 4c 4c 29 20 2d 20 63 61 63 6b 65 79 5f  (NULL) - cackey_
1840: 64 65 62 75 67 5f 73 74 61 72 74 5f 74 69 6d 65  debug_start_time
1850: 29 3b 0a 7d 0a 23 20 20 65 6c 73 65 0a 73 74 61  );.}.#  else.sta
1860: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
1870: 67 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 47  g CACKEY_DEBUG_G
1880: 45 54 54 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09  ETTIME(void) {..
1890: 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 23 20 20  return(0);.}.#  
18a0: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
18b0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
18c0: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 5c 0a 09  INTF(x...) { \..
18d0: 73 74 61 74 69 63 20 63 68 61 72 20 62 75 66 5f  static char buf_
18e0: 75 73 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d  user[4096] = {0}
18f0: 3b 20 5c 0a 09 73 6e 70 72 69 6e 74 66 28 62 75  ; \..snprintf(bu
1900: 66 5f 75 73 65 72 2c 20 73 69 7a 65 6f 66 28 62  f_user, sizeof(b
1910: 75 66 5f 75 73 65 72 29 2c 20 78 29 3b 20 5c 0a  uf_user), x); \.
1920: 09 62 75 66 5f 75 73 65 72 5b 73 69 7a 65 6f 66  .buf_user[sizeof
1930: 28 62 75 66 5f 75 73 65 72 29 20 2d 20 31 5d 20  (buf_user) - 1] 
1940: 3d 20 27 5c 30 27 3b 20 5c 0a 09 66 70 72 69 6e  = '\0'; \..fprin
1950: 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  tf(cackey_debug_
1960: 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73  fd(), "[%lu]: %s
1970: 28 29 3a 25 69 3a 20 25 73 5c 6e 22 2c 20 43 41  ():%i: %s\n", CA
1980: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
1990: 4d 45 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  ME(), __func__, 
19a0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 62 75 66 5f 75 73  __LINE__, buf_us
19b0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
19c0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
19d0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
19e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
19f0: 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29 20  INTBUF(f, x, y) 
1a00: 7b 20 5c 0a 09 73 74 61 74 69 63 20 63 68 61 72  { \..static char
1a10: 20 62 75 66 5f 75 73 65 72 5b 34 30 39 36 5d 20   buf_user[4096] 
1a20: 3d 20 7b 30 7d 2c 20 2a 62 75 66 5f 75 73 65 72  = {0}, *buf_user
1a30: 5f 70 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  _p; \..unsigned 
1a40: 6c 6f 6e 67 20 62 75 66 5f 75 73 65 72 5f 73 69  long buf_user_si
1a50: 7a 65 3b 20 5c 0a 09 75 6e 73 69 67 6e 65 64 20  ze; \..unsigned 
1a60: 63 68 61 72 20 2a 54 4d 50 42 55 46 3b 20 5c 0a  char *TMPBUF; \.
1a70: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
1a80: 64 78 3b 20 5c 0a 09 69 6e 74 20 73 6e 70 72 69  dx; \..int snpri
1a90: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 54 4d 50 42  ntf_ret; \..TMPB
1aa0: 55 46 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  UF = (unsigned c
1ab0: 68 61 72 20 2a 29 20 28 78 29 3b 20 5c 0a 09 62  har *) (x); \..b
1ac0: 75 66 5f 75 73 65 72 5f 70 20 3d 20 62 75 66 5f  uf_user_p = buf_
1ad0: 75 73 65 72 3b 20 5c 0a 09 62 75 66 5f 75 73 65  user; \..buf_use
1ae0: 72 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  r_size = sizeof(
1af0: 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66 6f  buf_user); \..fo
1b00: 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
1b10: 3c 20 28 79 29 3b 20 69 64 78 2b 2b 29 20 7b 20  < (y); idx++) { 
1b20: 5c 0a 09 09 69 66 20 28 62 75 66 5f 75 73 65 72  \...if (buf_user
1b30: 5f 73 69 7a 65 20 3c 3d 20 30 29 20 7b 20 5c 0a  _size <= 0) { \.
1b40: 09 09 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b  ...break; \...};
1b50: 20 5c 0a 09 09 73 6e 70 72 69 6e 74 66 5f 72 65   \...snprintf_re
1b60: 74 20 3d 20 73 6e 70 72 69 6e 74 66 28 62 75 66  t = snprintf(buf
1b70: 5f 75 73 65 72 5f 70 2c 20 62 75 66 5f 75 73 65  _user_p, buf_use
1b80: 72 5f 73 69 7a 65 2c 20 22 2c 20 25 30 32 78 22  r_size, ", %02x"
1b90: 2c 20 54 4d 50 42 55 46 5b 69 64 78 5d 29 3b 20  , TMPBUF[idx]); 
1ba0: 5c 0a 09 09 69 66 20 28 73 6e 70 72 69 6e 74 66  \...if (snprintf
1bb0: 5f 72 65 74 20 3c 3d 20 30 29 20 7b 20 5c 0a 09  _ret <= 0) { \..
1bc0: 09 09 62 72 65 61 6b 3b 20 5c 0a 09 09 7d 3b 20  ..break; \...}; 
1bd0: 5c 0a 09 09 62 75 66 5f 75 73 65 72 5f 70 20 2b  \...buf_user_p +
1be0: 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65 74 3b 20  = snprintf_ret; 
1bf0: 5c 0a 09 09 62 75 66 5f 75 73 65 72 5f 73 69 7a  \...buf_user_siz
1c00: 65 20 2d 3d 20 73 6e 70 72 69 6e 74 66 5f 72 65  e -= snprintf_re
1c10: 74 3b 20 5c 0a 09 7d 3b 20 5c 0a 09 62 75 66 5f  t; \..}; \..buf_
1c20: 75 73 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f  user[sizeof(buf_
1c30: 75 73 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30  user) - 1] = '\0
1c40: 27 3b 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61  '; \..fprintf(ca
1c50: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1c60: 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69   "[%lu]: %s():%i
1c70: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1c80: 7b 25 30 32 78 25 73 7d 29 5c 6e 22 2c 20 43 41  {%02x%s})\n", CA
1c90: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
1ca0: 4d 45 28 29 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  ME(), __func__, 
1cb0: 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23 78 2c  __LINE__, f, #x,
1cc0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1cd0: 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30 5d 2c   (y), TMPBUF[0],
1ce0: 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a 09 66   buf_user); \..f
1cf0: 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65 62  flush(cackey_deb
1d00: 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a 23 20  ug_fd()); \.}.# 
1d10: 20 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20   define free(x) 
1d20: 7b 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  { CACKEY_DEBUG_P
1d30: 52 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20  RINTF("FREE(%p) 
1d40: 28 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20  (%s)", (void *) 
1d50: 78 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b  x, #x); free(x);
1d60: 20 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20   }..static FILE 
1d70: 2a 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  *cackey_debug_fd
1d80: 28 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63  (void) {..static
1d90: 20 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c   FILE *fd = NULL
1da0: 3b 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65  ;..char *logfile
1db0: 3b 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55  ;...if (fd != NU
1dc0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66  LL) {...return(f
1dd0: 64 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  d);..}.../*.. * 
1de0: 4c 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e  Log to stderr in
1df0: 69 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61  itially so we ca
1e00: 6e 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20  n use debugging 
1e10: 77 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20  within.. * this 
1e20: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
1e30: 20 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e   getting into an
1e40: 20 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09   infinite loop..
1e50: 20 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72   */..fd = stderr
1e60: 3b 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65  ;...logfile = ge
1e70: 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42  tenv("CACKEY_DEB
1e80: 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69  UG_LOGFILE");..i
1e90: 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55  f (logfile != NU
1ea0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1eb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75  EBUG_PRINTF("Fou
1ec0: 6e 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  nd environment v
1ed0: 61 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f  ariable: %s", lo
1ee0: 67 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69  gfile);....logfi
1ef0: 6c 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66  le = strchr(logf
1f00: 69 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20  ile, '=');...if 
1f10: 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (logfile == NULL
1f20: 29 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d  ) {....logfile =
1f30: 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f   getenv("CACKEY_
1f40: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b  DEBUG_LOGFILE");
1f50: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
1f60: 6f 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d  ogfile++;...}..}
1f70: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
1f80: 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 0a 09 69  DEBUG_LOGFILE..i
1f90: 66 20 28 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55  f (logfile == NU
1fa0: 4c 4c 29 20 7b 0a 09 09 6c 6f 67 66 69 6c 65 20  LL) {...logfile 
1fb0: 3d 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  = CACKEY_DEBUG_L
1fc0: 4f 47 46 49 4c 45 3b 0a 09 7d 0a 23 65 6e 64 69  OGFILE;..}.#endi
1fd0: 66 0a 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20  f...if (logfile 
1fe0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
1ff0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2000: 28 22 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65  ("Found log file
2010: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
2020: 0a 0a 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c  ....fd = fopen(l
2030: 6f 67 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d  ogfile, "a");..}
2040: 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c  ...if (fd == NUL
2050: 4c 29 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65  L) {...fd = stde
2060: 72 72 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20  rr;..}...if (fd 
2070: 3d 3d 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43  == stderr) {...C
2080: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2090: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74  TF("Returning st
20a0: 64 65 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20  derr");..} else 
20b0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20c0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20d0: 6e 67 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29  ng %p", (void *)
20e0: 20 66 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72   fd);..}...retur
20f0: 6e 28 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  n(fd);.}..static
2100: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
2110: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
2120: 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e  size_t size, con
2130: 73 74 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69  st char *func, i
2140: 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64  nt line) {..void
2150: 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76   *retval;...retv
2160: 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  al = malloc(size
2170: 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28 63 61 63  );...fprintf(cac
2180: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
2190: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
21a0: 20 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70 5c 6e   MALLOC() = %p\n
21b0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
21c0: 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e 63 2c  GETTIME(), func,
21d0: 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29 3b 0a   line, retval);.
21e0: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
21f0: 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65  ebug_fd());...re
2200: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
2210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43 41  .static void *CA
2220: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2230: 52 45 41 4c 4c 4f 43 28 76 6f 69 64 20 2a 70 74  REALLOC(void *pt
2240: 72 2c 20 73 69 7a 65 5f 74 20 73 69 7a 65 2c 20  r, size_t size, 
2250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e 63  const char *func
2260: 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09 76  , int line) {..v
2270: 6f 69 64 20 2a 72 65 74 76 61 6c 3b 0a 0a 09 72  oid *retval;...r
2280: 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
2290: 70 74 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 69 66  ptr, size);...if
22a0: 20 28 72 65 74 76 61 6c 20 21 3d 20 70 74 72 29   (retval != ptr)
22b0: 20 7b 0a 09 09 66 70 72 69 6e 74 66 28 63 61 63   {...fprintf(cac
22c0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
22d0: 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a  "[%lu]: %s():%i:
22e0: 20 52 45 41 4c 4c 4f 43 28 25 70 29 20 3d 20 25   REALLOC(%p) = %
22f0: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2300: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2310: 6e 63 2c 20 6c 69 6e 65 2c 20 70 74 72 2c 20 72  nc, line, ptr, r
2320: 65 74 76 61 6c 29 3b 0a 09 09 66 66 6c 75 73 68  etval);...fflush
2330: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2340: 28 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  ());..}...if (re
2350: 74 76 61 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tval == NULL) {.
2360: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2370: 52 49 4e 54 46 28 22 20 2a 2a 2a 20 45 52 52 4f  RINTF(" *** ERRO
2380: 52 20 2a 2a 2a 20 72 65 61 6c 6c 6f 63 20 72 65  R *** realloc re
2390: 74 75 72 6e 65 64 20 4e 55 4c 4c 20 28 73 69 7a  turned NULL (siz
23a0: 65 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  e = %lu)", (unsi
23b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
23c0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65  ;..}...return(re
23d0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
23e0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
23f0: 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55 50 28  BUG_FUNC_STRDUP(
2400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 74 72 2c  const char *ptr,
2410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 75 6e   const char *fun
2420: 63 2c 20 69 6e 74 20 6c 69 6e 65 29 20 7b 0a 09  c, int line) {..
2430: 63 68 61 72 20 2a 72 65 74 76 61 6c 3b 0a 0a 09  char *retval;...
2440: 72 65 74 76 61 6c 20 3d 20 73 74 72 64 75 70 28  retval = strdup(
2450: 70 74 72 29 3b 0a 0a 09 66 70 72 69 6e 74 66 28  ptr);...fprintf(
2460: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2470: 29 2c 20 22 5b 25 6c 75 5d 3a 20 25 73 28 29 3a  ), "[%lu]: %s():
2480: 25 69 3a 20 53 54 52 44 55 50 5f 4d 41 4c 4c 4f  %i: STRDUP_MALLO
2490: 43 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43  C() = %p\n", CAC
24a0: 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d  KEY_DEBUG_GETTIM
24b0: 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c  E(), func, line,
24c0: 20 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73   retval);..fflus
24d0: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
24e0: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
24f0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2500: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
2510: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
2520: 54 41 47 5f 54 4f 5f 53 54 52 28 75 6e 73 69 67  TAG_TO_STR(unsig
2530: 6e 65 64 20 63 68 61 72 20 74 61 67 29 20 7b 0a  ned char tag) {.
2540: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
2550: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2560: 5f 43 41 52 44 49 44 3a 0a 09 09 09 72 65 74 75  _CARDID:....retu
2570: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
2580: 52 44 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47  RDID");...case G
2590: 53 43 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52  SCIS_TAG_CCC_VER
25a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
25b0: 49 53 5f 54 41 47 5f 43 43 43 5f 56 45 52 22 29  IS_TAG_CCC_VER")
25c0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
25d0: 41 47 5f 43 43 47 5f 56 45 52 3a 0a 09 09 09 72  AG_CCG_VER:....r
25e0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
25f0: 5f 43 43 47 5f 56 45 52 22 29 3b 0a 09 09 63 61  _CCG_VER");...ca
2600: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2610: 44 55 52 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  DURL:....return(
2620: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55  "GSCIS_TAG_CARDU
2630: 52 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RL");...case GSC
2640: 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09  IS_TAG_PKCS15:..
2650: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2660: 54 41 47 5f 50 4b 43 53 31 35 22 29 3b 0a 09 09  TAG_PKCS15");...
2670: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 52  case GSCIS_TAG_R
2680: 45 47 5f 44 41 54 41 5f 4d 4f 44 45 4c 3a 0a 09  EG_DATA_MODEL:..
2690: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
26a0: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
26b0: 45 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  EL");...case GSC
26c0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
26d0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
26e0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
26f0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2700: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 3a 0a  _TAG_CARD_APDU:.
2710: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2720: 5f 54 41 47 5f 43 41 52 44 5f 41 50 44 55 22 29  _TAG_CARD_APDU")
2730: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2740: 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e 3a 0a  AG_REDIRECTION:.
2750: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2760: 5f 54 41 47 5f 52 45 44 49 52 45 43 54 49 4f 4e  _TAG_REDIRECTION
2770: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2780: 5f 54 41 47 5f 43 54 3a 0a 09 09 09 72 65 74 75  _TAG_CT:....retu
2790: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 54  rn("GSCIS_TAG_CT
27a0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
27b0: 5f 54 41 47 5f 53 54 3a 0a 09 09 09 72 65 74 75  _TAG_ST:....retu
27c0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 54  rn("GSCIS_TAG_ST
27d0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
27e0: 5f 54 41 47 5f 4e 45 58 54 43 43 43 3a 0a 09 09  _TAG_NEXTCCC:...
27f0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2800: 41 47 5f 4e 45 58 54 43 43 43 22 29 3b 0a 09 09  AG_NEXTCCC");...
2810: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 46  case GSCIS_TAG_F
2820: 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  NAME:....return(
2830: 22 47 53 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45  "GSCIS_TAG_FNAME
2840: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2850: 5f 54 41 47 5f 4d 4e 41 4d 45 3a 0a 09 09 09 72  _TAG_MNAME:....r
2860: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2870: 5f 4d 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65  _MNAME");...case
2880: 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d 45   GSCIS_TAG_LNAME
2890: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
28a0: 49 53 5f 54 41 47 5f 4c 4e 41 4d 45 22 29 3b 0a  IS_TAG_LNAME");.
28b0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
28c0: 5f 53 55 46 46 49 58 3a 0a 09 09 09 72 65 74 75  _SUFFIX:....retu
28d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 55  rn("GSCIS_TAG_SU
28e0: 46 46 49 58 22 29 3b 0a 09 09 63 61 73 65 20 47  FFIX");...case G
28f0: 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f 41 47  SCIS_TAG_GOVT_AG
2900: 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  ENCY:....return(
2910: 22 47 53 43 49 53 5f 54 41 47 5f 47 4f 56 54 5f  "GSCIS_TAG_GOVT_
2920: 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73 65  AGENCY");...case
2930: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
2940: 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  U:....return("GS
2950: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 22 29  CIS_TAG_BUREAU")
2960: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2970: 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45 3a 0a  AG_BUREAU_CODE:.
2980: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2990: 5f 54 41 47 5f 42 55 52 45 41 55 5f 43 4f 44 45  _TAG_BUREAU_CODE
29a0: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
29b0: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 3a 0a  _TAG_DEPT_CODE:.
29c0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
29d0: 5f 54 41 47 5f 44 45 50 54 5f 43 4f 44 45 22 29  _TAG_DEPT_CODE")
29e0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
29f0: 41 47 5f 54 49 54 4c 45 3a 0a 09 09 09 72 65 74  AG_TITLE:....ret
2a00: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 54  urn("GSCIS_TAG_T
2a10: 49 54 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 47  ITLE");...case G
2a20: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
2a30: 47 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  G:....return("GS
2a40: 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e 47  CIS_TAG_BUILDING
2a50: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a60: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a70: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  1:....return("GS
2a80: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41  CIS_TAG_OFFICE_A
2a90: 44 44 52 31 22 29 3b 0a 09 09 63 61 73 65 20 47  DDR1");...case G
2aa0: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2ab0: 41 44 44 52 32 3a 0a 09 09 09 72 65 74 75 72 6e  ADDR2:....return
2ac0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2ad0: 43 45 5f 41 44 44 52 32 22 29 3b 0a 09 09 63 61  CE_ADDR2");...ca
2ae0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
2af0: 49 43 45 5f 43 49 54 59 3a 0a 09 09 09 72 65 74  ICE_CITY:....ret
2b00: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2b10: 46 46 49 43 45 5f 43 49 54 59 22 29 3b 0a 09 09  FFICE_CITY");...
2b20: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2b30: 46 46 49 43 45 5f 53 54 41 54 45 3a 0a 09 09 09  FFICE_STATE:....
2b40: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2b50: 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45 22 29  G_OFFICE_STATE")
2b60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2b70: 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 3a 0a 09  AG_OFFICE_ZIP:..
2b80: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2b90: 54 41 47 5f 4f 46 46 49 43 45 5f 5a 49 50 22 29  TAG_OFFICE_ZIP")
2ba0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52  AG_OFFICE_COUNTR
2bc0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2bd0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2be0: 4f 55 4e 54 52 59 22 29 3b 0a 09 09 63 61 73 65  OUNTRY");...case
2bf0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2c00: 45 5f 50 48 4f 4e 45 3a 0a 09 09 09 72 65 74 75  E_PHONE:....retu
2c10: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2c20: 46 49 43 45 5f 50 48 4f 4e 45 22 29 3b 0a 09 09  FICE_PHONE");...
2c30: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2c40: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 3a  FFICE_PHONE_EXT:
2c50: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2c60: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2c70: 4e 45 5f 45 58 54 22 29 3b 0a 09 09 63 61 73 65  NE_EXT");...case
2c80: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2c90: 45 5f 46 41 58 3a 0a 09 09 09 72 65 74 75 72 6e  E_FAX:....return
2ca0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2cb0: 43 45 5f 46 41 58 22 29 3b 0a 09 09 63 61 73 65  CE_FAX");...case
2cc0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2cd0: 45 5f 45 4d 41 49 4c 3a 0a 09 09 09 72 65 74 75  E_EMAIL:....retu
2ce0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2cf0: 46 49 43 45 5f 45 4d 41 49 4c 22 29 3b 0a 09 09  FICE_EMAIL");...
2d00: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  case GSCIS_TAG_O
2d10: 46 46 49 43 45 5f 52 4f 4f 4d 3a 0a 09 09 09 72  FFICE_ROOM:....r
2d20: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2d30: 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 22 29 3b 0a  _OFFICE_ROOM");.
2d40: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2d50: 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e 43 59 3a 0a  _NONGOV_AGENCY:.
2d60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d70: 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45 4e  _TAG_NONGOV_AGEN
2d80: 43 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CY");...case GSC
2d90: 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47  IS_TAG_SSN_DESIG
2da0: 4e 41 54 4f 52 3a 0a 09 09 09 72 65 74 75 72 6e  NATOR:....return
2db0: 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  ("GSCIS_TAG_SSN_
2dc0: 44 45 53 49 47 4e 41 54 4f 52 22 29 3b 0a 09 09  DESIGNATOR");...
2dd0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2de0: 53 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  SN:....return("G
2df0: 53 43 49 53 5f 54 41 47 5f 53 53 4e 22 29 3b 0a  SCIS_TAG_SSN");.
2e00: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2e10: 5f 44 4f 42 3a 0a 09 09 09 72 65 74 75 72 6e 28  _DOB:....return(
2e20: 22 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 22 29  "GSCIS_TAG_DOB")
2e30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2e40: 41 47 5f 47 45 4e 44 45 52 3a 0a 09 09 09 72 65  AG_GENDER:....re
2e50: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2e60: 47 45 4e 44 45 52 22 29 3b 0a 09 09 63 61 73 65  GENDER");...case
2e70: 20 47 53 43 49 53 5f 54 41 47 5f 55 53 45 52 49   GSCIS_TAG_USERI
2e80: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
2e90: 43 49 53 5f 54 41 47 5f 55 53 45 52 49 44 22 29  CIS_TAG_USERID")
2ea0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2eb0: 41 47 5f 44 4f 4d 41 49 4e 3a 0a 09 09 09 72 65  AG_DOMAIN:....re
2ec0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ed0: 44 4f 4d 41 49 4e 22 29 3b 0a 09 09 63 61 73 65  DOMAIN");...case
2ee0: 20 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57   GSCIS_TAG_PASSW
2ef0: 4f 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ORD:....return("
2f00: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
2f10: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  RD");...case GSC
2f20: 49 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 3a  IS_TAG_ISSUERID:
2f30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2f40: 53 5f 54 41 47 5f 49 53 53 55 45 52 49 44 22 29  S_TAG_ISSUERID")
2f50: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2f60: 41 47 5f 53 45 52 4e 4f 3a 0a 09 09 09 72 65 74  AG_SERNO:....ret
2f70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53  urn("GSCIS_TAG_S
2f80: 45 52 4e 4f 22 29 3b 0a 09 09 63 61 73 65 20 47  ERNO");...case G
2f90: 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f 44  SCIS_TAG_ISSUE_D
2fa0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2fb0: 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45 5f  GSCIS_TAG_ISSUE_
2fc0: 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  DATE");...case G
2fd0: 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52 45 5f  SCIS_TAG_EXPIRE_
2fe0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
2ff0: 22 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49 52  "GSCIS_TAG_EXPIR
3000: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
3010: 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f   GSCIS_TAG_CARD_
3020: 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TYPE:....return(
3030: 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f  "GSCIS_TAG_CARD_
3040: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 47  TYPE");...case G
3050: 53 43 49 53 5f 54 41 47 5f 53 45 43 55 52 49 54  SCIS_TAG_SECURIT
3060: 59 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  Y_CODE:....retur
3070: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 45 43  n("GSCIS_TAG_SEC
3080: 55 52 49 54 59 5f 43 4f 44 45 22 29 3b 0a 09 09  URITY_CODE");...
3090: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
30a0: 41 52 44 49 44 5f 41 49 44 3a 0a 09 09 09 72 65  ARDID_AID:....re
30b0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
30c0: 43 41 52 44 49 44 5f 41 49 44 22 29 3b 0a 09 09  CARDID_AID");...
30d0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
30e0: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 72  ERTIFICATE:....r
30f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
3100: 5f 43 45 52 54 49 46 49 43 41 54 45 22 29 3b 0a  _CERTIFICATE");.
3110: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
3120: 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45  _CERT_ISSUE_DATE
3130: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3140: 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55  IS_TAG_CERT_ISSU
3150: 45 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73 65  E_DATE");...case
3160: 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f   GSCIS_TAG_CERT_
3170: 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09  EXPIRE_DATE:....
3180: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
3190: 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41  G_CERT_EXPIRE_DA
31a0: 54 45 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  TE");..}...retur
31b0: 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a  n("UNKNOWN");.}.
31c0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
31d0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
31e0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
31f0: 4f 5f 53 54 52 28 4c 4f 4e 47 20 72 65 74 63 6f  O_STR(LONG retco
3200: 64 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28 72  de) {..switch (r
3210: 65 74 63 6f 64 65 29 20 7b 0a 09 09 63 61 73 65  etcode) {...case
3220: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
3230: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3240: 52 44 5f 53 5f 53 55 43 43 45 53 53 22 29 3b 0a  RD_S_SUCCESS");.
3250: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43  ..case SCARD_E_C
3260: 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74  ANCELLED:....ret
3270: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43 41 4e  urn("SCARD_E_CAN
3280: 43 45 4c 4c 45 44 22 29 3b 0a 09 09 63 61 73 65  CELLED");...case
3290: 20 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44 49   SCARD_E_CANT_DI
32a0: 53 50 4f 53 45 3a 0a 09 09 09 72 65 74 75 72 6e  SPOSE:....return
32b0: 28 22 53 43 41 52 44 5f 45 5f 43 41 4e 54 5f 44  ("SCARD_E_CANT_D
32c0: 49 53 50 4f 53 45 22 29 3b 0a 09 09 63 61 73 65  ISPOSE");...case
32d0: 20 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49   SCARD_E_INSUFFI
32e0: 43 49 45 4e 54 5f 42 55 46 46 45 52 3a 0a 09 09  CIENT_BUFFER:...
32f0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3300: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
3310: 46 46 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  FFER");...case S
3320: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
3330: 54 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  TR:....return("S
3340: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 41  CARD_E_INVALID_A
3350: 54 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  TR");...case SCA
3360: 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
3370: 44 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  DLE:....return("
3380: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3390: 48 41 4e 44 4c 45 22 29 3b 0a 09 09 63 61 73 65  HANDLE");...case
33a0: 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44   SCARD_E_INVALID
33b0: 5f 50 41 52 41 4d 45 54 45 52 3a 0a 09 09 09 72  _PARAMETER:....r
33c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
33d0: 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52  NVALID_PARAMETER
33e0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
33f0: 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41 52 47 45  _E_INVALID_TARGE
3400: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  T:....return("SC
3410: 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 54 41  ARD_E_INVALID_TA
3420: 52 47 45 54 22 29 3b 0a 09 09 63 61 73 65 20 53  RGET");...case S
3430: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 56  CARD_E_INVALID_V
3440: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
3450: 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44  "SCARD_E_INVALID
3460: 5f 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65  _VALUE");...case
3470: 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f   SCARD_E_NO_MEMO
3480: 52 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RY:....return("S
3490: 43 41 52 44 5f 45 5f 4e 4f 5f 4d 45 4d 4f 52 59  CARD_E_NO_MEMORY
34a0: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
34b0: 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45  _E_UNKNOWN_READE
34c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
34d0: 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 52 45  ARD_E_UNKNOWN_RE
34e0: 41 44 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53  ADER");...case S
34f0: 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 3a 0a  CARD_E_TIMEOUT:.
3500: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3510: 5f 45 5f 54 49 4d 45 4f 55 54 22 29 3b 0a 09 09  _E_TIMEOUT");...
3520: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 48 41  case SCARD_E_SHA
3530: 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 3a 0a  RING_VIOLATION:.
3540: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3550: 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  _E_SHARING_VIOLA
3560: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 53  TION");...case S
3570: 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54 43  CARD_E_NO_SMARTC
3580: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
3590: 53 43 41 52 44 5f 45 5f 4e 4f 5f 53 4d 41 52 54  SCARD_E_NO_SMART
35a0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
35b0: 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f 43  CARD_E_UNKNOWN_C
35c0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
35d0: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
35e0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
35f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
3600: 4d 41 54 43 48 3a 0a 09 09 09 72 65 74 75 72 6e  MATCH:....return
3610: 28 22 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  ("SCARD_E_PROTO_
3620: 4d 49 53 4d 41 54 43 48 22 29 3b 0a 09 09 63 61  MISMATCH");...ca
3630: 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52  se SCARD_E_NOT_R
3640: 45 41 44 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  EADY:....return(
3650: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 52 45 41  "SCARD_E_NOT_REA
3660: 44 59 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  DY");...case SCA
3670: 52 44 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43  RD_E_SYSTEM_CANC
3680: 45 4c 4c 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ELLED:....return
3690: 28 22 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  ("SCARD_E_SYSTEM
36a0: 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09 09  _CANCELLED");...
36b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 54  case SCARD_E_NOT
36c0: 5f 54 52 41 4e 53 41 43 54 45 44 3a 0a 09 09 09  _TRANSACTED:....
36d0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
36e0: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 22 29  NOT_TRANSACTED")
36f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3700: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
3710: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
3720: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3730: 4e 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 09 09  NAVAILABLE");...
3740: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 53  case SCARD_W_UNS
3750: 55 50 50 4f 52 54 45 44 5f 43 41 52 44 3a 0a 09  UPPORTED_CARD:..
3760: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3770: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3780: 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  RD");...case SCA
3790: 52 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56  RD_W_UNRESPONSIV
37a0: 45 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  E_CARD:....retur
37b0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 52 45 53  n("SCARD_W_UNRES
37c0: 50 4f 4e 53 49 56 45 5f 43 41 52 44 22 29 3b 0a  PONSIVE_CARD");.
37d0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55  ..case SCARD_W_U
37e0: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 3a 0a 09  NPOWERED_CARD:..
37f0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3800: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
3810: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3820: 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 3a 0a 09  _W_RESET_CARD:..
3830: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3840: 57 5f 52 45 53 45 54 5f 43 41 52 44 22 29 3b 0a  W_RESET_CARD");.
3850: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 52  ..case SCARD_W_R
3860: 45 4d 4f 56 45 44 5f 43 41 52 44 3a 0a 09 09 09  EMOVED_CARD:....
3870: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3880: 52 45 4d 4f 56 45 44 5f 43 41 52 44 22 29 3b 0a  REMOVED_CARD");.
3890: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
38a0: 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 3a 0a 09 09  CI_TOO_SMALL:...
38b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38c0: 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  _PCI_TOO_SMALL")
38d0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
38e0: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
38f0: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3900: 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55  SCARD_E_READER_U
3910: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
3920: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 44 55 50  case SCARD_E_DUP
3930: 4c 49 43 41 54 45 5f 52 45 41 44 45 52 3a 0a 09  LICATE_READER:..
3940: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3950: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3960: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ER");...case SCA
3970: 52 44 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50  RD_E_CARD_UNSUPP
3980: 4f 52 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  ORTED:....return
3990: 28 22 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  ("SCARD_E_CARD_U
39a0: 4e 53 55 50 50 4f 52 54 45 44 22 29 3b 0a 09 09  NSUPPORTED");...
39b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f  case SCARD_E_NO_
39c0: 53 45 52 56 49 43 45 3a 0a 09 09 09 72 65 74 75  SERVICE:....retu
39d0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  rn("SCARD_E_NO_S
39e0: 45 52 56 49 43 45 22 29 3b 0a 09 09 63 61 73 65  ERVICE");...case
39f0: 20 53 43 41 52 44 5f 45 5f 53 45 52 56 49 43 45   SCARD_E_SERVICE
3a00: 5f 53 54 4f 50 50 45 44 3a 0a 09 09 09 72 65 74  _STOPPED:....ret
3a10: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 45 52  urn("SCARD_E_SER
3a20: 56 49 43 45 5f 53 54 4f 50 50 45 44 22 29 3b 0a  VICE_STOPPED");.
3a30: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3a40: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
3a50: 52 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RE:....return("S
3a60: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
3a70: 45 44 5f 46 45 41 54 55 52 45 22 29 3b 0a 23 69  ED_FEATURE");.#i
3a80: 66 64 65 66 20 53 43 41 52 44 5f 57 5f 49 4e 53  fdef SCARD_W_INS
3a90: 45 52 54 45 44 5f 43 41 52 44 0a 09 09 63 61 73  ERTED_CARD...cas
3aa0: 65 20 53 43 41 52 44 5f 57 5f 49 4e 53 45 52 54  e SCARD_W_INSERT
3ab0: 45 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75  ED_CARD:....retu
3ac0: 72 6e 28 22 53 43 41 52 44 5f 57 5f 49 4e 53 45  rn("SCARD_W_INSE
3ad0: 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 23 65 6e  RTED_CARD");.#en
3ae0: 64 69 66 0a 23 69 66 64 65 66 20 53 43 41 52 44  dif.#ifdef SCARD
3af0: 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56  _E_NO_READERS_AV
3b00: 41 49 4c 41 42 4c 45 0a 09 09 63 61 73 65 20 53  AILABLE...case S
3b10: 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52  CARD_E_NO_READER
3b20: 53 5f 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  S_AVAILABLE:....
3b30: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3b40: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3b50: 41 42 4c 45 22 29 3b 0a 23 65 6e 64 69 66 0a 09  ABLE");.#endif..
3b60: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3b70: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3b90: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f  KEY_DEBUG_FUNC_O
3ba0: 42 4a 49 44 5f 54 4f 5f 53 54 52 28 75 69 6e 74  BJID_TO_STR(uint
3bb0: 31 36 5f 74 20 6f 62 6a 69 64 29 20 7b 0a 09 73  16_t objid) {..s
3bc0: 77 69 74 63 68 20 28 6f 62 6a 69 64 29 20 7b 0a  witch (objid) {.
3bd0: 09 09 63 61 73 65 20 30 78 32 30 30 30 3a 0a 09  ..case 0x2000:..
3be0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3bf0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45 52  _TLV_OBJID_GENER
3c00: 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65  ALINFO");...case
3c10: 20 30 78 32 31 30 30 3a 0a 09 09 09 72 65 74 75   0x2100:....retu
3c20: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c30: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
3c40: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3c50: 78 33 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x3000:....return
3c60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3c70: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
3c80: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 34 30 30  ");...case 0x400
3c90: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3ca0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 4c  CKEY_TLV_OBJID_L
3cb0: 4f 47 49 4e 22 29 3b 0a 09 09 63 61 73 65 20 30  OGIN");...case 0
3cc0: 78 35 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x5000:....return
3cd0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3ce0: 49 44 5f 43 41 52 44 49 4e 46 4f 22 29 3b 0a 09  ID_CARDINFO");..
3cf0: 09 63 61 73 65 20 30 78 36 30 30 30 3a 0a 09 09  .case 0x6000:...
3d00: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3d10: 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d 45 54  TLV_OBJID_BIOMET
3d20: 52 49 43 53 22 29 3b 0a 09 09 63 61 73 65 20 30  RICS");...case 0
3d30: 78 37 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x7000:....return
3d40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3d50: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
3d60: 54 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  T");...case 0x02
3d70: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3d80: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3d90: 43 41 43 5f 50 45 52 53 4f 4e 22 29 3b 0a 09 09  CAC_PERSON");...
3da0: 63 61 73 65 20 30 78 30 32 30 32 3a 0a 09 09 09  case 0x0202:....
3db0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3dc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e  LV_OBJID_CAC_BEN
3dd0: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3de0: 30 78 30 32 30 33 3a 0a 09 09 09 72 65 74 75 72  0x0203:....retur
3df0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3e00: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
3e10: 45 46 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  EFITS");...case 
3e20: 30 78 30 32 30 31 3a 0a 09 09 09 72 65 74 75 72  0x0201:....retur
3e30: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3e40: 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45  JID_CAC_PERSONNE
3e50: 4c 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32  L");...case 0x02
3e60: 46 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  FE:....return("C
3e70: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3e80: 43 41 43 5f 50 4b 49 43 45 52 54 22 29 3b 0a 09  CAC_PKICERT");..
3e90: 7d 0a 09 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b  }....return("UNK
3ea0: 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69  NOWN");.}..stati
3eb0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41  c const char *CA
3ec0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
3ed0: 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 75  APPTYPE_TO_STR(u
3ee0: 69 6e 74 38 5f 74 20 61 70 70 74 79 70 65 29 20  int8_t apptype) 
3ef0: 7b 0a 09 73 77 69 74 63 68 20 28 61 70 70 74 79  {..switch (appty
3f00: 70 65 29 20 7b 0a 09 09 63 61 73 65 20 30 78 30  pe) {...case 0x0
3f10: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 4e 4f  0:....return("NO
3f20: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  NE");...case 0x0
3f30: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  1:....return("CA
3f40: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3f50: 45 52 49 43 22 29 3b 0a 09 09 63 61 73 65 20 30  ERIC");...case 0
3f60: 78 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  x02:....return("
3f70: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f80: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f90: 33 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  3:....return("CA
3fa0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e  CKEY_TLV_APP_GEN
3fb0: 45 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c  ERIC | CACKEY_TL
3fc0: 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63  V_APP_SKI");...c
3fd0: 61 73 65 20 30 78 30 34 3a 0a 09 09 09 72 65 74  ase 0x04:....ret
3fe0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3ff0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
4000: 65 20 30 78 30 35 3a 0a 09 09 09 72 65 74 75 72  e 0x05:....retur
4010: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
4020: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
4030: 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29  EY_TLV_APP_PKI")
4040: 3b 0a 09 09 63 61 73 65 20 30 78 30 36 3a 0a 09  ;...case 0x06:..
4050: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
4060: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20 43  _TLV_APP_SKI | C
4070: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
4080: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 37  I");...case 0x07
4090: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
40a0: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45  KEY_TLV_APP_GENE
40b0: 52 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56  RIC | CACKEY_TLV
40c0: 5f 41 50 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45  _APP_SKI | CACKE
40d0: 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b  Y_TLV_APP_PKI");
40e0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 22 49 4e  ..}...return("IN
40f0: 56 41 4c 49 44 22 29 3b 0a 7d 0a 0a 73 74 61 74  VALID");.}..stat
4100: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43  ic const char *C
4110: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4120: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
4130: 52 28 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54  R(CK_ATTRIBUTE_T
4140: 59 50 45 20 61 74 74 72 29 20 7b 0a 09 73 77 69  YPE attr) {..swi
4150: 74 63 68 20 28 61 74 74 72 29 20 7b 0a 09 09 63  tch (attr) {...c
4160: 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09  ase CKA_CLASS:..
4170: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 4c  ..return("CKA_CL
4180: 41 53 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ASS");...case CK
4190: 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 72 65 74 75  A_TOKEN:....retu
41a0: 72 6e 28 22 43 4b 41 5f 54 4f 4b 45 4e 22 29 3b  rn("CKA_TOKEN");
41b0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
41c0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
41d0: 43 4b 41 5f 50 52 49 56 41 54 45 22 29 3b 0a 09  CKA_PRIVATE");..
41e0: 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
41f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4200: 4c 41 42 45 4c 22 29 3b 0a 09 09 63 61 73 65 20  LABEL");...case 
4210: 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e 3a  CKA_APPLICATION:
4220: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4230: 41 50 50 4c 49 43 41 54 49 4f 4e 22 29 3b 0a 09  APPLICATION");..
4240: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a  .case CKA_VALUE:
4250: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4260: 56 41 4c 55 45 22 29 3b 0a 09 09 63 61 73 65 20  VALUE");...case 
4270: 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 3a 0a 09  CKA_OBJECT_ID:..
4280: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 42  ..return("CKA_OB
4290: 4a 45 43 54 5f 49 44 22 29 3b 0a 09 09 63 61 73  JECT_ID");...cas
42a0: 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
42b0: 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75 72  E_TYPE:....retur
42c0: 6e 28 22 43 4b 41 5f 43 45 52 54 49 46 49 43 41  n("CKA_CERTIFICA
42d0: 54 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61 73  TE_TYPE");...cas
42e0: 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
42f0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 49 53 53  .return("CKA_ISS
4300: 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  UER");...case CK
4310: 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
4320: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4330: 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 22 29 3b  SERIAL_NUMBER");
4340: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 43 5f 49  ...case CKA_AC_I
4350: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
4360: 28 22 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 22  ("CKA_AC_ISSUER"
4370: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 57  );...case CKA_OW
4380: 4e 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NER:....return("
4390: 43 4b 41 5f 4f 57 4e 45 52 22 29 3b 0a 09 09 63  CKA_OWNER");...c
43a0: 61 73 65 20 43 4b 41 5f 41 54 54 52 5f 54 59 50  ase CKA_ATTR_TYP
43b0: 45 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ES:....return("C
43c0: 4b 41 5f 41 54 54 52 5f 54 59 50 45 53 22 29 3b  KA_ATTR_TYPES");
43d0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
43e0: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
43f0: 43 4b 41 5f 54 52 55 53 54 45 44 22 29 3b 0a 09  CKA_TRUSTED");..
4400: 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59  .case CKA_KEY_TY
4410: 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  PE:....return("C
4420: 4b 41 5f 4b 45 59 5f 54 59 50 45 22 29 3b 0a 09  KA_KEY_TYPE");..
4430: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
4440: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
4450: 41 5f 53 55 42 4a 45 43 54 22 29 3b 0a 09 09 63  A_SUBJECT");...c
4460: 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 72  ase CKA_ID:....r
4470: 65 74 75 72 6e 28 22 43 4b 41 5f 49 44 22 29 3b  eturn("CKA_ID");
4480: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53  ...case CKA_SENS
4490: 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ITIVE:....return
44a0: 28 22 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 22  ("CKA_SENSITIVE"
44b0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
44c0: 43 52 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e  CRYPT:....return
44d0: 28 22 43 4b 41 5f 45 4e 43 52 59 50 54 22 29 3b  ("CKA_ENCRYPT");
44e0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52  ...case CKA_DECR
44f0: 59 50 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPT:....return("
4500: 43 4b 41 5f 44 45 43 52 59 50 54 22 29 3b 0a 09  CKA_DECRYPT");..
4510: 09 63 61 73 65 20 43 4b 41 5f 57 52 41 50 3a 0a  .case CKA_WRAP:.
4520: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 57  ...return("CKA_W
4530: 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  RAP");...case CK
4540: 41 5f 55 4e 57 52 41 50 3a 0a 09 09 09 72 65 74  A_UNWRAP:....ret
4550: 75 72 6e 28 22 43 4b 41 5f 55 4e 57 52 41 50 22  urn("CKA_UNWRAP"
4560: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
4570: 47 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  GN:....return("C
4580: 4b 41 5f 53 49 47 4e 22 29 3b 0a 09 09 63 61 73  KA_SIGN");...cas
4590: 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
45a0: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ER:....return("C
45b0: 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 22  KA_SIGN_RECOVER"
45c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
45d0: 52 49 46 59 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIFY:....return(
45e0: 22 43 4b 41 5f 56 45 52 49 46 59 22 29 3b 0a 09  "CKA_VERIFY");..
45f0: 09 63 61 73 65 20 43 4b 41 5f 56 45 52 49 46 59  .case CKA_VERIFY
4600: 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74  _RECOVER:....ret
4610: 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59 5f  urn("CKA_VERIFY_
4620: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
4630: 65 20 43 4b 41 5f 44 45 52 49 56 45 3a 0a 09 09  e CKA_DERIVE:...
4640: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 52  .return("CKA_DER
4650: 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IVE");...case CK
4660: 41 5f 53 54 41 52 54 5f 44 41 54 45 3a 0a 09 09  A_START_DATE:...
4670: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 54 41  .return("CKA_STA
4680: 52 54 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  RT_DATE");...cas
4690: 65 20 43 4b 41 5f 45 4e 44 5f 44 41 54 45 3a 0a  e CKA_END_DATE:.
46a0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
46b0: 4e 44 5f 44 41 54 45 22 29 3b 0a 09 09 63 61 73  ND_DATE");...cas
46c0: 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
46d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f  ..return("CKA_MO
46e0: 44 55 4c 55 53 22 29 3b 0a 09 09 63 61 73 65 20  DULUS");...case 
46f0: 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53  CKA_MODULUS_BITS
4700: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4710: 5f 4d 4f 44 55 4c 55 53 5f 42 49 54 53 22 29 3b  _MODULUS_BITS");
4720: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c  ...case CKA_PUBL
4730: 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  IC_EXPONENT:....
4740: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 55 42 4c  return("CKA_PUBL
4750: 49 43 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  IC_EXPONENT");..
4760: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
4770: 45 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 72  E_EXPONENT:....r
4780: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41  eturn("CKA_PRIVA
4790: 54 45 5f 45 58 50 4f 4e 45 4e 54 22 29 3b 0a 09  TE_EXPONENT");..
47a0: 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f  .case CKA_PRIME_
47b0: 31 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  1:....return("CK
47c0: 41 5f 50 52 49 4d 45 5f 31 22 29 3b 0a 09 09 63  A_PRIME_1");...c
47d0: 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 5f 32 3a  ase CKA_PRIME_2:
47e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
47f0: 50 52 49 4d 45 5f 32 22 29 3b 0a 09 09 63 61 73  PRIME_2");...cas
4800: 65 20 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  e CKA_EXPONENT_1
4810: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4820: 5f 45 58 50 4f 4e 45 4e 54 5f 31 22 29 3b 0a 09  _EXPONENT_1");..
4830: 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e 45  .case CKA_EXPONE
4840: 4e 54 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  NT_2:....return(
4850: 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 22  "CKA_EXPONENT_2"
4860: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4f  );...case CKA_CO
4870: 45 46 46 49 43 49 45 4e 54 3a 0a 09 09 09 72 65  EFFICIENT:....re
4880: 74 75 72 6e 28 22 43 4b 41 5f 43 4f 45 46 46 49  turn("CKA_COEFFI
4890: 43 49 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  CIENT");...case 
48a0: 43 4b 41 5f 50 52 49 4d 45 3a 0a 09 09 09 72 65  CKA_PRIME:....re
48b0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 22  turn("CKA_PRIME"
48c0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 55  );...case CKA_SU
48d0: 42 50 52 49 4d 45 3a 0a 09 09 09 72 65 74 75 72  BPRIME:....retur
48e0: 6e 28 22 43 4b 41 5f 53 55 42 50 52 49 4d 45 22  n("CKA_SUBPRIME"
48f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 42 41  );...case CKA_BA
4900: 53 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SE:....return("C
4910: 4b 41 5f 42 41 53 45 22 29 3b 0a 09 09 63 61 73  KA_BASE");...cas
4920: 65 20 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  e CKA_PRIME_BITS
4930: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4940: 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a 09  _PRIME_BITS");..
4950: 09 63 61 73 65 20 43 4b 41 5f 53 55 42 5f 50 52  .case CKA_SUB_PR
4960: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
4970: 75 72 6e 28 22 43 4b 41 5f 53 55 42 5f 50 52 49  urn("CKA_SUB_PRI
4980: 4d 45 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73  ME_BITS");...cas
4990: 65 20 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  e CKA_VALUE_BITS
49a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49b0: 5f 56 41 4c 55 45 5f 42 49 54 53 22 29 3b 0a 09  _VALUE_BITS");..
49c0: 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 5f  .case CKA_VALUE_
49d0: 4c 45 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  LEN:....return("
49e0: 43 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 22 29 3b  CKA_VALUE_LEN");
49f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52  ...case CKA_EXTR
4a00: 41 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75  ACTABLE:....retu
4a10: 72 6e 28 22 43 4b 41 5f 45 58 54 52 41 43 54 41  rn("CKA_EXTRACTA
4a20: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  BLE");...case CK
4a30: 41 5f 4c 4f 43 41 4c 3a 0a 09 09 09 72 65 74 75  A_LOCAL:....retu
4a40: 72 6e 28 22 43 4b 41 5f 4c 4f 43 41 4c 22 29 3b  rn("CKA_LOCAL");
4a50: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4e 45 56 45  ...case CKA_NEVE
4a60: 52 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  R_EXTRACTABLE:..
4a70: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4e 45  ..return("CKA_NE
4a80: 56 45 52 5f 45 58 54 52 41 43 54 41 42 4c 45 22  VER_EXTRACTABLE"
4a90: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 4c  );...case CKA_AL
4aa0: 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 3a 0a  WAYS_SENSITIVE:.
4ab0: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4ac0: 4c 57 41 59 53 5f 53 45 4e 53 49 54 49 56 45 22  LWAYS_SENSITIVE"
4ad0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  );...case CKA_KE
4ae0: 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53 4d 3a  Y_GEN_MECHANISM:
4af0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4b00: 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41 4e 49 53  KEY_GEN_MECHANIS
4b10: 4d 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  M");...case CKA_
4b20: 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 72  MODIFIABLE:....r
4b30: 65 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 49 46  eturn("CKA_MODIF
4b40: 49 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  IABLE");...case 
4b50: 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41 4d 53  CKA_ECDSA_PARAMS
4b60: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4b70: 5f 45 43 44 53 41 5f 50 41 52 41 4d 53 22 29 3b  _ECDSA_PARAMS");
4b80: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 5f 50  ...case CKA_EC_P
4b90: 4f 49 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  OINT:....return(
4ba0: 22 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 22 29 3b  "CKA_EC_POINT");
4bb0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 45 43 4f  ...case CKA_SECO
4bc0: 4e 44 41 52 59 5f 41 55 54 48 3a 0a 09 09 09 72  NDARY_AUTH:....r
4bd0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 43 4f 4e  eturn("CKA_SECON
4be0: 44 41 52 59 5f 41 55 54 48 22 29 3b 0a 09 09 63  DARY_AUTH");...c
4bf0: 61 73 65 20 43 4b 41 5f 41 55 54 48 5f 50 49 4e  ase CKA_AUTH_PIN
4c00: 5f 46 4c 41 47 53 3a 0a 09 09 09 72 65 74 75 72  _FLAGS:....retur
4c10: 6e 28 22 43 4b 41 5f 41 55 54 48 5f 50 49 4e 5f  n("CKA_AUTH_PIN_
4c20: 46 4c 41 47 53 22 29 3b 0a 09 09 63 61 73 65 20  FLAGS");...case 
4c30: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
4c40: 59 50 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  YPE:....return("
4c50: 43 4b 41 5f 48 57 5f 46 45 41 54 55 52 45 5f 54  CKA_HW_FEATURE_T
4c60: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
4c70: 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 3a  A_RESET_ON_INIT:
4c80: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4c90: 52 45 53 45 54 5f 4f 4e 5f 49 4e 49 54 22 29 3b  RESET_ON_INIT");
4ca0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 41 53 5f  ...case CKA_HAS_
4cb0: 52 45 53 45 54 3a 0a 09 09 09 72 65 74 75 72 6e  RESET:....return
4cc0: 28 22 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 22  ("CKA_HAS_RESET"
4cd0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 45  );...case CKA_VE
4ce0: 4e 44 4f 52 5f 44 45 46 49 4e 45 44 3a 0a 09 09  NDOR_DEFINED:...
4cf0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 4e  .return("CKA_VEN
4d00: 44 4f 52 5f 44 45 46 49 4e 45 44 22 29 3b 0a 09  DOR_DEFINED");..
4d10: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
4d20: 4f 57 4e 22 29 3b 0a 7d 0a 0a 23 20 20 64 65 66  OWN");.}..#  def
4d30: 69 6e 65 20 6d 61 6c 6c 6f 63 28 78 29 20 43 41  ine malloc(x) CA
4d40: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4d50: 4d 41 4c 4c 4f 43 28 78 2c 20 5f 5f 66 75 6e 63  MALLOC(x, __func
4d60: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20  __, __LINE__).# 
4d70: 20 64 65 66 69 6e 65 20 72 65 61 6c 6c 6f 63 28   define realloc(
4d80: 78 2c 20 79 29 20 43 41 43 4b 45 59 5f 44 45 42  x, y) CACKEY_DEB
4d90: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
4da0: 78 2c 20 79 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20  x, y, __func__, 
4db0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 20 20 69 66 64  __LINE__).#  ifd
4dc0: 65 66 20 73 74 72 64 75 70 0a 23 20 20 20 20 75  ef strdup.#    u
4dd0: 6e 64 65 66 20 73 74 72 64 75 70 0a 23 20 20 65  ndef strdup.#  e
4de0: 6e 64 69 66 0a 23 20 20 64 65 66 69 6e 65 20 73  ndif.#  define s
4df0: 74 72 64 75 70 28 78 29 20 43 41 43 4b 45 59 5f  trdup(x) CACKEY_
4e00: 44 45 42 55 47 5f 46 55 4e 43 5f 53 54 52 44 55  DEBUG_FUNC_STRDU
4e10: 50 28 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f  P(x, __func__, _
4e20: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
4e30: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e 2e  DEBUG_PRINTF(x..
4e50: 2e 29 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e  .) /**/.#  defin
4e60: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4e70: 52 49 4e 54 42 55 46 28 66 2c 20 78 2c 20 79 29  RINTBUF(f, x, y)
4e80: 20 2f 2a 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20   /**/.#  define 
4e90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4ea0: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 78 29 20  C_TAG_TO_STR(x) 
4eb0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4ec0: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4ed0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
4ee0: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 78 29 20  RDERR_TO_STR(x) 
4ef0: 22 44 45 42 55 47 5f 44 49 53 41 42 4c 45 44 22  "DEBUG_DISABLED"
4f00: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4f10: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
4f20: 49 44 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  ID_TO_STR(x) "DE
4f30: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20  BUG_DISABLED".# 
4f40: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4f50: 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
4f60: 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42  E_TO_STR(x) "DEB
4f70: 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20  UG_DISABLED".#  
4f80: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4f90: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
4fa0: 54 45 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45  TE_TO_STR(x) "DE
4fb0: 42 55 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 65  BUG_DISABLED".#e
4fc0: 6e 64 69 66 0a 0a 74 79 70 65 64 65 66 20 65 6e  ndif..typedef en
4fd0: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 49 44 5f  um {..CACKEY_ID_
4fe0: 54 59 50 45 5f 43 41 43 2c 0a 09 43 41 43 4b 45  TYPE_CAC,..CACKE
4ff0: 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 0a 09  Y_ID_TYPE_PIV,..
5000: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
5010: 45 52 54 5f 4f 4e 4c 59 0a 7d 20 63 61 63 6b 65  ERT_ONLY.} cacke
5020: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 3b 0a  y_pcsc_id_type;.
5030: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
5040: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  csc_identity {..
5050: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74  cackey_pcsc_id_t
5060: 79 70 65 20 69 64 5f 74 79 70 65 3b 0a 0a 09 73  ype id_type;...s
5070: 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61 74  ize_t certificat
5080: 65 5f 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e 65 64  e_len;..unsigned
5090: 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61   char *certifica
50a0: 74 65 3b 0a 0a 09 73 73 69 7a 65 5f 74 20 6b 65  te;...ssize_t ke
50b0: 79 73 69 7a 65 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ysize;...union {
50c0: 0a 09 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75  ...struct {....u
50d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70 70  nsigned char app
50e0: 6c 65 74 5b 37 5d 3b 0a 09 09 09 75 69 6e 74 31  let[7];....uint1
50f0: 36 5f 74 20 66 69 6c 65 3b 0a 09 09 7d 20 63 61  6_t file;...} ca
5100: 63 3b 0a 0a 09 09 73 74 72 75 63 74 20 7b 0a 09  c;....struct {..
5110: 09 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
5120: 6b 65 79 5f 69 64 3b 0a 09 09 09 63 68 61 72 20  key_id;....char 
5130: 6c 61 62 65 6c 5b 33 32 5d 3b 0a 09 09 7d 20 70  label[32];...} p
5140: 69 76 3b 0a 09 7d 20 63 61 72 64 3b 0a 7d 3b 0a  iv;..} card;.};.
5150: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5160: 64 65 6e 74 69 74 79 20 7b 0a 09 73 74 72 75 63  dentity {..struc
5170: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5180: 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
5190: 6e 74 69 74 79 3b 0a 0a 09 43 4b 5f 41 54 54 52  ntity;...CK_ATTR
51a0: 49 42 55 54 45 20 2a 61 74 74 72 69 62 75 74 65  IBUTE *attribute
51b0: 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 61 74 74  s;..CK_ULONG att
51c0: 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 0a 7d  ributes_count;.}
51d0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
51e0: 5f 73 65 73 73 69 6f 6e 20 7b 0a 09 69 6e 74 20  _session {..int 
51f0: 61 63 74 69 76 65 3b 0a 0a 09 43 4b 5f 53 4c 4f  active;...CK_SLO
5200: 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 0a 09 43  T_ID slotID;...C
5210: 4b 5f 53 54 41 54 45 20 73 74 61 74 65 3b 0a 09  K_STATE state;..
5220: 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 3b 0a  CK_FLAGS flags;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 65 76 69  .CK_ULONG ulDevi
5240: 63 65 45 72 72 6f 72 3b 0a 09 43 4b 5f 56 4f 49  ceError;..CK_VOI
5250: 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69  D_PTR pApplicati
5260: 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54 49 46 59 20 4e  on;..CK_NOTIFY N
5270: 6f 74 69 66 79 3b 0a 0a 09 73 74 72 75 63 74 20  otify;...struct 
5280: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
5290: 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  *identities;..un
52a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
52b0: 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09  tities_count;...
52c0: 69 6e 74 20 73 65 61 72 63 68 5f 61 63 74 69 76  int search_activ
52d0: 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  e;..CK_ATTRIBUTE
52e0: 5f 50 54 52 20 73 65 61 72 63 68 5f 71 75 65 72  _PTR search_quer
52f0: 79 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 73 65 61  y;..CK_ULONG sea
5300: 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
5310: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5320: 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 0a  search_curr_id;.
5330: 0a 09 69 6e 74 20 73 69 67 6e 5f 61 63 74 69 76  ..int sign_activ
5340: 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  e;..CK_MECHANISM
5350: 5f 54 59 50 45 20 73 69 67 6e 5f 6d 65 63 68 61  _TYPE sign_mecha
5360: 6e 69 73 6d 3b 0a 09 43 4b 5f 42 59 54 45 5f 50  nism;..CK_BYTE_P
5370: 54 52 20 73 69 67 6e 5f 62 75 66 3b 0a 09 75 6e  TR sign_buf;..un
5380: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67 6e  signed long sign
5390: 5f 62 75 66 6c 65 6e 3b 0a 09 75 6e 73 69 67 6e  _buflen;..unsign
53a0: 65 64 20 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66  ed long sign_buf
53b0: 75 73 65 64 3b 0a 09 73 74 72 75 63 74 20 63 61  used;..struct ca
53c0: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 73  ckey_identity *s
53d0: 69 67 6e 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09  ign_identity;...
53e0: 69 6e 74 20 64 65 63 72 79 70 74 5f 61 63 74 69  int decrypt_acti
53f0: 76 65 3b 0a 09 43 4b 5f 4d 45 43 48 41 4e 49 53  ve;..CK_MECHANIS
5400: 4d 5f 54 59 50 45 20 64 65 63 72 79 70 74 5f 6d  M_TYPE decrypt_m
5410: 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 56 4f  echanism;..CK_VO
5420: 49 44 5f 50 54 52 20 64 65 63 72 79 70 74 5f 6d  ID_PTR decrypt_m
5430: 65 63 68 5f 70 61 72 6d 3b 0a 09 43 4b 5f 55 4c  ech_parm;..CK_UL
5440: 4f 4e 47 20 64 65 63 72 79 70 74 5f 6d 65 63 68  ONG decrypt_mech
5450: 5f 70 61 72 6d 6c 65 6e 3b 0a 09 73 74 72 75 63  _parmlen;..struc
5460: 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
5470: 79 20 2a 64 65 63 72 79 70 74 5f 69 64 65 6e 74  y *decrypt_ident
5480: 69 74 79 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ity;.};..struct 
5490: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 7b 0a 09 69  cackey_slot {..i
54a0: 6e 74 20 61 63 74 69 76 65 3b 0a 09 69 6e 74 20  nt active;..int 
54b0: 69 6e 74 65 72 6e 61 6c 3b 0a 0a 09 63 68 61 72  internal;...char
54c0: 20 2a 70 63 73 63 5f 72 65 61 64 65 72 3b 0a 0a   *pcsc_reader;..
54d0: 09 69 6e 74 20 70 63 73 63 5f 63 61 72 64 5f 63  .int pcsc_card_c
54e0: 6f 6e 6e 65 63 74 65 64 3b 0a 09 53 43 41 52 44  onnected;..SCARD
54f0: 48 41 4e 44 4c 45 20 70 63 73 63 5f 63 61 72 64  HANDLE pcsc_card
5500: 3b 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74  ;...int transact
5510: 69 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20  ion_depth;..int 
5520: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
5530: 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20  _hw_lock;...int 
5540: 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b  slot_reset;...CK
5550: 5f 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61  _FLAGS token_fla
5560: 67 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63  gs;...unsigned c
5570: 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57  har *label;...DW
5580: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09  ORD protocol;...
5590: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63  unsigned int cac
55a0: 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
55b0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
55c0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
55d0: 61 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a  ached_certs;.};.
55e0: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
55f0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5600: 47 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a  GENERIC = 0x01,.
5610: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5620: 53 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a  SKI     = 0x02,.
5630: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f  .CACKEY_TLV_APP_
5640: 50 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d  PKI     = 0x04.}
5650: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74   cackey_tlv_appt
5660: 79 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ype;..typedef en
5670: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
5680: 5f 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e  _OBJID_GENERALIN
5690: 46 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30  FO       = 0x200
56a0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
56b0: 42 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c  BJID_PROPERSONAL
56c0: 49 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c  INFO   = 0x2100,
56d0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
56e0: 49 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c  ID_ACCESSCONTROL
56f0: 20 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09       = 0x3000,..
5700: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5710: 5f 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20  _LOGIN          
5720: 20 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41     = 0x4000,..CA
5730: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5740: 41 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20  ARDINFO         
5750: 20 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b   = 0x5000,..CACK
5760: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f  EY_TLV_OBJID_BIO
5770: 4d 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d  METRICS        =
5780: 20 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x6000,..CACKEY
5790: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
57a0: 41 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30  ALSIGCERT    = 0
57b0: 78 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x7000,..CACKEY_T
57c0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
57d0: 53 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30  SON        = 0x0
57e0: 32 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  200,..CACKEY_TLV
57f0: 5f 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46  _OBJID_CAC_BENEF
5800: 49 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30  ITS      = 0x020
5810: 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  2,..CACKEY_TLV_O
5820: 42 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45  BJID_CAC_OTHERBE
5830: 4e 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c  NEFITS = 0x0203,
5840: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5850: 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c  ID_CAC_PERSONNEL
5860: 20 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09       = 0x0201,..
5870: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5880: 5f 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20  _CAC_PKICERT    
5890: 20 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61     = 0x02FE.} ca
58a0: 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69  ckey_tlv_objecti
58b0: 64 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  d;..typedef enum
58c0: 20 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f   {..CACKEY_PCSC_
58d0: 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20  S_TOKENPRESENT  
58e0: 20 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50    = 1,..CACKEY_P
58f0: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
5900: 20 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b        = 0,..CACK
5910: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
5920: 43 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a  C         = -1,.
5930: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  .CACKEY_PCSC_E_B
5940: 41 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d  ADPIN          =
5950: 20 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -2,..CACKEY_PCS
5960: 43 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  C_E_LOCKED      
5970: 20 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45      = -3,..CACKE
5980: 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
5990: 49 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09  IN       = -4,..
59a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
59b0: 4b 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20  KENABSENT     = 
59c0: 2d 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -6,..CACKEY_PCSC
59d0: 5f 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20  _E_RETRY        
59e0: 20 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79     = -7.} cackey
59f0: 5f 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61  _ret;..struct ca
5a00: 63 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c  ckey_tlv_cardurl
5a10: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
5a20: 72 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b  r        rid[5];
5a30: 0a 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70  ..cackey_tlv_app
5a40: 74 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a  type   apptype;.
5a50: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65  .cackey_tlv_obje
5a60: 63 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a  ctid  objectid;.
5a70: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65  .cackey_tlv_obje
5a80: 63 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e  ctid  appid;..un
5a90: 73 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20  signed char     
5aa0: 20 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74     pinid;.};..st
5ab0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
5ac0: 65 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63  entity;.struct c
5ad0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5ae0: 20 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b   {..uint8_t tag;
5af0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b  ..size_t length;
5b00: 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69  ...union {...voi
5b10: 64 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75  d *value;...stru
5b20: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
5b30: 72 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72  rdurl *value_car
5b40: 64 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20  durl;...uint8_t 
5b50: 76 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a  value_byte;..};.
5b60: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5b70: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78  tlv_entity *_nex
5b80: 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59  t;.};../* CACKEY
5b90: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
5ba0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
5bb0: 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d  cackey_biglock =
5bc0: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74   NULL;.static st
5bd0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73  ruct cackey_sess
5be0: 69 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ion cackey_sessi
5bf0: 6f 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63  ons[128];.static
5c00: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
5c10: 6c 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  lot cackey_slots
5c20: 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e  [128];.static in
5c30: 74 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  t cackey_initial
5c40: 69 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63  ized = 0;.static
5c50: 20 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c   int cackey_bigl
5c60: 6f 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b  ock_init = 0;.CK
5c70: 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52  _C_INITIALIZE_AR
5c80: 47 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a  GS cackey_args;.
5c90: 0a 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69  ./** Extra certi
5ca0: 66 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75  ficates to inclu
5cb0: 64 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a  de in token **/.
5cc0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
5cd0: 73 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72  sc_identity extr
5ce0: 61 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69  a_certs[] = {.#i
5cf0: 6e 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62  nclude "cackey_b
5d00: 75 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a  uiltin_certs.h".
5d10: 7d 3b 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64  };../* Protected
5d20: 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   Authentication 
5d30: 50 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  Path command */.
5d40: 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 50  #define CACKEY_P
5d50: 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
5d60: 4c 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43  LT_XSTR(str) CAC
5d70: 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
5d80: 44 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29  DEFAULT_STR(str)
5d90: 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f  .#define CACKEY_
5da0: 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
5db0: 55 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73 74  ULT_STR(str) #st
5dc0: 72 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  r.static char *c
5dd0: 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
5de0: 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 50 43  d = NULL;../* PC
5df0: 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65  SC Global Handle
5e00: 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43  s */.static LPSC
5e10: 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65  ARDCONTEXT cacke
5e20: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
5e30: 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e  NULL;..static un
5e40: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b  signed long cack
5e50: 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f  ey_getversion(vo
5e60: 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e  id) {..static un
5e70: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76  signed long retv
5e80: 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67  al = 255;..unsig
5e90: 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d  ned long major =
5ea0: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f   0;..unsigned lo
5eb0: 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63  ng minor = 0;..c
5ec0: 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d  har *major_str =
5ed0: 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69   NULL;..char *mi
5ee0: 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  nor_str = NULL;.
5ef0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5f00: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
5f10: 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21  ;...if (retval !
5f20: 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45  = 255) {...CACKE
5f30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5f40: 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20  Returning 0x%lx 
5f50: 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76  (cached).", retv
5f60: 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72  al);....return(r
5f70: 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
5f80: 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  val = 0;..#ifdef
5f90: 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
5fa0: 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73  .        major_s
5fb0: 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52  tr = PACKAGE_VER
5fc0: 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72  SION;..if (major
5fd0: 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20  _str) {..       
5fe0: 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c   major = strtoul
5ff0: 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e  (major_str, &min
6000: 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09  or_str, 10);....
6010: 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b  if (minor_str) {
6020: 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74  ....minor = strt
6030: 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20  oul(minor_str + 
6040: 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09  1, NULL, 10);...
6050: 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20  }..}...retval = 
6060: 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20  (major << 16) | 
6070: 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65  (minor << 8);.#e
6080: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
6090: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
60a0: 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65  rning 0x%lx", re
60b0: 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
60c0: 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50  retval);.}../* P
60d0: 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e  C/SC Related Fun
60e0: 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20  ctions */./*. * 
60f0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6100: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
6110: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6120: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
6130: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
6140: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
6150: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f   VALUE. *     No
6160: 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ne. *. * NOTES. 
6170: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6180: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
6190: 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a  from all cards..
61a0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
61b0: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
61c0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
61d0: 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  oid) {..uint32_t
61e0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
61f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6200: 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69  led.");...for (i
6210: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
6220: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
6230: 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
6240: 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
6250: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
6260: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6270: 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
6280: 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c  /* Skip internal
6290: 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e   slots */....con
62a0: 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
62b0: 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69   (cackey_slots[i
62c0: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f  dx].pcsc_card_co
62d0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41  nnected) {....CA
62e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
62f0: 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  F("SCardDisconne
6300: 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c  ct(%lu) called",
6310: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6320: 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64   idx);.....SCard
6330: 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65  Disconnect(cacke
6340: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
6350: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
6360: 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a  AVE_CARD);...}..
6370: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6380: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b  ts[idx].label) {
6390: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
63a0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
63b0: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
63c0: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d  ots[idx].label =
63d0: 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61   NULL;...}....ca
63e0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
63f0: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
6400: 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ted = 0;...cacke
6410: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
6420: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
6430: 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
6440: 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
6450: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
6460: 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63   = 0;....if (cac
6470: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
6480: 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b  ctive) {....CACK
6490: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
64a0: 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20  "Marking active 
64b0: 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e  slot %lu as bein
64c0: 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67  g reset", (unsig
64d0: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
64e0: 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
64f0: 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
6500: 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41  set = 1;..}...CA
6510: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6520: 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  F("Returning");.
6530: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
6540: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6550: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
6560: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
6570: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
6580: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6590: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
65a0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
65b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
65c0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
65d0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
65e0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
65f0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6600: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6610: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
6620: 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f  nects to the PC/
6630: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
6640: 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65  nager and update
6650: 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f  s the. *     glo
6660: 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20  bal handle.. *. 
6670: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
6680: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
6690: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  _connect(void) {
66a0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74  ..LONG scard_est
66b0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69  _context_ret;.#i
66c0: 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49  fdef HAVE_SCARDI
66d0: 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c  SVALIDCONTEXT..L
66e0: 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ONG scard_isvali
66f0: 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_ret;.#endif...
6700: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6710: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
6720: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
6730: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
6740: 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73  ) {...cackey_pcs
6750: 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f  c_handle = mallo
6760: 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
6770: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a  _pcsc_handle));.
6780: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
6790: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
67a0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
67b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
67c0: 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   to malloc() fai
67d0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
67e0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
67f0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
6800: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
6810: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6820: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6830: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
6840: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
6850: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6860: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
6870: 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  ...scard_est_con
6880: 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64  text_ret = SCard
6890: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
68a0: 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53  (SCARD_SCOPE_SYS
68b0: 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  TEM, NULL, NULL,
68c0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
68d0: 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72  dle);...if (scar
68e0: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
68f0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
6900: 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45  CESS) {....CACKE
6910: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6920: 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74  Call to SCardEst
6930: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61  ablishContext fa
6940: 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25  iled (returned %
6950: 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e  s/%li), returnin
6960: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43  g in failure", C
6970: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
6980: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
6990: 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  (scard_est_conte
69a0: 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  xt_ret), (long) 
69b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
69c0: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65  t_ret);.....free
69d0: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
69e0: 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  dle);....cackey_
69f0: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
6a00: 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  LL;.....cackey_s
6a10: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
6a20: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6a30: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6a40: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d  GENERIC);...}..}
6a50: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43  ..#ifdef HAVE_SC
6a60: 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58  ARDISVALIDCONTEX
6a70: 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  T..CACKEY_DEBUG_
6a80: 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56  PRINTF("SCardIsV
6a90: 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61  alidContext() ca
6aa0: 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69  lled");..scard_i
6ab0: 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61  svalid_ret = SCa
6ac0: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6ad0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
6ae0: 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72  ndle);..if (scar
6af0: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d  d_isvalid_ret !=
6b00: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
6b10: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
6b20: 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c  UG_PRINTF("Handl
6b30: 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76  e has become inv
6b40: 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c  alid (SCardIsVal
6b50: 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25  idContext = %s/%
6b60: 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  li), trying to r
6b70: 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c  e-establish...",
6b80: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6b90: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6ba0: 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  TR(scard_isvalid
6bb0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6bc0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29  ard_isvalid_ret)
6bd0: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
6be0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45  G_PRINTF("SCardE
6bf0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
6c00: 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63  ) called");...sc
6c10: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6c20: 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62  ret = SCardEstab
6c30: 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52  lishContext(SCAR
6c40: 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20  D_SCOPE_SYSTEM, 
6c50: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b  NULL, NULL, cack
6c60: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
6c70: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74  ...if (scard_est
6c80: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
6c90: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6ca0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
6cb0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
6cc0: 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73  to SCardEstablis
6cd0: 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20  hContext failed 
6ce0: 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69  (returned %s/%li
6cf0: 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  ), returning in 
6d00: 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59  failure", CACKEY
6d10: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
6d20: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
6d30: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6d40: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
6d50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6d60: 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b  );.....free(cack
6d70: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
6d80: 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  ....cackey_pcsc_
6d90: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
6da0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
6db0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
6dc0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6dd0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6de0: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
6df0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6e00: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e  "Handle has been
6e10: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22   re-established"
6e20: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43  );..}.#endif...C
6e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6e40: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
6e50: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f  connected to PC/
6e60: 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  SC, returning in
6e70: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
6e80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6e90: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
6ea0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
6eb0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
6ec0: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
6ed0: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
6ee0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6ef0: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
6f00: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
6f10: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
6f20: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
6f30: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
6f40: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6f50: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
6f60: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
6f70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69  This function di
6f80: 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74  sconnects from t
6f90: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
6fa0: 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20  ion manager and 
6fb0: 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74  updates. *     t
6fc0: 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65  he global handle
6fd0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
6fe0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6ff0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
7000: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
7010: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
7020: 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
7030: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
7040: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
7050: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7060: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  e == NULL) {...r
7070: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7080: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63  C_S_OK);..}...sc
7090: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
70a0: 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61  ret = SCardRelea
70b0: 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65  seContext(*cacke
70c0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
70d0: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
70e0: 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72  c_handle) {...fr
70f0: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
7100: 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b  andle);.....cack
7110: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
7120: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28   NULL;..}...if (
7130: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
7140: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
7150: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65  _SUCCESS) {...re
7160: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7170: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7180: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7190: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
71a0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
71b0: 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79       void cackey
71c0: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
71d0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
71e0: 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20  lot *slot);. *. 
71f0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
7200: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
7210: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
7220: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
7230: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
7240: 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20  unction marks a 
7250: 73 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20  slot has having 
7260: 62 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c  been reset, to l
7270: 61 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20  ater be cleaned 
7280: 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e  up.. *     Clean
7290: 75 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  up only happens 
72a0: 77 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63  when a PKCS#11 c
72b0: 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69  lient calls C_Fi
72c0: 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20  ndObjectsInit.. 
72d0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
72e0: 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  d cackey_mark_sl
72f0: 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20  ot_reset(struct 
7300: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7310: 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d  t) {..if (slot =
7320: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
7330: 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  rn;..}...CACKEY_
7340: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
7350: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
7360: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7370: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43  onnected) {...SC
7380: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
7390: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
73a0: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
73b0: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f  ;..}...slot->slo
73c0: 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c  t_reset = 1;..sl
73d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
73e0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 69 66  nnected = 0;..if
73f0: 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d   (cackey_pin_com
7400: 6d 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  mand == NULL) {.
7410: 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c  ..slot->token_fl
7420: 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
7430: 52 45 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73  REQUIRED;..} els
7440: 65 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65  e {...slot->toke
7450: 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
7460: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7470: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
7480: 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  .");...return;.}
7490: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
74a0: 0a 20 2a 20 20 20 20 20 4c 4f 4e 47 20 63 61 63  . *     LONG cac
74b0: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
74c0: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
74d0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
74e0: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
74f0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  col);. *. * ARGU
7500: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7510: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7520: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7530: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7540: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f  to. *. *     DWO
7550: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7560: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50  col. *         P
7570: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d  rotocol to attem
7580: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 52  pt first. *. * R
7590: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
75a0: 20 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61     The return va
75b0: 6c 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65  lue from SCardRe
75c0: 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20  connect(). *. * 
75d0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
75e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
75f0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53  wrapper around S
7600: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a  CardReconnect().
7610: 20 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43   *. *     The SC
7620: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66  ardReconnect() f
7630: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c  unction call wil
7640: 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  l be called firs
7650: 74 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20  t with the. *   
7660: 20 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f    dwPreferredPro
7670: 74 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75  tocols of "defau
7680: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49  lt_protocol".  I
7690: 66 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75  f that call retu
76a0: 72 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44  rns. *     SCARD
76b0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
76c0: 48 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68  H try again with
76d0: 20 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54   a protocol of T
76e0: 3d 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a  =0, and failing.
76f0: 20 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e   *     that T=1.
7700: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c  . *. */.static L
7710: 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  ONG cackey_recon
7720: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
7730: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7740: 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c  ot, DWORD defaul
7750: 74 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 44  t_protocol) {..D
7760: 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72  WORD selected_pr
7770: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
7780: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
7790: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
77a0: 6c 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 63  l = 0;...scard_c
77b0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
77c0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
77d0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
77e0: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65  SHARE_SHARED, de
77f0: 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20  fault_protocol, 
7800: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7810: 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  , &selected_prot
7820: 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61  ocol);...if (sca
7830: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7840: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7850: 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45  MATCH) {...CACKE
7860: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7870: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7880: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
7890: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
78a0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
78b0: 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64  st T=0")...scard
78c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
78d0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
78e0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
78f0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7900: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7910: 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  0, SCARD_RESET_C
7920: 41 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70  ARD, &selected_p
7930: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
7940: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7950: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
7960: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
7970: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7980: 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e  NTF("SCardReconn
7990: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
79a0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
79b0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
79c0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
79d0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
79e0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
79f0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7a00: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
7a10: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7a20: 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52  OCOL_T1, SCARD_R
7a30: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65  ESET_CARD, &sele
7a40: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
7a50: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  ..}..}...if (sca
7a60: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7a70: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
7a80: 7b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  {...slot->protoc
7a90: 6f 6c 20 3d 20 73 65 6c 65 63 74 65 64 5f 70 72  ol = selected_pr
7aa0: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74  otocol;..}...ret
7ab0: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
7ac0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
7ad0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
7ae0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7af0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7b00: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7b10: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
7b20: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7b30: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7b40: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7b50: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7b60: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
7b70: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
7b80: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
7b90: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
7ba0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
7bb0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
7bc0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
7bd0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
7be0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
7bf0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
7c00: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7c10: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7c20: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
7c30: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
7c40: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
7c50: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
7c60: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
7c70: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7c80: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7c90: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
7ca0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7cb0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7cc0: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
7cd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
7ce0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
7cf0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7d00: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
7d10: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
7d20: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
7d30: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
7d40: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7d50: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
7d60: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
7d70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7d80: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
7d90: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
7da0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7db0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7dc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7dd0: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
7de0: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
7df0: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
7e00: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
7e10: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
7e20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7e30: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7e40: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
7e50: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7e60: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
7e70: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7e80: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7e90: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7ea0: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7eb0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7ec0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7ed0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
7ee0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
7ef0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
7f00: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
7f10: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7f20: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7f30: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7f40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7f50: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
7f60: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
7f70: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
7f80: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
7f90: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
7fa0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7fb0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7fc0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
7fd0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
7fe0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7ff0: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8000: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
8010: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8020: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
8030: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8040: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8050: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
8060: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8070: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8080: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8090: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
80a0: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
80b0: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
80c0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
80d0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
80e0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
80f0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8100: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8110: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8120: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
8130: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8140: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
8150: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
8160: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
8170: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
8180: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
8190: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
81a0: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
81b0: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
81c0: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
81d0: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
81e0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
81f0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
8200: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
8210: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
8220: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8230: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
8240: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
8250: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
8260: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
8270: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8280: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8290: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
82a0: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
82b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
82c0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
82d0: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
82e0: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
82f0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8300: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
8310: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
8320: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8330: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
8340: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
8350: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8360: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8370: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8380: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
8390: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
83a0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
83b0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
83c0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
83d0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
83e0: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
83f0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8400: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
8410: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
8420: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
8430: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
8440: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
8450: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
8460: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8470: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8480: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8490: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
84a0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
84b0: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
84c0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
84d0: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
84e0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
84f0: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
8500: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
8510: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 0a  protocol);...}..
8520: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
8530: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
8540: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41  SUCCESS) {....CA
8550: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8560: 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
8570: 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20 72 65   card failed, re
8580: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
8590: 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65 63 74  re (SCardConnect
85a0: 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43  () = %s/%li)", C
85b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
85c0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
85d0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29  (scard_conn_ret)
85e0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 63  , (long) scard_c
85f0: 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 72 65  onn_ret);.....re
8600: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8610: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
8620: 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ....slot->pcsc_c
8630: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
8640: 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  1;...slot->trans
8650: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
8660: 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ;...slot->transa
8670: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8680: 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e  ck = 0;...slot->
8690: 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f  protocol = proto
86a0: 63 6f 6c 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  col;..}...CACKEY
86b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
86c0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
86d0: 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ess");...return(
86e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
86f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
8700: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
8710: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65  ey_ret cackey_be
8720: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
8730: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8740: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
8750: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
8760: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
8770: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
8780: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
8790: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
87a0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
87b0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
87c0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
87d0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
87e0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
87f0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
8800: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
8810: 20 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f    The transactio
8820: 6e 20 73 68 6f 75 6c 64 20 62 65 20 74 65 72 6d  n should be term
8830: 69 6e 61 74 65 64 20 75 73 69 6e 67 20 22 63 61  inated using "ca
8840: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8850: 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61  tion". *. */.sta
8860: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
8870: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
8880: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8890: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
88a0: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
88b0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 3b  cackey_conn_ret;
88c0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
88d0: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
88e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
88f0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63 61 63 6b  alled.");...cack
8900: 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  ey_conn_ret = ca
8910: 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
8920: 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 63 61  d(slot);..if (ca
8930: 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  ckey_conn_ret !=
8940: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
8950: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
8960: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
8970: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
8980: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
8990: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
89a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
89b0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
89c0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  }...slot->transa
89d0: 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b 3b 0a 0a  ction_depth++;..
89e0: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
89f0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 31  action_depth > 1
8a00: 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72 61 6e 73   && !slot->trans
8a10: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8a20: 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ock) {...CACKEY_
8a30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 6c  DEBUG_PRINTF("Al
8a40: 72 65 61 64 79 20 69 6e 20 61 20 74 72 61 6e 73  ready in a trans
8a50: 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f 72 6d 69  action, performi
8a60: 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20 28 6e 65  ng no action (ne
8a70: 77 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  w depth = %i)", 
8a80: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8a90: 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74  n_depth);....ret
8aa0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8ab0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  S_OK);..}...slot
8ac0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
8ad0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
8ae0: 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  ..scard_trans_re
8af0: 74 20 3d 20 53 43 61 72 64 42 65 67 69 6e 54 72  t = SCardBeginTr
8b00: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
8b10: 70 63 73 63 5f 63 61 72 64 29 3b 0a 09 69 66 20  pcsc_card);..if 
8b20: 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74  (scard_trans_ret
8b30: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
8b40: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
8b50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
8b60: 61 62 6c 65 20 74 6f 20 62 65 67 69 6e 20 74 72  able to begin tr
8b70: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
8b80: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8b90: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ba0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8bb0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
8bc0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
8bd0: 65 73 73 66 75 6c 6c 79 20 62 65 67 61 6e 20 74  essfully began t
8be0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73 6c  ransaction on sl
8bf0: 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d 3e  ot (%s)", slot->
8c00: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
8c10: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8c20: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
8c30: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
8c40: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
8c50: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8c60: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8c70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
8c80: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8c90: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8ca0: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8cb0: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8cc0: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8cd0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
8ce0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8cf0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
8d00: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
8d10: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
8d20: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
8d30: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
8d40: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
8d50: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 22 63  tion requires "c
8d60: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
8d70: 73 61 63 74 69 6f 6e 22 20 74 6f 20 62 65 20 63  saction" to be c
8d80: 61 6c 6c 65 64 20 66 69 72 73 74 0a 20 2a 0a 20  alled first. *. 
8d90: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
8da0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
8db0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8dc0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8dd0: 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  slot) {..LONG sc
8de0: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a  ard_trans_ret;..
8df0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8e00: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
8e10: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 70 63  ...if (!slot->pc
8e20: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
8e30: 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
8e40: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64  BUG_PRINTF("Card
8e50: 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65 63 74 65   is not connecte
8e60: 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20 65 6e 64  d, unable to end
8e70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
8e80: 63 61 72 64 22 29 3b 0a 0a 09 09 69 66 20 28 73  card");....if (s
8e90: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8ea0: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
8eb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8ec0: 49 4e 54 46 28 22 44 65 63 72 65 61 73 69 6e 67  INTF("Decreasing
8ed0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 65 70   transaction dep
8ee0: 74 68 20 61 6e 64 20 61 73 6b 69 6e 67 20 66 6f  th and asking fo
8ef0: 72 20 61 20 68 61 72 64 77 61 72 65 20 6c 6f 63  r a hardware loc
8f00: 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 62 65  k on the next be
8f10: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
8f20: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d  (current depth =
8f30: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
8f40: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
8f50: 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
8f60: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
8f70: 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
8f80: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8f90: 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c 6f 74 2d  > 0) {.....slot-
8fa0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
8fb0: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
8fc0: 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
8fd0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8fe0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 69  GENERIC);..}...i
8ff0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
9000: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d 20 30 29  tion_depth == 0)
9010: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
9020: 47 5f 50 52 49 4e 54 46 28 22 54 65 72 6d 69 6e  G_PRINTF("Termin
9030: 61 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  ating a transact
9040: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
9050: 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09 09 72 65   begun!");....re
9060: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9070: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
9080: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
9090: 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 69  ion_depth--;...i
90a0: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
90b0: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
90c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
90d0: 5f 50 52 49 4e 54 46 28 22 54 72 61 6e 73 61 63  _PRINTF("Transac
90e0: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69 6e 20 70  tions still in p
90f0: 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20 74 65 72  rogress, not ter
9100: 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63 61 72 64  minating on-card
9110: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75   Transaction (cu
9120: 72 72 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69  rrent depth = %i
9130: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
9140: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
9150: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9160: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
9170: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20  scard_trans_ret 
9180: 3d 20 53 43 61 72 64 45 6e 64 54 72 61 6e 73 61  = SCardEndTransa
9190: 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63  ction(slot->pcsc
91a0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
91b0: 56 45 5f 43 41 52 44 29 3b 0a 09 69 66 20 28 73  VE_CARD);..if (s
91c0: 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 21  card_trans_ret !
91d0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
91e0: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
91f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
9200: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61  le to end transa
9210: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
9220: 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09   in error");....
9230: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9240: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
9250: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
9260: 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66  _PRINTF("Sucessf
9270: 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74 65 64 20  ully terminated 
9280: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 73  transaction on s
9290: 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f 74 2d  lot (%s)", slot-
92a0: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  >pcsc_reader);..
92b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
92c0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
92d0: 20 41 50 44 55 20 52 65 6c 61 74 65 64 20 46 75   APDU Related Fu
92e0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
92f0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
9300: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9310: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
9320: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9330: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9340: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
9350: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9360: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
9370: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
9380: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
9390: 6e 65 64 20 63 68 61 72 20 6c 63 2c 20 75 6e 73  ned char lc, uns
93a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
93b0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
93c0: 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65  le, uint16_t *re
93d0: 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64  spcode, unsigned
93e0: 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c   char *respdata,
93f0: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
9400: 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52  a_len);. *. * AR
9410: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
9420: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
9430: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
9440: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
9450: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
9460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
9470: 73 73 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  ss. *         AP
9480: 44 55 20 43 6c 61 73 73 20 28 47 53 43 49 53 5f  DU Class (GSCIS_
9490: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 6f 72  CLASS_ISO7816 or
94a0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
94b0: 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a 20 2a 20  BAL_PLATFORM. * 
94c0: 20 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 29          usually)
94d0: 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a 20 20 20  , (CLA). *. *   
94e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
94f0: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 2a 20 20  instruction. *  
9500: 20 20 20 20 20 20 20 41 50 44 55 20 49 6e 73 74         APDU Inst
9510: 72 75 63 74 69 6f 6e 20 28 49 4e 53 29 0a 20 2a  ruction (INS). *
9520: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9530: 20 63 68 61 72 20 70 31 0a 20 2a 20 20 20 20 20   char p1. *     
9540: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
9550: 65 72 20 31 20 28 50 31 29 0a 20 2a 0a 20 2a 20  er 1 (P1). *. * 
9560: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9570: 72 20 70 32 0a 20 2a 20 20 20 20 20 20 20 20 20  r p2. *         
9580: 41 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 32  APDU Parameter 2
9590: 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20 20 20 20   (P2). *. *     
95a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
95b0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
95c0: 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f 6e 74 65   Length of Conte
95d0: 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68 69 73 20  nt (Lc) -- this 
95e0: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  is the length of
95f0: 20 22 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20   "data". *      
9600: 20 20 20 70 61 72 61 6d 65 74 65 72 2e 20 20 49     parameter.  I
9610: 66 20 22 64 61 74 61 22 20 69 73 20 73 70 65 63  f "data" is spec
9620: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
9630: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 77 69  his parameter wi
9640: 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65  ll. *         be
9650: 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20   ignored.. *. * 
9660: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9670: 72 20 2a 64 61 74 61 0a 20 2a 20 20 20 20 20 20  r *data. *      
9680: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75     Pointer to bu
9690: 66 66 65 72 20 74 6f 20 73 65 6e 64 2e 20 20 49  ffer to send.  I
96a0: 74 20 73 68 6f 75 6c 64 20 62 65 20 22 4c 63 22  t should be "Lc"
96b0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20 20 49 66   bytes long.  If
96c0: 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63  . *         spec
96d0: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 22  ified as NULL, "
96e0: 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  Lc" will not be 
96f0: 73 65 6e 74 2c 20 61 6e 64 20 74 68 69 73 20 62  sent, and this b
9700: 75 66 66 65 72 20 77 69 6c 6c 20 62 65 0a 20 2a  uffer will be. *
9710: 20 20 20 20 20 20 20 20 20 69 67 6e 6f 72 65 64           ignored
9720: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
9730: 67 6e 65 64 20 63 68 61 72 20 6c 65 0a 20 2a 20  gned char le. * 
9740: 20 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e          APDU Len
9750: 67 74 68 20 6f 66 20 45 78 70 65 63 74 61 74 69  gth of Expectati
9760: 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68 69 73 20  on (Le) -- this 
9770: 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  is the length of
9780: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20   the. *         
9790: 65 78 70 65 63 74 65 64 20 72 65 70 6c 79 2e 20  expected reply. 
97a0: 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63   If this is spec
97b0: 69 66 69 65 64 20 61 73 20 30 20 74 68 65 6e 20  ified as 0 then 
97c0: 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20 2a 20 20  it will not. *  
97d0: 20 20 20 20 20 20 20 62 65 20 73 65 6e 74 2e 0a         be sent..
97e0: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36   *. *     uint16
97f0: 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a 20 2a 20  _t *respcode. * 
9800: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
9810: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
9820: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
9830: 65 20 63 6f 64 65 2e 20 20 49 66 20 74 68 69 73  e code.  If this
9840: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
9850: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9860: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 63  , the response c
9870: 6f 64 65 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ode will be disc
9880: 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  arded.. *. *    
9890: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
98a0: 72 65 73 70 64 61 74 61 0a 20 2a 20 20 20 20 20  respdata. *     
98b0: 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65      [OUT] Pointe
98c0: 72 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20  r to storage of 
98d0: 41 50 44 55 20 72 65 73 70 6f 6e 73 65 20 64 61  APDU response da
98e0: 74 61 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a  ta.  If this is.
98f0: 20 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69   *         speci
9900: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9910: 65 20 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20  e response data 
9920: 77 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65  will be discarde
9930: 64 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  d.  If. *       
9940: 20 20 74 68 65 20 22 72 65 73 70 64 61 74 61 5f    the "respdata_
9950: 6c 65 6e 22 20 70 61 72 61 6d 65 74 65 72 20 69  len" parameter i
9960: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
9970: 55 4c 4c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ULL, this buffer
9980: 0a 20 2a 20 20 20 20 20 20 20 20 20 77 69 6c 6c  . *         will
9990: 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64 2e   not be updated.
99a0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
99b0: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 0a  t *respdata_len.
99c0: 20 2a 20 20 20 20 20 20 20 20 20 5b 49 4e 2c 20   *         [IN, 
99d0: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 69 6e 69  OUT] Pointer ini
99e0: 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61 69 6e 69  tialing containi
99f0: 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ng the size of t
9a00: 68 65 20 22 72 65 73 70 64 61 74 61 22 0a 20 2a  he "respdata". *
9a10: 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 2e           buffer.
9a20: 20 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69    Before returni
9a30: 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74 65 64 20  ng, the pointed 
9a40: 74 6f 20 76 61 6c 75 65 20 69 73 20 75 70 64 61  to value is upda
9a50: 74 65 64 20 74 6f 20 74 68 65 0a 20 2a 20 20 20  ted to the. *   
9a60: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
9a70: 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f  bytes written to
9a80: 20 74 68 65 20 62 75 66 66 65 72 2e 20 20 49 66   the buffer.  If
9a90: 20 74 68 69 73 20 69 73 20 73 70 65 63 69 66 69   this is specifi
9aa0: 65 64 20 61 73 0a 20 2a 20 20 20 20 20 20 20 20  ed as. *        
9ab0: 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c 6c 20 6e   NULL, it will n
9ac0: 6f 74 20 62 65 20 75 70 64 61 74 65 64 2c 20 61  ot be updated, a
9ad0: 6e 64 20 22 72 65 73 70 64 61 74 61 22 20 77 69  nd "respdata" wi
9ae0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 63 61  ll be ignored ca
9af0: 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 20 20 20  using. *        
9b00: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61   the response da
9b10: 74 61 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  ta to be discard
9b20: 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ed.. *. * RETURN
9b30: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
9b40: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
9b50: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
9b60: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
9b70: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
9b80: 20 20 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20        On error. 
9b90: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9ba0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
9bb0: 20 49 66 20 74 68 65 20 73 65 6e 64 69 6e 67 20   If the sending 
9bc0: 66 61 69 6c 65 64 20 62 65 63 61 75 73 65 20 74  failed because t
9bd0: 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20 2a 20 20  he token is. *  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62                ab
9c00: 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  sent. *. * NOTES
9c10: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
9c20: 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 6e 65  ction will conne
9c30: 63 74 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ct to the PC/SC 
9c40: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
9c50: 65 72 20 76 69 61 0a 20 2a 20 20 20 20 20 63 61  er via. *     ca
9c60: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
9c70: 74 28 29 20 69 66 20 6e 65 65 64 65 64 2e 0a 20  t() if needed.. 
9c80: 2a 0a 20 2a 20 20 20 20 20 49 74 20 77 69 6c 6c  *. *     It will
9c90: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9ca0: 63 61 72 64 20 69 6e 20 74 68 65 20 72 65 61 64  card in the read
9cb0: 65 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  er attached to t
9cc0: 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20 20 20 73  he slot. *     s
9cd0: 70 65 63 69 66 69 65 64 2e 20 20 49 74 20 77 69  pecified.  It wi
9ce0: 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20  ll reconnect to 
9cf0: 74 68 65 20 63 61 72 64 20 69 66 20 74 68 65 20  the card if the 
9d00: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 20 20 20  connection. *   
9d10: 20 20 67 6f 65 73 20 61 77 61 79 2e 0a 20 2a 0a    goes away.. *.
9d20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
9d30: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
9d40: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
9d50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9d60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9d70: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9d80: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
9d90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9da0: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
9db0: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e   p2, unsigned in
9dc0: 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  t lc, unsigned c
9dd0: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
9de0: 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75 69 6e 74  ned int le, uint
9df0: 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20  16_t *respcode, 
9e00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72  unsigned char *r
9e10: 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20  espdata, size_t 
9e20: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  *respdata_len) {
9e30: 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a 6f 72 5f  ..uint8_t major_
9e40: 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 73  rc, minor_rc;..s
9e50: 69 7a 65 5f 74 20 62 79 74 65 73 5f 74 6f 5f 63  ize_t bytes_to_c
9e60: 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70 64 61 74  opy, tmp_respdat
9e70: 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43 41 52 44  a_len;..LPCSCARD
9e80: 5f 49 4f 5f 52 45 51 55 45 53 54 20 70 69 6f 53  _IO_REQUEST pioS
9e90: 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52 44 20 78  endPci;..DWORD x
9ea0: 6d 69 74 5f 6c 65 6e 2c 20 72 65 63 76 5f 6c 65  mit_len, recv_le
9eb0: 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 78  n;..LONG scard_x
9ec0: 6d 69 74 5f 72 65 74 2c 20 73 63 61 72 64 5f 72  mit_ret, scard_r
9ed0: 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09 42 59 54 45  econn_ret;..BYTE
9ee0: 20 78 6d 69 74 5f 62 75 66 5b 31 30 32 34 5d 2c   xmit_buf[1024],
9ef0: 20 72 65 63 76 5f 62 75 66 5b 31 30 32 34 5d 3b   recv_buf[1024];
9f00: 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65  ..int pcsc_conne
9f10: 63 74 5f 72 65 74 2c 20 70 63 73 63 5f 67 65 74  ct_ret, pcsc_get
9f20: 72 65 73 70 5f 72 65 74 3b 0a 09 69 6e 74 20 69  resp_ret;..int i
9f30: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
9f40: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
9f50: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
9f60: 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
9f70: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
9f80: 6c 69 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69  lid slot specifi
9f90: 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
9fa0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9fb0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63  ENERIC);..}...pc
9fc0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
9fd0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
9fe0: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
9ff0: 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
a000: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
a010: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
a020: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a030: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
a040: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
a050: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
a060: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
a070: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a080: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  IC);..}.../* Det
a090: 65 72 6d 69 6e 65 20 77 68 69 63 68 20 70 72 6f  ermine which pro
a0a0: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 75 73  tocol to send us
a0b0: 69 6e 67 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ing */..switch (
a0c0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20  slot->protocol) 
a0d0: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  {...case SCARD_P
a0e0: 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 43  ROTOCOL_T0:....C
a0f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a100: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a110: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a120: 20 54 3d 30 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=0");.....pioS
a130: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a140: 43 49 5f 54 30 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T0;.....break
a150: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ;...case SCARD_P
a160: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 43  ROTOCOL_T1:....C
a170: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a180: 54 46 28 22 50 72 6f 74 6f 63 6f 6c 20 74 6f 20  TF("Protocol to 
a190: 73 65 6e 64 20 64 61 74 61 67 72 61 6d 20 69 73  send datagram is
a1a0: 20 54 3d 31 22 29 3b 0a 0a 09 09 09 70 69 6f 53   T=1");.....pioS
a1b0: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a1c0: 43 49 5f 54 31 3b 0a 0a 09 09 09 62 72 65 61 6b  CI_T1;.....break
a1d0: 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ;...default:....
a1e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a1f0: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f  NTF("Invalid pro
a200: 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 61 62 6f  tocol found, abo
a210: 72 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 72 65  rting.");.....re
a220: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a230: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a240: 0a 09 2f 2a 20 54 72 61 6e 73 6d 69 74 20 2a 2f  ../* Transmit */
a250: 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a  ..xmit_len = 0;.
a260: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a270: 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73 73 3b 0a 09  en++] = class;..
a280: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a290: 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72 75 63 74 69  n++] = instructi
a2a0: 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  on;..xmit_buf[xm
a2b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a  it_len++] = p1;.
a2c0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a2d0: 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a 09 69 66 20  en++] = p2;..if 
a2e0: 28 64 61 74 61 29 20 7b 0a 09 09 69 66 20 28 6c  (data) {...if (l
a2f0: 63 20 3e 20 32 35 35 29 20 7b 0a 09 09 09 43 41  c > 255) {....CA
a300: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a310: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
a320: 6e 67 20 61 6e 20 4c 63 20 67 72 65 61 74 65 72  ng an Lc greater
a330: 20 74 68 61 6e 20 32 35 35 20 69 73 20 75 6e 74   than 255 is unt
a340: 65 73 74 65 64 2e 20 20 4c 63 20 3d 20 25 75 22  ested.  Lc = %u"
a350: 2c 20 6c 63 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , lc);.....xmit_
a360: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a370: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
a380: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
a390: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a3a0: 2b 5d 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30  +] = (lc & 0xff0
a3b0: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
a3c0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a3d0: 20 3d 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09   = lc & 0xff;...
a3e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a3f0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a400: 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72   = lc;...}...for
a410: 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
a420: 20 6c 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09   lc; idx++) {...
a430: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a440: 65 6e 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78  en++] = data[idx
a450: 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  ];...}..}...if (
a460: 6c 65 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  le != 0x00) {...
a470: 69 66 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a  if (le > 256) {.
a480: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a490: 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21  PRINTF("CAUTION!
a4a0: 20 20 55 73 69 6e 67 20 61 6e 20 4c 65 20 67 72    Using an Le gr
a4b0: 65 61 74 65 72 20 74 68 61 6e 20 32 35 36 20 69  eater than 256 i
a4c0: 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 65 20  s untested.  Le 
a4d0: 3d 20 25 75 22 2c 20 6c 65 29 3b 0a 0a 09 09 09  = %u", le);.....
a4e0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a4f0: 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20  n++] = 0x82; /* 
a500: 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a  XXX UNTESTED */.
a510: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a520: 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26 20  _len++] = (le & 
a530: 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
a540: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a550: 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78 66  en++] = le & 0xf
a560: 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28  f;...} else if (
a570: 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09 09  le == 256) {....
a580: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a590: 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09 7d  n++] = 0x00;...}
a5a0: 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f   else {....xmit_
a5b0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a5c0: 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f  = le;...}..}.../
a5d0: 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72  * Begin Smartcar
a5e0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
a5f0: 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
a600: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
a610: 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d 3d  ;...if (class ==
a620: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
a630: 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63 74  7816 && instruct
a640: 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e 53  ion == GSCIS_INS
a650: 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31 20  TR_VERIFY && p1 
a660: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41 43  == 0x00) {...CAC
a670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
a680: 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a 20  ("Sending APDU: 
a690: 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a  <<censored>>");.
a6a0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
a6b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
a6c0: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
a6d0: 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  ", xmit_buf, xmi
a6e0: 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63  t_len);..}...rec
a6f0: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
a700: 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72 64  ecv_buf);..scard
a710: 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72  _xmit_ret = SCar
a720: 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e  dTransmit(slot->
a730: 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65  pcsc_card, pioSe
a740: 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c  ndPci, xmit_buf,
a750: 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c   xmit_len, NULL,
a760: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
a770: 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63 61  _len);...if (sca
a780: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
a790: 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53  CARD_E_NOT_TRANS
a7a0: 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b 45  ACTED) {...CACKE
a7b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a7c0: 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41  Failed to send A
a7d0: 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61  PDU to card (SCa
a7e0: 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25  rdTransmit() = %
a7f0: 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73 6b  s/%lx), will ask
a800: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
a810: 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74 20  n to retry (not 
a820: 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29 2e  resetting card).
a830: 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  ..", CACKEY_DEBU
a840: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
a850: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
a860: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
a870: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
a880: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20 42  it_ret);..../* B
a890: 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54  egin Smartcard T
a8a0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
a8b0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
a8c0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
a8d0: 09 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63  .cackey_reconnec
a8e0: 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 73 6c 6f  t_card(slot, slo
a8f0: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  t->protocol);...
a900: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a910: 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 7d  CSC_E_RETRY);..}
a920: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69  ...if (scard_xmi
a930: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
a940: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
a950: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a960: 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e  F("Failed to sen
a970: 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20 28  d APDU to card (
a980: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20  SCardTransmit() 
a990: 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43 4b  = %s/%lx)", CACK
a9a0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
a9b0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
a9c0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
a9d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
a9e0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
a9f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aa00: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
aa10: 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20 62  slot as having b
aa20: 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 63  een reset");...c
aa30: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
aa40: 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
aa50: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
aa60: 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45  et == SCARD_W_RE
aa70: 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43  SET_CARD) {....C
aa80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
aa90: 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72  TF("Reset requir
aaa0: 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e  ed, please hold.
aab0: 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f  ..");.....scard_
aac0: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63  reconn_ret = cac
aad0: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
aae0: 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50  rd(slot, SCARD_P
aaf0: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
ab00: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b  RD_PROTOCOL_T1);
ab10: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  .....if (scard_r
ab20: 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
ab30: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
ab40: 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74  ....switch (slot
ab50: 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09  ->protocol) {...
ab60: 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
ab70: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09  OTOCOL_T0:......
ab80: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
ab90: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
aba0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
abb0: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
abc0: 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T1:.......pio
abd0: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
abe0: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62  PCI_T1;........b
abf0: 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75  reak;......defau
ac00: 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  lt:.......CACKEY
ac10: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
ac20: 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20  nvalid protocol 
ac30: 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c  found, but too l
ac40: 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  ate to do anythi
ac50: 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20  ng about it now 
ac60: 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79  -- trying anyway
ac70: 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  .");........brea
ac80: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
ac90: 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72   Re-establish tr
aca0: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74  ansaction, if it
acb0: 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a   was present */.
acc0: 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
acd0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
ace0: 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74  > 0) {......slot
acf0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
ad00: 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74  pth--;......slot
ad10: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
ad20: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
ad30: 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69  .....cackey_begi
ad40: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
ad50: 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ot);.....}......
ad60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ad70: 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65  NTF("Reset succe
ad80: 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69  ssful, retransmi
ad90: 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65  tting");......re
ada0: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
adb0: 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73  recv_buf);.....s
adc0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
add0: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
ade0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
adf0: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
ae00: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
ae10: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
ae20: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  recv_len);......
ae30: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
ae40: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
ae50: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41  CCESS) {......CA
ae60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ae70: 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61  F("Retransmit fa
ae80: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
ae90: 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72  in failure after
aea0: 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74   disconnecting t
aeb0: 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72  he card (SCardTr
aec0: 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29  ansmit = %s/%li)
aed0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
aee0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
aef0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
af00: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
af10: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
af20: 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
af30: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
af40: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
af50: 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f  _CARD);......slo
af60: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
af70: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
af80: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
af90: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
afa0: 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  /......slot->tra
afb0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
afc0: 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
afd0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
afe0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74  slot);.......ret
aff0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b000: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
b010: 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
b020: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
b030: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
b040: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
b050: 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f  ......SCardDisco
b060: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c  VE_CARD);.....sl
b090: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b0a0: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b0b0: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b0c0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b0d0: 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  /.....slot->tran
b0e0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
b0f0: 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  1;.....cackey_en
b100: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b110: 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ot);......CACKEY
b120: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b130: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b140: 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72  ure");.....retur
b150: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b160: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
b170: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
b180: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b190: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
b1a0: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
b1b0: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
b1c0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
b1d0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
b1e0: 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73  D);....slot->pcs
b1f0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
b200: 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64   = 0;...../* End
b210: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b220: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f  action */....slo
b230: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b240: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63  epth = 1;....cac
b250: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b260: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43  ion(slot);.....C
b270: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b280: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
b290: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72   failure");....r
b2a0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b2b0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
b2c0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
b2d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
b2e0: 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65  ("Returned Value
b2f0: 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65  :", recv_buf, re
b300: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72  cv_len);...if (r
b310: 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09  ecv_len < 2) {..
b320: 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70  ./* Minimal resp
b330: 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32  onse length is 2
b340: 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e   bytes, returnin
b350: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  g in failure */.
b360: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b370: 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
b380: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
b390: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
b3a0: 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29  (recv_len = %lu)
b3b0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
b3c0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  g) recv_len);...
b3d0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b3e0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b3f0: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b400: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b410: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b420: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b430: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
b440: 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65  mine result code
b450: 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20   */..major_rc = 
b460: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
b470: 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72  n - 2];..minor_r
b480: 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63  c = recv_buf[rec
b490: 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20  v_len - 1];..if 
b4a0: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a  (respcode) {...*
b4b0: 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f  respcode = (majo
b4c0: 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e  r_rc << 8) | min
b4d0: 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41  or_rc;..}.../* A
b4e0: 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75  djust message bu
b4f0: 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65  ffer */..recv_le
b500: 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64  n -= 2;.../* Add
b510: 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e   bytes to return
b520: 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72   value */..tmp_r
b530: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b  espdata_len = 0;
b540: 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26  ..if (respdata &
b550: 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20  & respdata_len) 
b560: 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  {...tmp_respdata
b570: 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61  _len = *respdata
b580: 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74  _len;....bytes_t
b590: 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61  o_copy = *respda
b5a0: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72  ta_len;....if (r
b5b0: 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f  ecv_len < bytes_
b5c0: 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79  to_copy) {....by
b5d0: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65  tes_to_copy = re
b5e0: 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43  cv_len;...}....C
b5f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b600: 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20  TF("Copying %lu 
b610: 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66  bytes to the buf
b620: 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20  fer (recv'd %lu 
b630: 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20  bytes, but only 
b640: 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69  %lu bytes left i
b650: 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20  n our buffer)", 
b660: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b670: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28  bytes_to_copy, (
b680: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
b690: 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e  ecv_len, (unsign
b6a0: 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61  ed long) *respda
b6b0: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63  ta_len);....memc
b6c0: 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63  py(respdata, rec
b6d0: 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f  v_buf, bytes_to_
b6e0: 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74  copy);...respdat
b6f0: 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  a += bytes_to_co
b700: 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61  py;....*respdata
b710: 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f  _len = bytes_to_
b720: 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70  copy;...tmp_resp
b730: 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65  data_len -= byte
b740: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c  s_to_copy;..} el
b750: 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f  se {...if (recv_
b760: 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  len != 0) {....C
b770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b780: 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61  TF("Throwing awa
b790: 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77  y %lu bytes, now
b7a0: 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d  here to put them
b7b0: 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  !", (unsigned lo
b7c0: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  ng) recv_len);..
b7d0: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f  .}..}...if (majo
b7e0: 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a  r_rc == 0x61) {.
b7f0: 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20  ../* We need to 
b800: 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59  READ */...CACKEY
b810: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
b820: 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69  uffer read requi
b830: 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69  red");....if (mi
b840: 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20  nor_rc == 0x00) 
b850: 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  {....minor_rc = 
b860: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
b870: 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74  ...}....pcsc_get
b880: 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65  resp_ret = cacke
b890: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
b8a0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
b8b0: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
b8c0: 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c  TR_GET_RESPONSE,
b8d0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20   0x00, 0x00, 0, 
b8e0: 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20  NULL, minor_rc, 
b8f0: 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61  respcode, respda
b900: 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74  ta, &tmp_respdat
b910: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70  a_len);....if (p
b920: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
b930: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
b940: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
b950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
b960: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
b970: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
b980: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
b990: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b9a0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b9b0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b9c0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b9d0: 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65  .....if (pcsc_ge
b9e0: 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43  tresp_ret == CAC
b9f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
ba00: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ) {.....return(C
ba10: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
ba20: 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  RY);....}.....re
ba30: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
ba40: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
ba50: 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61  ....if (respdata
ba60: 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70  _len) {....*resp
ba70: 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f  data_len += tmp_
ba80: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09  respdata_len;...
ba90: 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  }..../* End Smar
baa0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
bab0: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
bac0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
bad0: 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ot);....CACKEY_D
bae0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
baf0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
bb00: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
bb10: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
bb20: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
bb30: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  _S_OK);..}.../* 
bb40: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
bb50: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
bb60: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
bb70: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66  tion(slot);...if
bb80: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
bb90: 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65  90) {.../* Succe
bba0: 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ss */...CACKEY_D
bbb0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
bbc0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
bbd0: 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78  s (major_rc = 0x
bbe0: 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  90)");....return
bbf0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
bc00: 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  K);..}....CACKEY
bc10: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
bc20: 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20  PDU Returned an 
bc30: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67  error, returning
bc40: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
bc50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
bc60: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
bc70: 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  }..static unsign
bc80: 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f  ed char *cackey_
bc90: 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28  read_bertlv_tag(
bca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bcb0: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62  uffer, size_t *b
bcc0: 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73  uffer_len_p, uns
bcd0: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20  igned char tag, 
bce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
bcf0: 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74  utbuffer, size_t
bd00: 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f   *outbuffer_len_
bd10: 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  p) {..unsigned c
bd20: 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  har *buffer_p;..
bd30: 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72  size_t outbuffer
bd40: 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e  _len, buffer_len
bd50: 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a  ;..size_t size;.
bd60: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
bd70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bd80: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
bd90: 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d   (buffer_len_p =
bda0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
bdb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bdc0: 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  "buffer_len_p is
bdd0: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
bde0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
bdf0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
be00: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
be10: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55  ffer_len_p == NU
be20: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
be30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74  EBUG_PRINTF("out
be40: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20  buffer_len_p is 
be50: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67  NULL.  Returning
be60: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a   in failure.");.
be70: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
be80: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e  ..}...buffer_len
be90: 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65   = *outbuffer_le
bea0: 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f  n_p;..outbuffer_
beb0: 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72  len = *outbuffer
bec0: 5f 6c 65 6e 5f 70 3b 0a 0a 09 62 75 66 66 65 72  _len_p;...buffer
bed0: 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66  _p = buffer;..if
bee0: 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d   (buffer_p[0] !=
bef0: 20 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59   tag) {...CACKEY
bf00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
bf10: 61 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74  ag found was not
bf20: 20 74 61 67 20 65 78 70 65 63 74 65 64 2e 20 20   tag expected.  
bf30: 54 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65  Tag = %02x, Expe
bf40: 63 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65  cted = %02x.  Re
bf50: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
bf60: 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  re.", (unsigned 
bf70: 69 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d  int) buffer_p[0]
bf80: 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72  , tag);....retur
bf90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
bfa0: 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65  ffer_p++;..buffe
bfb0: 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28  r_len--;...if ((
bfc0: 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78  buffer_p[0] & 0x
bfd0: 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09  80) == 0x80) {..
bfe0: 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78  .size = 0;...idx
bff0: 20 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20   = (buffer_p[0] 
c000: 26 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28  & 0x7f);....if (
c010: 69 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e  idx > buffer_len
c020: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
c030: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66  BUG_PRINTF("Malf
c040: 6f 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20  ormed BER value 
c050: 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  -- not enough by
c060: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  tes available to
c070: 20 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64   read length (id
c080: 78 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c  x = %i, buffer_l
c090: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c  en = %lu)", idx,
c0a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c0b0: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
c0c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c0d0: 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64  ..}....for (; id
c0e0: 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a  x > 0; idx--) {.
c0f0: 09 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09  ...buffer_p++;..
c100: 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c110: 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a  ....size <<= 8;.
c120: 09 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65  ...size |= buffe
c130: 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65  r_p[0];...}..} e
c140: 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62  lse {...size = b
c150: 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a  uffer_p[0];..}..
c160: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c170: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c180: 20 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66   (size > outbuff
c190: 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  er_len) {...CACK
c1a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c1b0: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20  "Unable to copy 
c1c0: 76 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20  value buffer to 
c1d0: 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65  outbuffer, not e
c1e0: 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c  nough room.  Val
c1f0: 75 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68  ue buffer length
c200: 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66   = %lu, out buff
c210: 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22  er length = %lu"
c220: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c230: 29 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  ) size, (unsigne
c240: 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65  d long) outbuffe
c250: 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  r_len);....retur
c260: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f  n(NULL);..}...*o
c270: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d  utbuffer_len_p =
c280: 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62   size;..if (outb
c290: 75 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70  uffer) {...memcp
c2a0: 79 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66  y(outbuffer, buf
c2b0: 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09  fer_p, size);...
c2c0: 62 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65  buffer_p += size
c2d0: 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d  ;...buffer_len -
c2e0: 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66  = size;....*buff
c2f0: 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65  er_len_p = buffe
c300: 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59  r_len;....CACKEY
c310: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c320: 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73  "BER-TLV results
c330: 3a 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73  :", outbuffer, s
c340: 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ize);..} else {.
c350: 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72  ..memmove(buffer
c360: 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65  , buffer_p, size
c370: 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20  );...buffer_p = 
c380: 62 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45  buffer;....CACKE
c390: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c3a0: 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74  ("BER-TLV result
c3b0: 73 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a  s:", buffer, siz
c3c0: 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  e);..}...CACKEY_
c3d0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c3e0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c3f0: 73 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e  ss.  Size of con
c400: 74 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30  tents for tag %0
c410: 32 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73  2x is %lu", (uns
c420: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20  igned int) tag, 
c430: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c440: 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  size);...return(
c450: 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a  buffer_p);.}../*
c460: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c470: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
c480: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
c490: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
c4a0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
c4b0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
c4c0: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
c4d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
c4e0: 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  d[3]);. *. * ARG
c4f0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
c500: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c510: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
c520: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
c530: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
c540: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
c550: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
c560: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
c570: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
c580: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20  e_t buffer_len. 
c590: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
c5a0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
c5b0: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
c5c0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
c5d0: 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20  char oid[3]. *  
c5e0: 20 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49         3-byte OI
c5f0: 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a  D to read. *. *.
c600: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
c610: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
c620: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
c630: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c640: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
c650: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
c660: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
c670: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
c680: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
c690: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74  ckey_get_data(st
c6a0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c6b0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
c6c0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
c6d0: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
c6e0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c6f0: 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67  oid[3]) {..unsig
c700: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d  ned char cmd[] =
c710: 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78   {0x5C, 0x03, 0x
c720: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
c730: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c740: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
c750: 5f 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c  _t init_buffer_l
c760: 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31  en, size;..uint1
c770: 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69  6_t respcode;..i
c780: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
c790: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c7a0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
c7b0: 09 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e  .init_buffer_len
c7c0: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c7d0: 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d  .cmd[2] = oid[0]
c7e0: 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b  ;..cmd[3] = oid[
c7f0: 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69  1];..cmd[4] = oi
c800: 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74  d[2];.../* 256 t
c810: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c  o indicate the l
c820: 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73  argest message s
c830: 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72  ize -- not clear
c840: 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f   if this will wo
c850: 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73  rk with all mess
c860: 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  ages */..send_re
c870: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
c880: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
c890: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
c8a0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
c8b0: 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30  NSTR_GET_DATA, 0
c8c0: 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f  x3F, 0xFF, sizeo
c8d0: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36  f(cmd), cmd, 256
c8e0: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
c8f0: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
c900: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
c910: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
c920: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
c930: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c940: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
c950: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
c960: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
c970: 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
c980: 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20  _get_data(slot, 
c990: 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66  buffer, init_buf
c9a0: 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a  fer_len, oid));.
c9b0: 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  .}...if (send_re
c9c0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
c9d0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
c9e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c9f0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
ca00: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
ca10: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ca20: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
ca30: 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
ca40: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
ca50: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
ca60: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66  ZE_MAX..if (buff
ca70: 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  er_len > _POSIX_
ca80: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
ca90: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
caa0: 54 46 28 22 52 65 61 64 20 62 79 74 65 73 20 28  TF("Read bytes (
cab0: 62 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65  buffer_len) exce
cac0: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
cad0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
cae0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
caf0: 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20  %li, buffer_len 
cb00: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
cb10: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
cb20: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
cb30: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
cb40: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
cb50: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
cb60: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  ...if (buffer_le
cb70: 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45  n < 2) {...CACKE
cb80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cb90: 41 50 44 55 20 47 45 54 20 44 41 54 41 20 72 65  APDU GET DATA re
cba0: 74 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73  turned %lu bytes
cbb0: 2c 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  , which is too s
cbc0: 68 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54  hort for a BER-T
cbd0: 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75  LV response", (u
cbe0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
cbf0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
cc00: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73  turn(-1);..}...s
cc10: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  ize = buffer_len
cc20: 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61  ;..buffer_p = ca
cc30: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
cc40: 5f 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75  _tag(buffer, &bu
cc50: 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20  ffer_len, 0x53, 
cc60: 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09  NULL, &size);...
cc70: 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20  if (buffer_p == 
cc80: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
cc90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
cca0: 61 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c  ag decoding fail
ccb0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
ccc0: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65   error.");....re
ccd0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43  turn(-1);..}...C
cce0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ccf0: 54 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72  TBUF("GET DATA r
cd00: 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20  esult", buffer, 
cd10: 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  size);...CACKEY_
cd20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
cd30: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
cd40: 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74  ss, read %lu byt
cd50: 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  es", (unsigned l
cd60: 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65  ong) size);...re
cd70: 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  turn(size);.}../
cd80: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
cd90: 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63       ssize_t cac
cda0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
cdb0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
cdc0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
cdd0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
cde0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
cdf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
ce00: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
ce10: 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a  ial_offset);. *.
ce20: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
ce30: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
ce40: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
ce50: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
ce60: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
ce70: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
ce80: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
ce90: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
cea0: 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20  ] Buffer. *. *  
ceb0: 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a     size_t count.
cec0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
ced0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74  r of bytes to at
cee0: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a  tempt to read. *
cef0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
cf00: 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20   char t_or_v. * 
cf10: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74          Select t
cf20: 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29  he T-buffer (01)
cf30: 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32   or V-buffer (02
cf40: 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20  ) to read from. 
cf50: 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65   . *. *     size
cf60: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
cf70: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65  t. *         Spe
cf80: 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20  cify the offset 
cf90: 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61  to begin the rea
cfa0: 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20  d from. *. *. * 
cfb0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
cfc0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
cfd0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
cfe0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
cff0: 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20  tually read, or 
d000: 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  -1 on error.. *.
d010: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
d020: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
d030: 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
d040: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
d050: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d060: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d070: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
d080: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
d090: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
d0a0: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
d0b0: 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73  l_offset) {..uns
d0c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74  igned char *init
d0d0: 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74  _buffer;..size_t
d0e0: 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69   init_count;..si
d0f0: 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61  ze_t init_initia
d100: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65  l_offset;...size
d110: 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d  _t offset = 0, m
d120: 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63  ax_offset, max_c
d130: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
d140: 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69  char cmd[2];..ui
d150: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
d160: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d170: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d180: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d190: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20  ;...init_buffer 
d1a0: 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f  = buffer;..init_
d1b0: 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  count = count;..
d1c0: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
d1d0: 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66  set = initial_of
d1e0: 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73  fset;...max_offs
d1f0: 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78  et = count;..max
d200: 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f  _count = CACKEY_
d210: 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28  APDU_MTU;...if (
d220: 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74  t_or_v != 1 && t
d230: 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09  _or_v != 2) {...
d240: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d250: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f  NTF("Invalid T o
d260: 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70  r V parameter sp
d270: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
d280: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d290: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d2a0: 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f  .}...cmd[0] = t_
d2b0: 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31  or_v;...while (1
d2c0: 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74  ) {...if (offset
d2d0: 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20   >= max_offset) 
d2e0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d2f0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
d300: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
d310: 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f  rning what we go
d320: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61  t...");.....brea
d330: 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20  k;...}....count 
d340: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f  = max_offset - o
d350: 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75  ffset;...if (cou
d360: 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20  nt > max_count) 
d370: 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  {....count = max
d380: 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63  _count;...}....c
d390: 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a  md[1] = count;..
d3a0: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d3b0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d3c0: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d3d0: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
d3e0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41   GSCIS_INSTR_REA
d3f0: 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74  D_BUFFER, ((init
d400: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d410: 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66  set) >> 8) & 0xf
d420: 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  f, (initial_offs
d430: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30  et + offset) & 0
d440: 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xff, sizeof(cmd)
d450: 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65  , cmd, 0x00, &re
d460: 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b  spcode, buffer +
d470: 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29   offset, &count)
d480: 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  ;....if (send_re
d490: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
d4a0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43  _E_RETRY) {....C
d4b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d4c0: 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
d4d0: 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e   failed, retryin
d4e0: 67 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b  g read buffer");
d4f0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
d500: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
d510: 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72  lot, init_buffer
d520: 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f  , init_count, t_
d530: 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69  or_v, init_initi
d540: 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d  al_offset));...}
d550: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
d560: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
d570: 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72  S_OK) {....if (r
d580: 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  espcode == 0x6A8
d590: 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78  6) {.....if (max
d5a0: 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09  _count == 1) {..
d5b0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
d5c0: 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20  ......max_count 
d5d0: 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b  = max_count / 2;
d5e0: 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
d5f0: 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
d600: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
d610: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
d620: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
d630: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d640: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
d650: 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b  ...}....offset +
d660: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28  = count;....if (
d670: 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e  count < max_coun
d680: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
d690: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f  EBUG_PRINTF("Sho
d6a0: 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74  rt read -- count
d6b0: 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20   = %i, cmd[1] = 
d6c0: 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74  %i", (int) count
d6d0: 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b  , (int) cmd[1]);
d6e0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
d6f0: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
d700: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
d710: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
d720: 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74  _MAX..if (offset
d730: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
d740: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
d750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
d760: 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  fset exceeds max
d770: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
d780: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d790: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66  . (max = %li, of
d7a0: 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  fset = %lu)", (l
d7b0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
d7c0: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
d7d0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
d7e0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d7f0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
d800: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
d810: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
d820: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
d830: 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20  ead %lu bytes", 
d840: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d850: 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72  offset);...retur
d860: 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  n(offset);.}../*
d870: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d880: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
d890: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
d8a0: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
d8b0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
d8d0: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
d8e0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
d8f0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
d900: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d910: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
d920: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
d930: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
d940: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d950: 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42  aid. *         B
d960: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
d970: 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65   Applet ID to se
d980: 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73  lect. *. *     s
d990: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a  ize_t aid_len. *
d9a0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
d9b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
d9c0: 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44  "aid" (Applet ID
d9d0: 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20  ) parameter. *. 
d9e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
d9f0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
da00: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
da10: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
da20: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
da30: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
da40: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
da50: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
da60: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
da70: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
da80: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
da90: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
daa0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
dab0: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69   *aid, size_t ai
dac0: 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65  d_len) {..int se
dad0: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
dae0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
daf0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
db00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
db10: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
db20: 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f  let:", aid, aid_
db30: 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74  len);...send_ret
db40: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
db50: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
db60: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
db70: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
db80: 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53  T, GSCIS_PARAM_S
db90: 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78  ELECT_APPLET, 0x
dba0: 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64  00, aid_len, aid
dbb0: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
dbc0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  LL, NULL);...if 
dbd0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
dbe0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
dbf0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
dc00: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
dc10: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
dc20: 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20  retrying select 
dc30: 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74  applet");....ret
dc40: 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63  urn(cackey_selec
dc50: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61  t_applet(slot, a
dc60: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09  id, aid_len));..
dc70: 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  }...if (send_ret
dc80: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
dc90: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
dca0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
dcb0: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70  ailed to open ap
dcc0: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
dcd0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
dce0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
dcf0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
dd00: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
dd10: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
dd20: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
dd30: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
dd40: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
dd50: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
dd60: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
dd70: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
dd80: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
dd90: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
dda0: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
ddb0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
ddc0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
ddd0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
dde0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
ddf0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
de00: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
de10: 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20   uint16_t ef. * 
de20: 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61          Elementa
de30: 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74  l File to select
de40: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
de50: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
de60: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
de70: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
de80: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
de90: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
dea0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
deb0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
dec0: 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65  selects an Eleme
ded0: 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20  ntary File (EF) 
dee0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e  under the curren
def0: 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20  tly selected. * 
df00: 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69      Dedicated Fi
df10: 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20  le (DF). *. *   
df20: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73    Typically this
df30: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
df40: 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63   selecting the c
df50: 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75  orrect Applet (u
df60: 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b  sing. *     cack
df70: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
df80: 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20  ) for VM cards. 
df90: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
dfa0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
dfb0: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
dfc0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
dfd0: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
dfe0: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
dff0: 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09  ar fid_buf[2];..
e000: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
e010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e020: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
e030: 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c  ../* Open the el
e040: 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f  ementary file */
e050: 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28  ..fid_buf[0] = (
e060: 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  ef >> 8) & 0xff;
e070: 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65  ..fid_buf[1] = e
e080: 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  f & 0xff;...CACK
e090: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e0a0: 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a  "Selecting file:
e0b0: 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e   %04lx", (unsign
e0c0: 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09  ed long) ef);...
e0d0: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
e0e0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
e0f0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
e100: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
e110: 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c  TR_SELECT, 0x02,
e120: 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69   0x0C, sizeof(fi
e130: 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c  d_buf), fid_buf,
e140: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
e150: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
e160: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
e170: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
e180: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e190: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
e1a0: 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72  open file, retur
e1b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e1c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
e1d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
e1e0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
e1f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
e200: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65  uccessfully sele
e210: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72  cted file");...r
e220: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e230: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
e240: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e250: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72    void cackey_fr
e260: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
e270: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e280: 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *root);. *. * AR
e290: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
e2a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e2b0: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a  _entity *root. *
e2c0: 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66           Root of
e2d0: 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f   the TLV list to
e2e0: 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20   start freeing. 
e2f0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
e300: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
e310: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
e330: 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e  rees the TLV lin
e340: 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72  ked listed retur
e350: 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20  ned from. *     
e360: 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  "cackey_read_tlv
e370: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
e380: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
e390: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
e3a0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
e3b0: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  oot) {..struct c
e3c0: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e3d0: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a   *curr, *next;..
e3e0: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c  .if (root == NUL
e3f0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
e400: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20  }...for (curr = 
e410: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72  root; curr; curr
e420: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78   = next) {...nex
e430: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b  t = curr->_next;
e440: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
e450: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65  ->tag) {....case
e460: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
e470: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53  ABLE:....case GS
e480: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
e490: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72  ATE:.....if (cur
e4a0: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09  r->value) {.....
e4b0: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75  .free(curr->valu
e4c0: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  e);.....}.....br
e4d0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
e4e0: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
e4f0: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
e500: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09  lue_cardurl) {..
e510: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
e520: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09  alue_cardurl);..
e530: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
e540: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72  ..}....free(curr
e550: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
e560: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
e570: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e580: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
e590: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
e5a0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e5b0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
e5c0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e5d0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
e5e0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e5f0: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
e600: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
e610: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
e620: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
e630: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
e640: 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d  _entity, *root =
e650: 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e   NULL, *last = N
e660: 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ULL;..unsigned c
e670: 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c  har tlen_buf[2],
e680: 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c   tval_buf[1024],
e690: 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65   *tval;..unsigne
e6a0: 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b  d char vlen_buf[
e6b0: 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39  2], vval_buf[819
e6c0: 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69  2], *vval;..unsi
e6d0: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75  gned char *tmpbu
e6e0: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
e6f0: 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73  g tmpbuflen;..ss
e700: 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e  ize_t tlen, vlen
e710: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ;..ssize_t read_
e720: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66  ret;..size_t off
e730: 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65  set_t = 0, offse
e740: 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e  t_v = 0;..unsign
e750: 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69  ed char tag;..si
e760: 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66  ze_t length;.#if
e770: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69  def HAVE_LIBZ..i
e780: 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  nt uncompress_re
e790: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
e7a0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e7b0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65  "Called.");...re
e7c0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
e7d0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
e7e0: 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , tlen_buf, size
e7f0: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c  of(tlen_buf), 1,
e800: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
e810: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
e820: 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(tlen_buf)) {
e830: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e840: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
e850: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
e860: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e870: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
e880: 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f  ...tlen = (tlen_
e890: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74  buf[1] << 8) | t
e8a0: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65  len_buf[0];...re
e8b0: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
e8c0: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
e8d0: 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , vlen_buf, size
e8e0: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c  of(vlen_buf), 2,
e8f0: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
e900: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
e910: 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(vlen_buf)) {
e920: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e930: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
e940: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
e950: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e960: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
e970: 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f  ...vlen = (vlen_
e980: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76  buf[1] << 8) | v
e990: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41  len_buf[0];...CA
e9a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e9b0: 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20  F("Tag Length = 
e9c0: 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74  %lu, Value Lengt
e9d0: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
e9e0: 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20  ned long) tlen, 
e9f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
ea00: 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f  vlen);...offset_
ea10: 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f  t += 2;..offset_
ea20: 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c  v += 2;...if (tl
ea30: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c  en > sizeof(tval
ea40: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
ea50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ea60: 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  Tag length is to
ea70: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
ea80: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
ea90: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
eaa0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20  ;..}...if (vlen 
eab0: 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75  > sizeof(vval_bu
eac0: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
ead0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c  EBUG_PRINTF("Val
eae0: 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ue length is too
eaf0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
eb00: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
eb10: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eb20: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
eb30: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
eb40: 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62  fer(slot, tval_b
eb50: 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66  uf, tlen, 1, off
eb60: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
eb70: 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b  d_ret != tlen) {
eb80: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eb90: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
eba0: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d  o read entire T-
ebb0: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
ebc0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ebd0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ebe0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
ebf0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
ec00: 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62  fer(slot, vval_b
ec10: 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66  uf, vlen, 2, off
ec20: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
ec30: 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b  d_ret != vlen) {
ec40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ec50: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
ec60: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d  o read entire V-
ec70: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
ec80: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ec90: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eca0: 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61  ..}...tval = tva
ecb0: 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76  l_buf;..vval = v
ecc0: 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20  val_buf;..while 
ecd0: 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65  (tlen > 0 && vle
ece0: 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d  n > 0) {...tag =
ecf0: 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b   *tval;...tval++
ed00: 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69  ;...tlen--;....i
ed10: 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66  f (*tval == 0xff
ed20: 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  ) {....length = 
ed30: 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c  (tval[2] << 8) |
ed40: 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61   tval[1];....tva
ed50: 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20  l += 3;....tlen 
ed60: 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  -= 3;...} else {
ed70: 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76  ....length = *tv
ed80: 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09  al;....tval++;..
ed90: 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09  ..tlen--;...}...
eda0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
edb0: 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25  INTF("Tag: %s (%
edc0: 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  02x)", CACKEY_DE
edd0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
ede0: 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67  STR(tag), (unsig
edf0: 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09  ned int) tag);..
ee00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ee10: 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c  INTBUF("Value:",
ee20: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
ee30: 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
ee40: 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20   NULL;...switch 
ee50: 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  (tag) {....case 
ee60: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
ee70: 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  L:.....curr_enti
ee80: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
ee90: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
eea0: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
eeb0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
eec0: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
eed0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  f(*curr_entity->
eee0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b  value_cardurl));
eef0: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ......memcpy(cur
ef00: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
ef10: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76  cardurl->rid, vv
ef20: 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72  al, 5);.....curr
ef30: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
ef40: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
ef50: 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63  = vval[5];.....c
ef60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ef70: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
ef80: 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c  tid = (vval[6] <
ef90: 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a  < 8) | vval[7];.
efa0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
efb0: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
efc0: 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d  appid = (vval[8]
efd0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d   << 8) | vval[9]
efe0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
eff0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
f000: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f010: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f020: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f030: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
f040: 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f  TABLE:.....curr_
f050: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
f060: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
f070: 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75  ity));.....tmpbu
f080: 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74  f = malloc(lengt
f090: 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  h);......memcpy(
f0a0: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
f0b0: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72  ngth);......curr
f0c0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
f0d0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
f0e0: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65  ity->length = le
f0f0: 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65  ngth;.....curr_e
f100: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
f110: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
f120: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f130: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f140: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
f150: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
f160: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f170: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f180: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
f190: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ..#ifdef HAVE_LI
f1a0: 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  BZ.....tmpbuflen
f1b0: 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09   = length * 2;..
f1c0: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
f1d0: 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a  oc(tmpbuflen);..
f1e0: 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
f1f0: 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28  et = uncompress(
f200: 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c  tmpbuf, &tmpbufl
f210: 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  en, vval, length
f220: 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  );.....if (uncom
f230: 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f  press_ret != Z_O
f240: 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  K) {......CACKEY
f250: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
f260: 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72  ailed to decompr
f270: 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28  ess, uncompress(
f280: 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d  ) returned %i --
f290: 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69   resorting to di
f2a0: 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f  rect copy", unco
f2b0: 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09  mpress_ret);....
f2c0: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
f2d0: 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63  ength;......memc
f2e0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
f2f0: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a   length);.....}.
f300: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f310: 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
f320: 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
f330: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
f340: 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43  );.#else.....CAC
f350: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f360: 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53  ("Missing ZLIB S
f370: 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72  upport, this cer
f380: 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65  tificate is like
f390: 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b  ly useless...");
f3a0: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
f3b0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65  = length;.....me
f3c0: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
f3d0: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64  l, length);.#end
f3e0: 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  if......curr_ent
f3f0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f400: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f410: 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66  >length = tmpbuf
f420: 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  len;.....curr_en
f430: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
f440: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
f450: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f460: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f470: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f480: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
f490: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f4a0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f4b0: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
f4c0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f4d0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f4e0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
f4f0: 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
f500: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f510: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f520: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
f530: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
f540: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
f550: 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65  h;....if (curr_e
f560: 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntity != NULL) {
f570: 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ....if (root == 
f580: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74  NULL) {.....root
f590: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
f5a0: 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73  ...}.....if (las
f5b0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t != NULL) {....
f5c0: 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63  .last->_next = c
f5d0: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
f5e0: 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72  .....last = curr
f5f0: 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a  _entity;...}..}.
f600: 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a  ..return(root);.
f610: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
f620: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f630: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
f640: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
f650: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
f660: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
f670: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f680: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f690: 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
f6a0: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
f6b0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73  pcsc_identity *s
f6c0: 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75  tart, size_t cou
f6d0: 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61  nt, int free_sta
f6e0: 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64  rt) {..size_t id
f6f0: 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d  x;...if (start =
f700: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
f710: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
f720: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
f730: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
f740: 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  f (start[idx].ce
f750: 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09  rtificate) {....
f760: 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e  free(start[idx].
f770: 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09  certificate);...
f780: 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  }..}...if (free_
f790: 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28  start) {...free(
f7a0: 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  start);..}...ret
f7b0: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  urn;.}..static s
f7c0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f7d0: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  c_identity *cack
f7e0: 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74  ey_copy_certs(st
f7f0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f800: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c  _identity *dest,
f810: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
f820: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
f830: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
f840: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
f850: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
f860: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
f870: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
f880: 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20   (dest == NULL) 
f890: 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f  {...dest = mallo
f8a0: 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20  c(sizeof(*dest) 
f8b0: 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66  * count);..}...f
f8c0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
f8d0: 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   < count; idx++)
f8e0: 20 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69   {...dest[idx].i
f8f0: 64 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69  d_type = start[i
f900: 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09  dx].id_type;....
f910: 73 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78  switch (dest[idx
f920: 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09  ].id_type) {....
f930: 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
f940: 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d  YPE_CAC:.....mem
f950: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  cpy(dest[idx].ca
f960: 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
f970: 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  tart[idx].card.c
f980: 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
f990: 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  f(dest[idx].card
f9a0: 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
f9b0: 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  ...dest[idx].car
f9c0: 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61  d.cac.file = sta
f9d0: 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  rt[idx].card.cac
f9e0: 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b  .file;.....break
f9f0: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
fa00: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
fa10: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
fa20: 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74  .piv.key_id = st
fa30: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  art[idx].card.pi
fa40: 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 6d 65  v.key_id;.....me
fa50: 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63  mcpy(dest[idx].c
fa60: 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73  ard.piv.label, s
fa70: 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  tart[idx].card.p
fa80: 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  iv.label, sizeof
fa90: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
faa0: 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  piv.label));....
fab0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
fac0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
fad0: 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72  ERT_ONLY:.....br
fae0: 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b  eak;...}...dest[
faf0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fb00: 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78  _len = start[idx
fb10: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
fb20: 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b  n;...dest[idx].k
fb30: 65 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69  eysize = start[i
fb40: 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09  dx].keysize;....
fb50: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
fb60: 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64  icate = malloc(d
fb70: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fb80: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d  cate_len);...mem
fb90: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  cpy(dest[idx].ce
fba0: 72 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74  rtificate, start
fbb0: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fbc0: 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  e, dest[idx].cer
fbd0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
fbe0: 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29  }...return(dest)
fbf0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
fc00: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
fc10: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
fc20: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
fc30: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
fc40: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
fc50: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
fc60: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
fc70: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
fc80: 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
fc90: 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75  _read_certs(stru
fca0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
fcb0: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
fcc0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fcd0: 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e  y *certs, unsign
fce0: 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20  ed long *count) 
fcf0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
fd00: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
fd10: 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74  curr_id;..struct
fd20: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
fd30: 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63  ty *ccc_tlv, *cc
fd40: 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76  c_curr, *app_tlv
fd50: 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e  , *app_curr;..un
fd60: 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f  signed char ccc_
fd70: 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41  aid[] = {GSCIS_A
fd80: 49 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64  ID_CCC}, piv_aid
fd90: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
fda0: 37 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09  73_3_PIV_AID};..
fdb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
fdc0: 69 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f  iv_oid, piv_oid_
fdd0: 70 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53  pivauth[] = {NIS
fde0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
fdf0: 50 49 56 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69  PIVAUTH}, piv_oi
fe00: 64 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20  d_signature[] = 
fe10: 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
fe20: 4f 49 44 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20  OID_SIGNATURE}, 
fe30: 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d  piv_oid_keymgt[]
fe40: 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
fe50: 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a  _3_OID_KEYMGT};.
fe60: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
fe70: 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73  urr_aid[7];..uns
fe80: 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65  igned char buffe
fe90: 72 5b 38 31 39 32 5d 2c 20 2a 62 75 66 66 65 72  r[8192], *buffer
fea0: 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  _p;..unsigned lo
feb0: 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
fec0: 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b  char *piv_label;
fed0: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
fee0: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73  nsaction_ret;..s
fef0: 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
ff00: 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
ff10: 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f  len;..int certs_
ff20: 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20  resizable;..int 
ff30: 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74  send_ret, select
ff40: 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b  _ret;..int piv_k
ff50: 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e  ey, piv = 0;..in
ff60: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
ff70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
ff80: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
ff90: 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
ffa0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ffb0: 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
ffc0: 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
ffd0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
ffe0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
fff0: 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d  }...if (certs !=
10000 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a   NULL) {...if (*
10010 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
10020 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10030 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
10040 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
10050 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
10060 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
10070 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10080 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f  ..if (!slot->slo
10090 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20  t_reset) {...if 
100a0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
100b0 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65  rts) {....if (ce
100c0 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
100d0 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
100e0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
100f0 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   * slot->cached_
10100 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  certs_count);...
10110 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
10120 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10130 75 6e 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  unt;....} else {
10140 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
10150 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
10160 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
10170 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
10180 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
10190 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
101a0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
101b0 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
101c0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
101d0 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
101e0 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
101f0 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
10200 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
10210 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10220 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10230 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
10240 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
10250 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
10260 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
10270 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
10280 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
10290 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
102a0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
102b0 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
102c0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
102d0 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
102e0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
102f0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
10300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10310 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10320 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10330 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10340 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10350 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10360 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
10370 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
10380 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
10390 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
103a0 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
103b0 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
103c0 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
103d0 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
103e0 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
103f0 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
10400 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10410 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10420 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10430 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
10440 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
10450 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10460 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
10470 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
10480 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
10490 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
104a0 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
104b0 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
104c0 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
104d0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
104e0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
104f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10500 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
10510 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10520 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10530 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
10540 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
10550 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
10560 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10570 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
10580 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
10590 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
105a0 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
105b0 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
105c0 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
105d0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
105e0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
105f0 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
10600 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
10610 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10620 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10630 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
10640 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
10650 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
10660 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
10670 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
10680 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
10690 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
106a0 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
106b0 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
106c0 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
106d0 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
106e0 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
106f0 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
10700 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
10710 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10720 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10730 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
10740 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
10750 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10760 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
10770 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10780 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
10790 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
107a0 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
107b0 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
107c0 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
107d0 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
107e0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
107f0 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10800 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10810 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10820 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10830 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10840 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10850 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
10860 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
10870 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
10880 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
10890 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
108a0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
108b0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
108c0 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
108d0 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
108e0 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
108f0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10900 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10910 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10920 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10930 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
10940 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10950 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
10960 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10970 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
10980 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10990 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
109a0 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
109b0 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
109c0 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
109d0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
109e0 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
109f0 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10a00 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10a10 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10a20 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10a30 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
10a40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
10a50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10a60 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
10a70 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
10a80 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
10a90 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10aa0 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 09 09 09  y %i", idx);....
10ab0 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63  .free(curr_id->c
10ac0 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09  ertificate);....
10ad0 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09  ..outidx--;.....
10ae0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10af0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
10b00 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
10b10 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65  applets from the
10b20 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09   CCC's TLV */...
10b30 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
10b40 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
10b50 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..../* Look for 
10b60 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
10b70 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
10b80 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72  applets */...for
10b90 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
10ba0 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
10bb0 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
10bc0 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
10bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10be0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
10bf0 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45   %s ... ", CACKE
10c00 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
10c10 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10c20 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20  ->tag));.....if 
10c30 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
10c40 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
10c50 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  URL) {.....CACKE
10c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10c70 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
10c80 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
10c90 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
10ca0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10cb0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
10cc0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10cd0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10ce0 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
10cf0 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
10d00 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
10d10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10d20 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10d30 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10d40 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50  nly care about P
10d50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73  KI applets, this
10d60 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73   applet supports
10d70 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43  : %s/%02x)", CAC
10d80 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
10d90 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63  PPTYPE_TO_STR(cc
10da0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10db0 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c  rdurl->apptype),
10dc0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
10dd0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10de0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10df0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10e00 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
10e10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
10e20 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
10e30 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10e40 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
10e50 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10e60 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
10e70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10e80 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
10e90 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
10ea0 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
10eb0 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10ec0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
10ed0 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
10ee0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
10ef0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10f00 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43  ->appid);....CAC
10f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10f20 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
10f30 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
10f40 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
10f50 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
10f60 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10f70 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
10f80 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
10f90 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10fa0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
10fb0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
10fc0 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  id, ccc_curr->va
10fd0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
10fe0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
10ff0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11000 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72  ->rid));....curr
11010 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
11020 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
11030 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11040 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
11050 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75  8) & 0xff;....cu
11060 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
11070 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
11080 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11090 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
110a0 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  0xff;...../* Sel
110b0 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
110c0 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63   ... */....selec
110d0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
110e0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
110f0 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
11100 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a  eof(curr_aid));.
11110 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
11120 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
11130 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
11140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11150 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
11160 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
11170 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11180 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
11190 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
111a0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20  ...}...../* ... 
111b0 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
111c0 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  ) */....select_r
111d0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
111e0 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63  ct_file(slot, cc
111f0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11200 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
11210 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f  ;....if (select_
11220 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11230 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43  SC_S_OK) {.....C
11240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11250 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
11260 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
11270 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11280 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
11290 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
112a0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63  ...}...../* Proc
112b0 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
112c0 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
112d0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
112e0 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63  ...app_tlv = cac
112f0 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
11300 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70  t);......for (ap
11310 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
11320 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
11330 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
11340 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41  >_next) {.....CA
11350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11360 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
11370 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
11380 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
11390 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
113a0 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72  .....if (app_cur
113b0 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
113c0 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29  TAG_CERTIFICATE)
113d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
113e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
113f0 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
11400 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
11410 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
11420 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  ");.......contin
11430 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
11440 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b  urr_id = &certs[
11450 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74  outidx];.....out
11460 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72  idx++;......curr
11470 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
11480 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
11490 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  C;.....memcpy(cu
114a0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
114b0 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
114c0 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
114d0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
114e0 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  t));.....curr_id
114f0 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ->card.cac.file 
11500 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
11510 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
11520 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
11530 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
11540 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11550 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
11560 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  g curr_id->card.
11570 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20  cac.applet (%p) 
11580 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
11590 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
115a0 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73  cac.applet, (uns
115b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
115c0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
115d0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
115e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
115f0 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
11600 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11610 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
11620 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11630 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  cac.applet));...
11640 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
11650 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
11660 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
11670 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11680 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
11690 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
116a0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
116b0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
116c0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61  ->certificate, a
116d0 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20  pp_curr->value, 
116e0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
116f0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
11700 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
11710 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20  ount) {......if 
11720 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
11730 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74  ) {.......*count
11740 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 63 65 72   *= 2;.......cer
11750 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
11760 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
11770 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
11780 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
11790 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
117a0 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  }.....}....}....
117b0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
117c0 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69  (app_tlv);.....i
117d0 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
117e0 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
117f0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  ;....}...}....ca
11800 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63  ckey_free_tlv(cc
11810 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f  c_tlv);..}...*co
11820 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
11830 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
11840 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
11850 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
11860 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
11870 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
11880 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  .slot->cached_ce
11890 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70  rts = cackey_cop
118a0 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65  y_certs(NULL, ce
118b0 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73  rts, *count);..s
118c0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
118d0 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74  s_count = *count
118e0 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
118f0 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
11900 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
11910 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
11920 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
11930 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
11940 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
11950 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
11960 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
11970 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
11980 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
11990 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
119a0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
119b0 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
119c0 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
119d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
119e0 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
119f0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
11a00 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
11a10 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
11a20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
11a30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
11a40 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
11a50 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
11a60 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
11a70 75 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79  utput) {..cackey
11a80 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64  _pcsc_id_type id
11a90 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
11aa0 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f 74   char dyn_auth_t
11ab0 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a 09 75 6e  emplate[10];..un
11ac0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
11ad0 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20  buf, *tmpbuf_s, 
11ae0 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *outbuf_s, *outb
11af0 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  uf_p;..unsigned 
11b00 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65  char bytes_to_se
11b10 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09  nd, p1, class;..
11b20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c  unsigned char bl
11b30 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  ocktype;..cackey
11b40 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  _ret send_ret;..
11b50 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
11b60 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76  e;..ssize_t retv
11b70 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66  al = 0, unpadoff
11b80 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70  set;..size_t tmp
11b90 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20  buflen, padlen, 
11ba0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75  tmpoutbuflen, ou
11bb0 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66  tbuf_len;..int f
11bc0 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
11bd0 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45  .int le;...CACKE
11be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11bf0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
11c00 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
11c10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11c20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11c30 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  slot is NULL");.
11c40 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11c50 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e  }...if (buf == N
11c60 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11c80 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c  ror.  buf is NUL
11c90 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11ca0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
11cb0 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
11cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11cd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75  INTF("Error.  ou
11ce0 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tbuf is NULL");.
11cf0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11d00 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
11d10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11d30 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
11d40 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
11d50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
11d60 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11d70 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  >pcsc_identity =
11d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11d90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11da0 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
11db0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11dc0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11dd0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11de0 69 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69  id_type = identi
11df0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11e00 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20  y->id_type;..if 
11e10 28 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  (id_type == CACK
11e20 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
11e30 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ONLY) {...CACKEY
11e40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11e50 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11e60 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11e70 73 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  s CACKEY_ID_TYPE
11e80 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63  _CERT_ONLY, whic
11e90 68 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  h cannot be used
11ea0 20 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70   for sign/decryp
11eb0 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  t");....return(-
11ec0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
11ed0 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61  (id_type) {...ca
11ee0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11ef0 45 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41  E_PIV:...case CA
11f00 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11f10 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  :....break;...de
11f20 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59  fault:....CACKEY
11f30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11f40 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11f50 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11f60 73 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65  s not a supporte
11f70 64 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73  d value. Type is
11f80 3a 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30  : 0x%lx (PIV = 0
11f90 78 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c  x%lx, CAC = 0x%l
11fa0 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  x)", (unsigned l
11fb0 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75  ong) id_type, (u
11fc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11fd0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
11fe0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11ff0 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ) CACKEY_ID_TYPE
12000 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72  _CAC);.....retur
12010 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  n(-1);..}.../* D
12020 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74  etermine identit
12030 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69  y Key size */..i
12040 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
12050 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12060 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65  ize < 0) {...ide
12070 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12080 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  tity->keysize = 
12090 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28  x509_to_keysize(
120a0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
120b0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
120c0 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  cate, identity->
120d0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
120e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
120f0 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73  ..}.../* Pad mes
12100 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65  sage to key size
12110 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75   */..if (padInpu
12120 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  t) {...if (ident
12130 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12140 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29  ty->keysize > 0)
12150 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e   {....if (buflen
12160 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63   != identity->pc
12170 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12180 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28  size) {.....if (
12190 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69  buflen > (identi
121a0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
121b0 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29  y->keysize + 3))
121c0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
121d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
121e0 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20  or.  Message is 
121f0 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67  too large to sig
12200 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09  n/decrypt");....
12210 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12220 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66  ...}......tmpbuf
12230 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
12240 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12250 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62  eysize;.....tmpb
12260 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
12270 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65  uflen);.....free
12280 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09  _tmpbuf = 1;....
12290 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75  ..padlen = tmpbu
122a0 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20  flen - buflen - 
122b0 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50  3;....../* RSA P
122c0 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31  KCS#1 EMSA-PKCS1
122d0 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f  -v1_5 Padding */
122e0 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d  .....tmpbuf[0] =
122f0 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75   0x00;.....tmpbu
12300 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09  f[1] = 0x01;....
12310 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b  .memset(&tmpbuf[
12320 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e  2], 0xFF, padlen
12330 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61  );.....tmpbuf[pa
12340 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b  dlen + 2]= 0x00;
12350 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70  .....memcpy(&tmp
12360 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c  buf[padlen + 3],
12370 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a   buf, buflen);..
12380 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12390 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64  _PRINTBUF("Unpad
123a0 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c  ded:", buf, bufl
123b0 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  en);.....CACKEY_
123c0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
123d0 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66  Padded:", tmpbuf
123e0 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09  , tmpbuflen);...
123f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d  .} else {.....tm
12400 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09  pbuf = buf;.....
12410 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
12420 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  en;.....free_tmp
12430 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64  buf = 0;.....pad
12440 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09  len = 0;....}...
12450 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
12460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12470 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72  "Unable to deter
12480 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68  mine key size, h
12490 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67  oping the messag
124a0 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61  e is properly pa
124b0 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70  dded!");.....tmp
124c0 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d  buf = buf;....tm
124d0 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
124e0 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  ;....free_tmpbuf
124f0 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20   = 0;....padlen 
12500 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  = 0;...}..} else
12510 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75   {...tmpbuf = bu
12520 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  f;...tmpbuflen =
12530 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f   buflen;...free_
12540 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61  tmpbuf = 0;...pa
12550 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  dlen = 0;..}.../
12560 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74  * Begin transact
12570 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
12580 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
12590 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c  (slot);.../* Sel
125a0 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c  ect correct appl
125b0 65 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69  et */..switch (i
125c0 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  d_type) {...case
125d0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
125e0 43 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  CAC:....CACKEY_D
125f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
12600 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f  ecting applet fo
12610 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20  und at %p ...", 
12620 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12630 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12640 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61  c.applet);....ca
12650 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
12660 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  et(slot, identit
12670 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12680 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
12690 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
126a0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
126b0 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
126c0 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  et));...../* Sel
126d0 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65  ect correct file
126e0 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   */....cackey_se
126f0 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
12700 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12710 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12720 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61  c.file);....brea
12730 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
12740 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
12750 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12760 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09  te[0] = 0x7C;...
12770 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12780 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[1] = 0x82;...
12790 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
127a0 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66  te[2] = ((tmpbuf
127b0 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30  len + 6) & 0xff0
127c0 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f  0) >> 8;....dyn_
127d0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d  auth_template[3]
127e0 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20   = (tmpbuflen + 
127f0 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09  6) & 0x00ff;....
12800 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12810 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[4] = 0x82;....
12820 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12830 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  e[5] = 0x00;....
12840 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12850 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09  e[6] = 0x81;....
12860 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12870 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[7] = 0x82;....
12880 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12890 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65  e[8] = (tmpbufle
128a0 6e 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  n & 0xff00) >> 8
128b0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
128c0 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62  mplate[9] = tmpb
128d0 75 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a  uflen & 0x00ff;.
128e0 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
128f0 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
12900 73 6c 6f 74 2c 20 30 78 31 30 2c 20 4e 49 53 54  slot, 0x10, NIST
12910 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
12920 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50  _GENAUTH, NISTSP
12930 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53  800_78_3_ALGO_RS
12940 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d  A2048, identity-
12950 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12960 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c  card.piv.key_id,
12970 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68   sizeof(dyn_auth
12980 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79 6e 5f  _template), dyn_
12990 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 30  auth_template, 0
129a0 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  x00, NULL, NULL,
129b0 20 4e 55 4c 4c 29 3b 0a 09 09 09 62 72 65 61 6b   NULL);....break
129c0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
129d0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
129e0 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
129f0 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
12a00 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
12a10 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
12a20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
12a30 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f  tmpoutbuflen = o
12a40 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20  utbuflen;....if 
12a50 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
12a60 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
12a70 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
12a80 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
12a90 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  TU;...} else {..
12aa0 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20  ..bytes_to_send 
12ab0 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d  = tmpbuflen;...}
12ac0 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 43  ....send_ret = C
12ad0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
12ae0 45 52 49 43 3b 0a 09 09 73 77 69 74 63 68 20 28  ERIC;...switch (
12af0 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
12b00 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12b10 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 20 28 74  E_CAC:.....if (t
12b20 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45  mpbuflen > CACKE
12b30 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09  Y_APDU_MTU) {...
12b40 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09  ...p1 = 0x80;...
12b50 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
12b60 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
12b70 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 09  p1 = 0x00;......
12b80 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
12b90 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d  ......send_ret =
12ba0 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
12bb0 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
12bc0 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
12bd0 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
12be0 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31  _SIGNDECRYPT, p1
12bf0 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f  , 0x00, bytes_to
12c00 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c  _send, tmpbuf, l
12c10 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75  e, &respcode, ou
12c20 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66  tbuf, &tmpoutbuf
12c30 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  len);.....break;
12c40 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
12c50 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
12c60 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e  .if (tmpbuflen >
12c70 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
12c80 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  ) {......class =
12c90 20 30 78 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x10;......le =
12ca0 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
12cb0 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  e {......class =
12cc0 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
12cd0 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20  7816;......le = 
12ce0 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  256;.....}......
12cf0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12d00 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12d10 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50 38  , class, NISTSP8
12d20 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
12d30 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30  NAUTH, NISTSP800
12d40 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
12d50 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  48, identity->pc
12d60 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
12d70 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79  d.piv.key_id, by
12d80 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70  tes_to_send, tmp
12d90 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f  buf, le, &respco
12da0 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70  de, outbuf, &tmp
12db0 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  outbuflen);.....
12dc0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12dd0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12de0 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
12df0 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ak;...}....if (s
12e00 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
12e10 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
12e20 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75  ..if (free_tmpbu
12e30 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70  f) {.....if (tmp
12e40 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72  buf_s) {......fr
12e50 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
12e60 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
12e70 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
12e80 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
12e90 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
12ea0 74 29 3b 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  t);.....if (send
12eb0 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
12ec0 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
12ed0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12ee0 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
12ef0 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72  ding Failed -- r
12f00 65 74 72 79 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  etrying.");.....
12f10 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73  .return(cackey_s
12f20 69 67 6e 64 65 63 72 79 70 74 28 73 6c 6f 74 2c  igndecrypt(slot,
12f30 20 69 64 65 6e 74 69 74 79 2c 20 62 75 66 2c 20   identity, buf, 
12f40 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 2c 20  buflen, outbuf, 
12f50 6f 75 74 62 75 66 6c 65 6e 2c 20 70 61 64 49 6e  outbuflen, padIn
12f60 70 75 74 2c 20 75 6e 70 61 64 4f 75 74 70 75 74  put, unpadOutput
12f70 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  ));....}.....CAC
12f80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12f90 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
12fa0 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
12fb0 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
12fc0 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
12fd0 20 3d 3d 20 30 78 36 39 38 32 20 7c 7c 20 72 65   == 0x6982 || re
12fe0 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 65 30 30  spcode == 0x6e00
12ff0 29 20 7b 0a 09 09 09 09 69 66 20 28 72 65 73 70  ) {.....if (resp
13000 63 6f 64 65 20 3d 3d 20 30 78 36 45 30 30 29 20  code == 0x6E00) 
13010 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
13020 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f 74 20  BUG_PRINTF("Got 
13030 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53 5c 22 2c  \"WRONG CLASS\",
13040 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65 20 61   this means we a
13050 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20 74 68  re talking to th
13060 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74 20 28  e wrong object (
13070 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65 20 74  likely because t
13080 68 65 20 63 61 72 64 20 77 65 6e 74 20 61 77 61  he card went awa
13090 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e 67 22  y) -- resetting"
130a0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
130b0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
130c0 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72 69  G_PRINTF("Securi
130d0 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73 61  ty status not sa
130e0 74 69 73 69 66 69 65 64 20 28 72 65 73 70 63 6f  tisified (respco
130f0 64 65 20 3d 20 30 78 25 30 34 78 29 2e 20 20 52  de = 0x%04x).  R
13100 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47  eturning NEEDLOG
13110 49 4e 22 2c 20 28 69 6e 74 29 20 72 65 73 70 63  IN", (int) respc
13120 6f 64 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  ode);.....}.....
13130 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
13140 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a  t_reset(slot);..
13150 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ....slot->token_
13160 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
13170 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09  N_REQUIRED;.....
13180 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
13190 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
131a0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 72  ;....}.....if (r
131b0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 45 30  espcode == 0x6E0
131c0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
131d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 47 6f  DEBUG_PRINTF("Go
131e0 74 20 5c 22 57 52 4f 4e 47 20 43 4c 41 53 53 5c  t \"WRONG CLASS\
131f0 22 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 77 65  ", this means we
13200 20 61 72 65 20 74 61 6c 6b 69 6e 67 20 74 6f 20   are talking to 
13210 74 68 65 20 77 72 6f 6e 67 20 6f 62 6a 65 63 74  the wrong object
13220 20 28 6c 69 6b 65 6c 79 20 62 65 63 61 75 73 65   (likely because
13230 20 74 68 65 20 63 61 72 64 20 77 65 6e 74 20 61   the card went a
13240 77 61 79 29 20 2d 2d 20 72 65 73 65 74 74 69 6e  way) -- resettin
13250 67 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  g");......cackey
13260 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13270 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74  (slot);......ret
13280 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
13290 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09  E_NEEDLOGIN);...
132a0 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f  .}.....if (send_
132b0 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
132c0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
132d0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
132e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
132f0 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75  en absent.  Retu
13300 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e  rning TOKENABSEN
13310 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  T");......cackey
13320 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13330 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74  (slot);......ret
13340 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
13350 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
13360 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
13370 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62  -1);...}....tmpb
13380 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73  uf += bytes_to_s
13390 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  end;...tmpbuflen
133a0 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   -= bytes_to_sen
133b0 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20  d;....outbuf += 
133c0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09  tmpoutbuflen;...
133d0 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70  outbuflen -= tmp
133e0 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74  outbuflen;...ret
133f0 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66  val += tmpoutbuf
13400 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72  len;..}...if (fr
13410 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69  ee_tmpbuf) {...i
13420 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09  f (tmpbuf_s) {..
13430 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
13440 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75  ;...}..}...outbu
13450 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09  f = outbuf_s;...
13460 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
13470 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
13480 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
13490 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43  ot);..#ifdef CAC
134a0 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
134b0 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
134c0 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62  ZE_MAX..if (outb
134d0 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53  uflen > _POSIX_S
134e0 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
134f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13500 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63  F("Outbuflen exc
13510 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
13520 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
13530 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
13540 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20   %li, outbuflen 
13550 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
13560 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
13570 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13580 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09  ) outbuflen);...
13590 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
135a0 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
135b0 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d  ../* We must rem
135c0 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67  ove the "7C" tag
135d0 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73   to get to the s
135e0 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69  ignature */..swi
135f0 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
13600 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13610 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75  _TYPE_PIV:....ou
13620 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61  tbuf_len = retva
13630 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d  l;....outbuf_p =
13640 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
13650 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20  tlv_tag(outbuf, 
13660 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37  &outbuf_len, 0x7
13670 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75  C, NULL,  &outbu
13680 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f  f_len);....if (o
13690 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29  utbuf_p == NULL)
136a0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
136b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
136c0 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f  onse from PIV fo
136d0 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45  r GENERATE AUTHE
136e0 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f  NTICATION was no
136f0 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65  t a 0x7C tag, re
13700 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
13710 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  re");......retur
13720 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  n(-1);....}.....
13730 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f  retval = outbuf_
13740 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f  len;.....outbuf_
13750 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09  len = retval;...
13760 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b  .outbuf_p = cack
13770 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74  ey_read_bertlv_t
13780 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62  ag(outbuf, &outb
13790 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55  uf_len, 0x82, NU
137a0 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e  LL,  &outbuf_len
137b0 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66  );....if (outbuf
137c0 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  _p == NULL) {...
137d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
137e0 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
137f0 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e  from PIV for GEN
13800 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41  ERATE AUTHENTICA
13810 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30  TION was not a 0
13820 78 38 32 20 77 69 74 68 20 74 68 65 6e 20 30 78  x82 with then 0x
13830 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e  7C tag, returnin
13840 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
13850 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13860 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c  ....}.....retval
13870 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a   = outbuf_len;..
13880 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
13890 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
138a0 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b  CAC:...case CACK
138b0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
138c0 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
138d0 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65  .}.../* Unpad re
138e0 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61  ply */..if (unpa
138f0 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20  dOutput) {...if 
13900 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09  (retval < 3) {..
13910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13920 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20  RINTF("Reply is 
13930 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72  too small, we ar
13940 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e  e not able to un
13950 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62  pad -- passing b
13960 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  ack and hoping f
13970 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a  or the best!");.
13980 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13990 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
139a0 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
139b0 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
139c0 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
139d0 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  val);....return(
139e0 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09  retval);...}....
139f0 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d  if (outbuf[0] !=
13a00 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b   0x00) {....CACK
13a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13a20 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "Unrecognized pa
13a30 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20  dding scheme -- 
13a40 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
13a50 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
13a60 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
13a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13a80 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
13a90 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
13aa0 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
13ab0 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
13ac0 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
13ad0 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79  ;...}....blockty
13ae0 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a  pe = outbuf[1];.
13af0 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20  ..unpadoffset = 
13b00 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c  0;....switch (bl
13b10 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61  ocktype) {....ca
13b20 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20  se 0x00:...../* 
13b30 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31  Padding Scheme 1
13b40 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  , the first non-
13b50 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65  zero byte is the
13b60 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a   start of data *
13b70 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
13b80 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
13b90 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
13ba0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
13bb0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
13bc0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
13bd0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  != 0x00) {......
13be0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09  .break;......}..
13bf0 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
13c00 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09  ...case 0x01:...
13c10 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
13c20 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73  eme 2, pad bytes
13c30 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77   are 0xFF follow
13c40 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09  ed by 0x00 */...
13c50 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
13c60 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
13c70 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
13c80 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
13c90 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
13ca0 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
13cb0 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20  xFF) {.......if 
13cc0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
13cd0 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
13ce0 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
13cf0 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72  et++;.........br
13d00 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  eak;.......} els
13d10 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  e {........CACKE
13d20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13d30 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
13d40 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
13d50 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
13d60 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
13d70 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78  en 0x00 found 0x
13d80 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
13d90 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
13da0 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
13db0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13dc0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
13dd0 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
13de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13df0 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
13e00 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
13e10 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13e20 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
13e30 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30  een 0xFF found 0
13e40 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
13e50 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
13e60 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
13e70 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13e80 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
13e90 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13ea0 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x02:...../* Pad
13eb0 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70  ding Scheme 3, p
13ec0 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e  ad bytes are non
13ed0 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f  -zero first zero
13ee0 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74   byte found is t
13ef0 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74  he seperator byt
13f00 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  e */.....for (un
13f10 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
13f20 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
13f30 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
13f40 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
13f50 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
13f60 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
13f70 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
13f80 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
13f90 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
13fa0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
13fb0 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  if (unpadoffset 
13fc0 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43  > retval) {....C
13fd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13fe0 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74  TF("Offset great
13ff0 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69  er than reply si
14000 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28  ze, aborting.  (
14010 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c  unpadoffset = %l
14020 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29  u, retval = %lu)
14030 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
14040 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20  g) unpadoffset, 
14050 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
14060 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
14070 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14090 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
140a0 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
140b0 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75  ;....retval -= u
140c0 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65  npadoffset;...me
140d0 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75  mmove(outbuf, ou
140e0 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73  tbuf + unpadoffs
140f0 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  et, retval);....
14100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14110 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
14120 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
14130 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  l);..}....CACKEY
14140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14150 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
14160 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
14170 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
14180 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  g) retval);...re
14190 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
141a0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
141b0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
141c0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
141d0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
141e0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
141f0 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
14200 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14210 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
14220 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
14230 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
14240 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
14250 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
14260 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
14270 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
14280 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
14290 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
142a0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
142b0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
142c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
142d0 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
142e0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
142f0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
14300 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e  0xFF, 0xFF};..un
14310 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
14320 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74  certs;..uint16_t
14330 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a   response_code;.
14340 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
14350 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  ning;..int send_
14360 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65  ret;..int key_re
14370 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a  ference = 0x00;.
14380 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68  ../* Indicate th
14390 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  at we do not kno
143a0 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79  w about how many
143b0 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69   tries are remai
143c0 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69  ning */..if (tri
143d0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
143e0 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  {...*tries_remai
143f0 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a  ning_p = -1;..}.
14400 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c  ../* Apparently,
14410 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45   CAC PINs are *E
14420 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20  XACTLY* 8 bytes 
14430 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68  long -- pad with
14440 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f   0xFF if too sho
14450 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c  rt */..if (pin_l
14460 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d  en >= 8) {...mem
14470 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
14480 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  , 8);..} else {.
14490 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
144a0 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b  , pin, pin_len);
144b0 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20  ..}.../* Reject 
144c0 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74  PINs which are t
144d0 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20  oo short */..if 
144e0 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a  (pin_len < 5) {.
144f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14500 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67  RINTF("Rejecting
14510 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
14520 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
14530 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
14540 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f  tleast 5)", pin_
14550 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
14560 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
14570 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  DPIN);..}.../* P
14580 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  IV authenticatio
14590 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65  n uses a "key_re
145a0 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30  ference" of 0x80
145b0 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69   */..pcsc_identi
145c0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
145d0 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
145e0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
145f0 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ;..if (num_certs
14600 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65   > 0 && pcsc_ide
14610 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
14620 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73   {...switch (pcs
14630 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
14640 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
14650 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14660 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45  E_PIV:.....CACKE
14670 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14680 57 65 20 68 61 76 65 20 50 49 56 20 63 61 72 64  We have PIV card
14690 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74  , so we will att
146a0 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69  empt to authenti
146b0 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20 50  cate using the P
146c0 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b  IV Application k
146d0 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a  ey reference");.
146e0 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65 6e  .....key_referen
146f0 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 62  ce = 0x80;.....b
14700 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
14710 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
14720 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
14730 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
14740 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
14750 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73  , 1);..}.../* Is
14760 73 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a  sue PIN Verify *
14770 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
14780 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
14790 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
147a0 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
147b0 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78  INSTR_VERIFY, 0x
147c0 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  00, key_referenc
147d0 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69  e, sizeof(cac_pi
147e0 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30  n), cac_pin, 0x0
147f0 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64  0, &response_cod
14800 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  e, NULL, NULL);.
14810 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
14820 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
14830 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
14840 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
14850 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
14860 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
14870 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
14880 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
14890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
148a0 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
148b0 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
148c0 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
148d0 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
148e0 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74  ning);.....if (t
148f0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
14900 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72  ) {.....*tries_r
14910 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69  emaining_p = tri
14920 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09  es_remaining;...
14930 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
14940 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
14950 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IN);...}....if (
14960 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d  response_code ==
14970 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41   0x6983) {....CA
14980 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14990 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
149a0 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69  ion failed, devi
149b0 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  ce is locked");.
149c0 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
149d0 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
149e0 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
149f0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
14a00 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
14a10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14a20 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
14a30 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
14a40 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
14a50 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
14a60 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
14a70 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
14a80 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
14a90 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
14aa0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
14ab0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
14ac0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
14ad0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
14ae0 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
14af0 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
14b00 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
14b10 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
14b20 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
14b30 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c  ..DWORD reader_l
14b40 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20  en = 0, state = 
14b50 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c  0, protocol = 0,
14b60 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
14b70 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
14b80 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
14b90 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
14ba0 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
14bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14bc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
14bd0 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
14be0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14bf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14c00 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20  g token present 
14c10 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29  (internal token)
14c20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
14c30 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
14c40 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  NPRESENT);..}...
14c50 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
14c60 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
14c70 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
14c80 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
14c90 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
14ca0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
14cb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14cc0 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
14cd0 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
14ce0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
14cf0 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
14d00 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
14d10 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
14d20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14d30 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53  RINTF("Calling S
14d40 43 61 72 64 53 74 61 74 75 73 28 29 20 74 6f 20  CardStatus() to 
14d50 64 65 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73  determine card s
14d60 74 61 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c  tatus");...atr_l
14d70 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
14d80 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ;..status_ret = 
14d90 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
14da0 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
14db0 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
14dc0 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
14dd0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
14de0 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  );...if (status_
14df0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49  ret == SCARD_E_I
14e00 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b  NVALID_HANDLE) {
14e10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14e20 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61  PRINTF("SCardSta
14e30 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  tus() returned S
14e40 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
14e50 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69  ANDLE, marking i
14e60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f  s not already co
14e70 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69  nnected and tryi
14e80 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61  ng again");...ca
14e90 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
14ea0 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70  eset(slot);....p
14eb0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
14ec0 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
14ed0 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69  _card(slot);...i
14ee0 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
14ef0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
14f00 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
14f10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14f20 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
14f30 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
14f40 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
14f50 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75  sent");.....retu
14f60 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14f70 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
14f80 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
14f90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69  UG_PRINTF("Calli
14fa0 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28 29  ng SCardStatus()
14fb0 20 61 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72   again");....atr
14fc0 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
14fd0 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74  r);...status_ret
14fe0 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
14ff0 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
15000 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
15010 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
15020 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
15030 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  len);..}...if (s
15040 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
15050 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
15060 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
15070 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
15080 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
15090 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
150a0 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
150b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
150c0 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
150d0 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
150e0 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
150f0 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
15100 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
15110 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
15120 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
15130 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 29 3b 0a  D_PROTOCOL_T1);.
15140 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
15150 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
15160 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
15170 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73  ../* Re-establis
15180 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  h transaction, i
15190 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74  f it was present
151a0 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74   */.....if (slot
151b0 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
151c0 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  pth > 0) {......
151d0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
151e0 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09  n_depth--;......
151f0 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
15200 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
15210 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
15220 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
15230 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a  n(slot);.....}..
15240 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15250 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73  _PRINTF("Reset s
15260 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65  uccessful, reque
15270 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61  rying");.....sta
15280 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
15290 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
152a0 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
152b0 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
152c0 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
152d0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09  , &atr_len);....
152e0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
152f0 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
15300 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  SS) {......CACKE
15310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15320 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20  Still unable to 
15330 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
15340 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
15350 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
15360 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
15370 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
15380 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
15390 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
153a0 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
153b0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
153c0 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
153d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
153e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
153f0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72  NTF("Unable to r
15400 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64  econnect to card
15410 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15420 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
15430 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  Reconnect() = %s
15440 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
15450 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
15460 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e  _STR(scard_recon
15470 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65  n_ret));......re
15480 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
15490 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
154a0 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
154b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
154c0 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
154d0 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
154e0 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
154f0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
15500 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
15510 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
15520 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
15530 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
15540 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ));.....return(C
15550 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
15560 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
15570 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26  }...if ((state &
15580 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d   SCARD_ABSENT) =
15590 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  = SCARD_ABSENT) 
155a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
155b0 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73  _PRINTF("Card is
155c0 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69   absent, returni
155d0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
155e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
155f0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
15600 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
15610 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15620 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b  F("Returning tok
15630 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a  en present.");..
15640 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15650 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
15660 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  NT);.}../*. * SY
15670 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
15680 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
15690 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
156a0 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
156b0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
156c0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
156d0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
156e0 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70  ssize_t cackey_p
156f0 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f  csc_identity_to_
15700 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63  label(struct cac
15710 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
15720 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
15730 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65  igned char *labe
15740 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20  l_buf, unsigned 
15750 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  long label_buf_l
15760 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
15770 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  long certificate
15780 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62  _len;..void *lab
15790 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a  el_asn1;..void *
157a0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e  certificate;..in
157b0 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  t x509_read_ret;
157c0 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
157d0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
157e0 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
157f0 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
15800 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
15810 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
15820 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29  ificate_len < 0)
15830 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
15840 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
15850 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
15860 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
15870 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
15880 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c  en, (void **) &l
15890 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20  abel_asn1);..if 
158a0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
158b0 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
158c0 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
158d0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
158e0 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
158f0 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
15900 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
15910 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
15920 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a  buf_len, "CN");.
15930 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
15940 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30  et <= 0) {...x50
15950 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
15960 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c  9_dn_to_string(l
15970 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f  abel_asn1, x509_
15980 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20  read_ret, (char 
15990 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61  *) label_buf, la
159a0 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c  bel_buf_len, NUL
159b0 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f  L);....if (x509_
159c0 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
159d0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
159e0 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  ..}..}..#ifdef C
159f0 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
15a00 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
15a10 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35  SIZE_MAX..if (x5
15a20 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50  09_read_ret > _P
15a30 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
15a40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
15a50 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65  _PRINTF("x509_re
15a60 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d  ad_ret exceeds m
15a70 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
15a80 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
15a90 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
15aa0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
15ab0 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
15ac0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
15ad0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ae0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
15af0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15b00 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
15b10 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f  f...return(x509_
15b20 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a  read_ret);.}../*
15b30 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
15b40 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
15b50 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
15b60 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d  _create(void **m
15b70 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
15b80 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
15b90 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
15ba0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
15bb0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
15bc0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
15bd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
15be0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
15bf0 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
15c00 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
15c10 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
15c20 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
15c30 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61  hread_mutex = ma
15c40 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68  lloc(sizeof(*pth
15c50 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09  read_mutex));...
15c60 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74  if (!pthread_mut
15c70 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ex) {....CACKEY_
15c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
15c90 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
15ca0 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09   memory.");.....
15cb0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
15cc0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
15cd0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
15ce0 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d  x_init(pthread_m
15cf0 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69  utex, NULL);...i
15d00 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
15d10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
15d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15d30 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
15d40 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20  init() returned 
15d50 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
15d60 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
15d70 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15d80 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70  .}....*mutex = p
15d90 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d  thread_mutex;..}
15da0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
15db0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
15dc0 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
15dd0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
15de0 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
15df0 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
15e00 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
15e10 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
15e20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15e30 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
15e40 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
15e50 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15e60 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
15e70 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
15e80 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
15e90 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
15ea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15eb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
15ec0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
15ed0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
15ee0 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
15ef0 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
15f00 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
15f10 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a  utex_lock(void *
15f20 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
15f30 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
15f40 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
15f50 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
15f60 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
15f70 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
15f80 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
15f90 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
15fa0 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
15fb0 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
15fc0 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
15fd0 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
15fe0 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
15ff0 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
16000 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
16010 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68  d_mutex_lock(pth
16020 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
16030 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
16040 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
16050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16060 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
16070 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
16080 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
16090 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
160a0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
160b0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
160c0 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  f (cackey_args.L
160d0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
160e0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
160f0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
16100 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
16110 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
16120 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
16130 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16140 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
16150 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29  args.LockMutex()
16160 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
16170 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
16180 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
16190 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
161a0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
161b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
161c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
161d0 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
161e0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
161f0 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
16200 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
16210 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
16220 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20  tex_unlock(void 
16230 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
16240 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
16250 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
16260 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
16270 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
16280 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
16290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
162a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
162b0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
162c0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
162d0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
162e0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
162f0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
16300 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
16310 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
16320 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
16330 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
16340 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
16350 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
16360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16370 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
16380 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75  ex_unlock() retu
16390 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
163a0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
163b0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
163c0 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
163d0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
163e0 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29  rgs.UnlockMutex)
163f0 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
16400 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
16410 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75  s.UnlockMutex(mu
16420 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
16430 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
16440 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
16450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16460 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ("cackey_args.Un
16470 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  lockMutex() retu
16480 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
16490 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
164a0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
164b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
164c0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
164d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
164e0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
164f0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
16500 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74  turn(0);.}..stat
16510 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  ic CK_ATTRIBUTE_
16520 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  PTR cackey_get_a
16530 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a  ttributes(CK_OBJ
16540 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74  ECT_CLASS object
16550 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61  class, struct ca
16560 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
16570 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
16580 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e  signed long iden
16590 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f  tity_num, CK_ULO
165a0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
165b0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42   {..static CK_BB
165c0 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b  OOL ck_true = 1;
165d0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f  ..static CK_BBOO
165e0 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a  L ck_false = 0;.
165f0 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54  .static CK_TRUST
16600 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b   ck_trusted = CK
16610 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54  _TRUSTED_DELEGAT
16620 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75  OR;..CK_ULONG nu
16630 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76  mattrs = 0, retv
16640 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54  al_count;..CK_AT
16650 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72  TRIBUTE_TYPE cur
16660 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b  r_attr_type;..CK
16670 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f  _ATTRIBUTE curr_
16680 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09  attr, *retval;..
16690 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
166a0 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
166b0 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42  ValueLen;..CK_OB
166c0 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62  JECT_CLASS ck_ob
166d0 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f  ject_class;..CK_
166e0 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
166f0 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f   ck_certificate_
16700 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59  type;..CK_KEY_TY
16710 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  PE ck_key_type;.
16720 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54  .CK_UTF8CHAR ucT
16730 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48  mpBuf[1024];..SH
16740 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63  A1Context sha1_c
16750 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35  tx;..MD5_CTX md5
16760 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73  _ctx;..uint8_t s
16770 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73  ha1_hash[SHA1Has
16780 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74  hSize];..uint8_t
16790 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73   md5_hash[MD5Has
167a0 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65  hSize];..unsigne
167b0 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63  d char *certific
167c0 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65  ate;..ssize_t ce
167d0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
167e0 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  -1, x509_read_re
167f0 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66  t;..int pValue_f
16800 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ree;...CACKEY_DE
16810 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
16820 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20  ed (objectClass 
16830 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f  = %lu, identity_
16840 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  num = %lu).", (u
16850 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62  nsigned long) ob
16860 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74  jectclass, ident
16870 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c  ity_num);...*pul
16880 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20  Count = 0;...if 
16890 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
168a0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
168b0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
168c0 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
168d0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
168e0 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
168f0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
16900 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
16910 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43  E_TRUST) {...CAC
16920 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16930 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
16940 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e  jects (NULL), in
16950 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61  valid object cla
16960 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ss");....return(
16970 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47  NULL);..}.../* G
16980 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28  et Cert */..if (
16990 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c  identity == NULL
169a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
169b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
169c0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
169d0 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69  NULL), invalid i
169e0 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22  dentiy provided"
169f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
16a00 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69  L);..}...certifi
16a10 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  cate = identity-
16a20 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63  >certificate;..c
16a30 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
16a40 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
16a50 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66  ficate_len;...if
16a60 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
16a70 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69  n == -1 || certi
16a80 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  ficate == NULL) 
16a90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
16aa0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
16ab0 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55  ng 0 objects (NU
16ac0 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69  LL), this identi
16ad0 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ty does not have
16ae0 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66   an X.509 certif
16af0 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
16b00 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c   with it and wil
16b10 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09  l not work");...
16b20 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
16b30 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
16b40 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69  at certificate i
16b50 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20  s ASN.1 encoded 
16b60 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
16b70 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74  e */..if (x509_t
16b80 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
16b90 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
16ba0 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30  e_len, NULL) < 0
16bb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
16bc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
16bd0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
16be0 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39  NULL), the X.509
16bf0 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73   certificate ass
16c00 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
16c10 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  s identity is no
16c20 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65  t valid");....re
16c30 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
16c40 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
16c50 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  64;..retval = ma
16c60 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e  lloc(retval_coun
16c70 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
16c80 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72  al));...for (cur
16c90 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b  r_attr_type = 0;
16ca0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20   curr_attr_type 
16cb0 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75  < 0xce5363bf; cu
16cc0 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20  rr_attr_type++) 
16cd0 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  {...if (curr_att
16ce0 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29  r_type == 0x800)
16cf0 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f   {....curr_attr_
16d00 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30  type = 0xce53630
16d10 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65  0;...}....pValue
16d20 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61  _free = 0;...pVa
16d30 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
16d40 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
16d50 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74  ONG) -1;....swit
16d60 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  ch (curr_attr_ty
16d70 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b  pe) {....case CK
16d80 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43  A_CLASS:.....CAC
16d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16da0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
16db0 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53  ribute CKA_CLASS
16dc0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
16dd0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16de0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16df0 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74  ;......ck_object
16e00 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63  _class = objectc
16e10 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75  lass;......pValu
16e20 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63  e = &ck_object_c
16e30 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75  lass;.....ulValu
16e40 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
16e50 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a  _object_class);.
16e60 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16e70 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
16e80 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
16e90 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
16ea0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42  d long) *((CK_OB
16eb0 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56  JECT_CLASS *) pV
16ec0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16ed0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16ee0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16ef0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16f00 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43  CKA_TOKEN:.....C
16f10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16f20 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
16f30 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b  ttribute CKA_TOK
16f40 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EN (0x%08lx) ...
16f50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16f60 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
16f70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
16f80 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
16f90 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
16fa0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
16fb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16fc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
16fd0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
16fe0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
16ff0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
17000 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
17010 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
17020 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
17030 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
17040 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41  ..case CKA_PRIVA
17050 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  TE:.....CACKEY_D
17060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17070 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17080 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30  e CKA_PRIVATE (0
17090 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
170a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
170b0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
170c0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
170d0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
170e0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
170f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17100 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
17110 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
17120 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
17130 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
17140 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17150 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17160 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
17170 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
17180 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
17190 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
171a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
171b0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
171c0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
171d0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
171e0 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
171f0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
17200 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
17210 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
17220 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17230 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44  case CKA_TRUSTED
17240 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
17250 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
17260 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
17270 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25  CKA_TRUSTED (0x%
17280 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17290 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
172a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
172b0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
172c0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
172d0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
172e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
172f0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17300 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17310 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
17320 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
17330 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
17340 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
17350 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
17360 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
17370 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
17380 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
17390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
173a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
173b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
173c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
173d0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
173e0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
173f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
17400 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
17410 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
17420 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09  _MODIFIABLE:....
17430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17440 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
17450 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
17460 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38  ODIFIABLE (0x%08
17470 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
17480 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
17490 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
174a0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
174b0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
174c0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
174d0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
174e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
174f0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
17500 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
17510 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
17520 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
17530 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
17540 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17550 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17560 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17570 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43  CKA_LABEL:.....C
17580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17590 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
175a0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42  ttribute CKA_LAB
175b0 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  EL (0x%08lx) ...
175c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
175d0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
175e0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64 65  e);......if (ide
175f0 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 20 3d  ntity->id_type =
17600 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
17610 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70 56 61  _PIV) {......pVa
17620 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  lue = identity->
17630 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a  card.piv.label;.
17640 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17650 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75 65 29  = strlen(pValue)
17660 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
17670 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17680 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20   snprintf((char 
17690 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a  *) ucTmpBuf, siz
176a0 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22  eof(ucTmpBuf), "
176b0 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20  Identity #%lu", 
176c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
176d0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09  identity_num);..
176e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54  ....pValue = ucT
176f0 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69 66 20  mpBuf;.......if 
17700 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73  (ulValueLen >= s
17710 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
17720 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
17730 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 09 70  Len = 0;.......p
17740 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
17750 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
17760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17770 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17780 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
17790 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
177a0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
177b0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
177c0 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55  ...case CKA_VALU
177d0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
177e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
177f0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17800 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30   CKA_VALUE (0x%0
17810 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17820 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17830 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17840 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63  .switch (objectc
17850 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73  lass) {......cas
17860 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  e CKO_PRIVATE_KE
17870 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  Y:.......CACKEY_
17880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17890 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
178a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
178b0 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20 6b   are a private k
178c0 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ey.");........br
178d0 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
178e0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
178f0 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  T:.......CACKEY_
17900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17910 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17920 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17930 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
17940 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17950 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17960 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c  ...case CKO_PUBL
17970 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69 66  IC_KEY:.......if
17980 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
17990 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 09  n >= 0) {.......
179a0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
179b0 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28   x509_to_pubkey(
179c0 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
179d0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
179e0 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 69  Value);........i
179f0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
17a00 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09 09   < 0) { ........
17a10 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
17a20 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  .......} else {.
17a30 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  ........ulValueL
17a40 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
17a50 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09  et;........}....
17a60 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65 61  ...}........brea
17a70 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
17a80 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
17a90 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72  ....pValue = cer
17aa0 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09  tificate;.......
17ab0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72  ulValueLen = cer
17ac0 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
17ad0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
17ae0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
17af0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17b00 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
17b10 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
17b20 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
17b30 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
17b40 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
17b50 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43  _ISSUER:.....CAC
17b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17b70 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
17b80 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45  ribute CKA_ISSUE
17b90 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
17ba0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17bb0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17bc0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17bd0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
17be0 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
17bf0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
17c00 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
17c10 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
17c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17c30 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
17c40 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
17c50 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
17c60 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70  icate or Netscap
17c70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
17c80 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
17c90 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
17ca0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
17cb0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
17cc0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
17cd0 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69 66  to_issuer(certif
17ce0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
17cf0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
17d00 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
17d10 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
17d20 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
17d30 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
17d40 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
17d50 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
17d60 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
17d70 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
17d80 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17d90 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
17da0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
17db0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
17dc0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
17dd0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
17de0 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a  _SERIAL_NUMBER:.
17df0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17e00 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
17e10 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
17e20 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20  A_SERIAL_NUMBER 
17e30 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17e40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17e50 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17e60 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17e70 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
17e80 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
17e90 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
17ea0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
17eb0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17ec0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17ed0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17ee0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17ef0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
17f00 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20  ate or Netscape 
17f10 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17f20 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17f30 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
17f40 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
17f50 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
17f60 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
17f70 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
17f80 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
17f90 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
17fa0 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
17fb0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
17fc0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
17fd0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
17fe0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
17ff0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
18000 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
18010 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18020 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
18030 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
18040 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
18050 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
18060 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
18070 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
18080 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41  _SUBJECT:.....CA
18090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
180a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
180b0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a  tribute CKA_SUBJ
180c0 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ECT (0x%08lx) ..
180d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
180e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
180f0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
18100 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
18110 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
18120 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18130 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18140 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18150 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18160 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
18170 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  te");.......brea
18180 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
18190 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
181a0 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
181b0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
181c0 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
181d0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
181e0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
181f0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
18200 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
18210 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
18220 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
18230 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
18240 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
18250 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
18260 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
18270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18280 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18290 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
182a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
182b0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
182c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
182d0 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41  e CKA_ID:.....CA
182e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
182f0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18300 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28  tribute CKA_ID (
18310 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18320 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18330 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18340 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18350 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
18360 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
18370 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18380 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
18390 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
183a0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
183b0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
183c0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
183d0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
183e0 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20  ..ucTmpBuf[0] = 
183f0 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b  ((identity_num +
18400 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66   1) >> 8) & 0xff
18410 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31  ;.....ucTmpBuf[1
18420 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e  ] =  (identity_n
18430 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a  um + 1) & 0xff;.
18440 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75  .....pValue = &u
18450 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56  cTmpBuf;.....ulV
18460 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09  alueLen = 2;....
18470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18480 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
18490 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
184a0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
184b0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
184c0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
184d0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
184e0 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09  IFICATE_TYPE:...
184f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18500 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18510 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18520 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
18530 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
18540 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18550 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18560 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18570 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
18580 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
18590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
185a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
185b0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
185c0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
185d0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 2e  t a certificate.
185e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
185f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
18600 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
18610 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  ne certificate t
18620 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65  ype */.....ck_ce
18630 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d  rtificate_type =
18640 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09   CKC_X_509;.....
18650 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65  .pValue = &ck_ce
18660 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
18670 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18680 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69   sizeof(ck_certi
18690 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09  ficate_type);...
186a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
186b0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
186c0 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39  urning CKC_X_509
186d0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
186e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
186f0 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
18700 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
18710 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
18720 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
18730 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
18740 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
18750 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09  A_KEY_TYPE:.....
18760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18770 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18780 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45  attribute CKA_KE
18790 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29  Y_TYPE (0x%08lx)
187a0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
187b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
187c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
187d0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
187e0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
187f0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
18800 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  = CKO_PUBLIC_KEY
18810 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18830 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18840 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18850 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22   are not a key."
18860 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
18870 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
18880 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e   only support on
18890 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09  e key type */...
188a0 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20  ..ck_key_type = 
188b0 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56  CKK_RSA;......pV
188c0 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74  alue = &ck_key_t
188d0 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
188e0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
188f0 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  key_type);......
18900 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18910 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18920 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75  ing CKK_RSA (%lu
18930 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
18940 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
18950 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
18960 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
18970 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18980 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18990 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
189a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47  ....case CKA_SIG
189b0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
189c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
189d0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
189e0 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38   CKA_SIGN (0x%08
189f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18a00 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18a10 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18a20 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18a30 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
18a40 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18a50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18a60 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18a70 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18a80 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
18a90 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
18aa0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
18ab0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
18ac0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
18ad0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
18ae0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
18af0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
18b00 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18b10 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
18b20 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
18b30 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
18b40 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
18b50 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
18b60 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
18b70 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18b80 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18b90 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18ba0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18bb0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18bc0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18bd0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18be0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18bf0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18c00 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
18c10 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43  RECOVER:.....CAC
18c20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18c30 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18c40 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f  ribute CKA_SIGN_
18c50 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78  RECOVER (0x%08lx
18c60 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
18c70 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
18c80 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18c90 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
18ca0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
18cb0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
18cc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18cd0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
18ce0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
18cf0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
18d00 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
18d10 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
18d20 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65  ....}....../* We
18d30 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20   currently only 
18d40 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77 69  support "Sign wi
18d50 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a  th Appendix" */.
18d60 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18d70 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
18d80 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18d90 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
18da0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18db0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18dc0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18dd0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18de0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18df0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18e00 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18e10 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18e20 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18e30 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a  ase CKA_DECRYPT:
18e40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18e50 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18e60 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18e70 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25 30  KA_DECRYPT (0x%0
18e80 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18e90 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18ea0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18eb0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18ec0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18ed0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18ee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18ef0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
18f00 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
18f10 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
18f20 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18f30 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
18f40 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
18f50 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
18f60 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
18f70 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   || objectclass 
18f80 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  == CKO_PUBLIC_KE
18f90 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
18fa0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
18fb0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
18fc0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
18fd0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
18fe0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
18ff0 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  alse;......ulVal
19000 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
19010 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
19020 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19030 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19040 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
19050 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
19060 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
19070 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
19080 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
19090 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
190a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
190b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e  ....case CKA_SEN
190c0 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b  SITIVE:.....CACK
190d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
190e0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
190f0 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54  ibute CKA_SENSIT
19100 49 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IVE (0x%08lx) ..
19110 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19120 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19130 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19140 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
19150 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19160 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19180 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19190 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
191a0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
191b0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
191c0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
191d0 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
191e0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
191f0 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
19200 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
19210 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
19220 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
19230 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
19240 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
19250 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
19260 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19270 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
19280 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
19290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
192a0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
192b0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
192c0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
192d0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
192e0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
192f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19300 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19310 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19320 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
19330 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19340 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19350 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19360 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20  CKA_EXTRACTABLE 
19370 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19380 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19390 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
193a0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
193b0 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
193c0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
193d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
193e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
193f0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19400 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19410 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
19420 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
19430 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
19440 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
19450 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
19460 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
19470 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
19480 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
19490 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
194a0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
194b0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
194c0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
194d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
194e0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
194f0 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19510 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
19520 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
19530 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
19540 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
19550 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
19560 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19570 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19580 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19590 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41  _MODULUS:.....CA
195a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
195b0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
195c0 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55  tribute CKA_MODU
195d0 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUS (0x%08lx) ..
195e0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
195f0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19600 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19610 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
19620 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19630 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19650 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19660 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19670 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
19680 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19690 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
196a0 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
196b0 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
196c0 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
196d0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
196e0 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69 63  modulus(certific
196f0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
19700 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
19710 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
19720 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
19730 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
19740 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
19750 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
19760 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
19770 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
19780 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19790 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
197a0 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
197b0 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
197c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
197d0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
197e0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
197f0 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
19800 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19810 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19820 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19830 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
19840 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ENT (0x%08lx) ..
19850 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19860 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19870 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19880 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
19890 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
198a0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
198b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
198c0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
198d0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
198e0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
198f0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19900 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
19910 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
19920 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
19930 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
19940 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
19950 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66 69  exponent(certifi
19960 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
19970 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
19980 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
19990 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
199a0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
199b0 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
199c0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
199d0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
199e0 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
199f0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19a00 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19a10 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
19a20 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
19a30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19a40 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19a50 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
19a60 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f  A_TRUST_DIGITAL_
19a70 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63 61  SIGNATURE:....ca
19a80 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e  se CKA_TRUST_NON
19a90 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09  _REPUDIATION:...
19aa0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
19ab0 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54  KEY_ENCIPHERMENT
19ac0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
19ad0 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45  UST_DATA_ENCIPHE
19ae0 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  RMENT:....case C
19af0 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47 52  KA_TRUST_KEY_AGR
19b00 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  EEMENT:....case 
19b10 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45  CKA_TRUST_KEY_CE
19b20 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65  RT_SIGN:....case
19b30 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53   CKA_TRUST_CRL_S
19b40 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  IGN:....case CKA
19b50 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55  _TRUST_SERVER_AU
19b60 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  TH:....case CKA_
19b70 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54  TRUST_CLIENT_AUT
19b80 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  H:....case CKA_T
19b90 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e  RUST_CODE_SIGNIN
19ba0 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  G:....case CKA_T
19bb0 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45  RUST_EMAIL_PROTE
19bc0 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45  CTION:.....CACKE
19bd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19be0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
19bf0 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e  bute CKA_TRUST_.
19c00 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  .. (0x%08lx) ...
19c10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19c20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19c30 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
19c40 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09  = &ck_trusted;..
19c50 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19c60 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74 65  sizeof(ck_truste
19c70 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  d);......CACKEY_
19c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19c90 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
19ca0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
19cb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
19cc0 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c 75  K_TRUST *) pValu
19cd0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
19ce0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19cf0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19d00 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19d10 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 3a  _CERT_SHA1_HASH:
19d20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19d30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
19d40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
19d50 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53  KA_CERT_SHA1_HAS
19d60 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
19d70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19d80 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
19d90 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
19da0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
19db0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
19dc0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19dd0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19de0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19df0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19e00 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
19e10 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
19e20 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19e30 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65 73  ..}......SHA1Res
19e40 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a 09  et(&sha1_ctx);..
19e50 09 09 09 53 48 41 31 49 6e 70 75 74 28 26 73 68  ...SHA1Input(&sh
19e60 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63  a1_ctx, certific
19e70 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
19e80 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31 52  _len);.....SHA1R
19e90 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78 2c  esult(&sha1_ctx,
19ea0 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09   sha1_hash);....
19eb0 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31 5f  ..pValue = sha1_
19ec0 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
19ed0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68  eLen = sizeof(sh
19ee0 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43  a1_hash);......C
19ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19f00 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
19f10 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
19f20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
19f30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
19f40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19f50 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44  case CKA_CERT_MD
19f60 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b  5_HASH:.....CACK
19f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19f80 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
19f90 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d  ibute CKA_CERT_M
19fa0 44 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78  D5_HASH (0x%08lx
19fb0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
19fc0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
19fd0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
19fe0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
19ff0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
1a000 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
1a010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a020 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
1a030 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
1a040 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
1a050 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
1a060 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
1a070 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d  ak;.....}......M
1a080 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78 29  D5Init(&md5_ctx)
1a090 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65 28  ;.....MD5Update(
1a0a0 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69 66  &md5_ctx, certif
1a0b0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
1a0c0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35  te_len);.....MD5
1a0d0 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20  Final(md5_hash, 
1a0e0 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09  &md5_ctx);......
1a0f0 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73  pValue = md5_has
1a100 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  h;.....ulValueLe
1a110 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68  n = sizeof(md5_h
1a120 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ash);......CACKE
1a130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a140 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
1a150 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
1a160 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1a170 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a180 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61  ..break;....defa
1a190 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20  ult:.....pValue 
1a1a0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61  = NULL;.....ulVa
1a1b0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
1a1c0 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b  G) -1;.....break
1a1d0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43  ;...}....if (((C
1a1e0 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c  K_LONG) ulValueL
1a1f0 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47  en) != ((CK_LONG
1a200 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50  ) -1)) {..../* P
1a210 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e  ush curr_attr on
1a220 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a  to the stack */.
1a230 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70  ...curr_attr.typ
1a240 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79  e = curr_attr_ty
1a250 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  pe;....curr_attr
1a260 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c  .ulValueLen = ul
1a270 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75  ValueLen;.....cu
1a280 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d  rr_attr.pValue =
1a290 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74   malloc(curr_att
1a2a0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09  r.ulValueLen);..
1a2b0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
1a2c0 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  tr.pValue, pValu
1a2d0 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  e, curr_attr.ulV
1a2e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66  alueLen);.....if
1a2f0 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26   (pValue_free &&
1a300 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66   pValue) {.....f
1a310 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  ree(pValue);....
1a320 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74  }.....if (numatt
1a330 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75  rs >= retval_cou
1a340 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c  nt) {.....retval
1a350 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
1a360 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
1a370 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
1a380 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d  ));....}.....mem
1a390 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61  cpy(&retval[numa
1a3a0 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74  ttrs], &curr_att
1a3b0 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  r, sizeof(curr_a
1a3c0 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74  ttr));....numatt
1a3d0 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  rs++;...}..}...i
1a3e0 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30  f (numattrs != 0
1a3f0 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75  ) {...retval_cou
1a400 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09  nt = numattrs;..
1a410 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
1a420 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
1a430 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
1a440 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c  *retval));..} el
1a450 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76  se {...free(retv
1a460 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d  al);....retval =
1a470 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c   NULL;..}...*pul
1a480 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  Count = numattrs
1a490 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1a4a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1a4b0 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28  ng %lu objects (
1a4c0 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c  %p).", numattrs,
1a4d0 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61 6c   (void *) retval
1a4e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
1a4f0 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  al);.}..static v
1a500 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
1a510 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1a520 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1a530 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
1a540 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
1a550 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
1a560 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
1a570 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69  curr_attr;..unsi
1a580 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78  gned long id_idx
1a590 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66  , attr_idx;...if
1a5a0 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20   (identities == 
1a5b0 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69  NULL || identiti
1a5c0 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  es_count == 0) {
1a5d0 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
1a5e0 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b  for (id_idx = 0;
1a5f0 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69   id_idx < identi
1a600 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69  ties_count; id_i
1a610 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64  dx++) {...if (id
1a620 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a630 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09  .attributes) {..
1a640 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20  ..for (attr_idx 
1a650 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20  = 0; attr_idx < 
1a660 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1a670 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
1a680 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29  unt; attr_idx++)
1a690 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72   {.....curr_attr
1a6a0 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69   = &identities[i
1a6b0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a6c0 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09  s[attr_idx];....
1a6d0 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
1a6e0 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  >pValue) {......
1a6f0 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e  free(curr_attr->
1a700 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09  pValue);.....}..
1a710 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e  ..}.....if (iden
1a720 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a730 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09  ttributes) {....
1a740 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73  .free(identities
1a750 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a760 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  tes);....}.....c
1a770 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1a780 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1a790 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1a7a0 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d  y, 1, 1);...}..}
1a7b0 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74 69  ...free(identiti
1a7c0 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  es);.}..static u
1a7d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
1a7e0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1a7f0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
1a800 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1a810 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
1a820 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f  gned long num_do
1a830 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73 69  d_certs) {..unsi
1a840 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69  gned long cert_i
1a850 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a  dx, id_idx = 0;.
1a860 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1a870 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
1a880 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72  turn(num_dod_cer
1a890 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f  ts * 3);..}...fo
1a8a0 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b  r (cert_idx = 0;
1a8b0 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f   cert_idx < num_
1a8c0 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  dod_certs; cert_
1a8d0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74  idx++) {...ident
1a8e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1a8f0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1a900 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1a910 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a920 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1a930 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1a940 43 45 52 54 49 46 49 43 41 54 45 2c 20 26 65 78  CERTIFICATE, &ex
1a950 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
1a960 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
1a970 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1a980 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a990 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
1a9a0 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64  .id_idx++;....id
1a9b0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a9c0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1a9d0 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74   NULL;...identit
1a9e0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a9f0 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1aa00 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
1aa10 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26  KO_PUBLIC_KEY, &
1aa20 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1aa30 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1aa40 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1aa50 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1aa60 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1aa70 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09  ...id_idx++;....
1aa80 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1aa90 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1aaa0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
1aab0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1aac0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1aad0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1aae0 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52  (CKO_NETSCAPE_TR
1aaf0 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74  UST, &extra_cert
1ab00 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66  s[cert_idx], 0xf
1ab10 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20  000 | cert_idx, 
1ab20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
1ab30 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1ab40 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b  ount);...id_idx+
1ab50 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69  +;..}...return(i
1ab60 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69  d_idx);.}..stati
1ab70 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
1ab80 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
1ab90 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
1aba0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
1abb0 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
1abc0 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f  ned long *ids_fo
1abd0 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63  und) {..struct c
1abe0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
1abf0 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
1ac00 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61  ties;..struct ca
1ac10 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
1ac20 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
1ac30 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64  gned long num_id
1ac40 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  s, id_idx, curr_
1ac50 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e  id_type;..unsign
1ac60 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74  ed long num_cert
1ac70 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  s, num_dod_certs
1ac80 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74  , cert_idx;..int
1ac90 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63   include_extra_c
1aca0 65 72 74 73 20 3d 20 30 2c 20 69 6e 63 6c 75 64  erts = 0, includ
1acb0 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43  e_dod_certs;...C
1acc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1acd0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1ace0 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d  .if (ids_found =
1acf0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1ad00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ad10 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75  "Error.  ids_fou
1ad20 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  nd is NULL");...
1ad30 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
1ad40 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
1ad50 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55  _CARD_SLOT_INCLU
1ad60 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09  DE_EXTRA_CERTS..
1ad70 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1ad80 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  rts = 1;.#endif.
1ad90 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1ada0 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f  CKEY_DOD_CERTS_O
1adb0 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20  N_HW_SLOTS") != 
1adc0 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1add0 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1ade0 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  1;..}...if (gete
1adf0 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f  nv("CACKEY_NO_DO
1ae00 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
1ae10 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
1ae20 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
1ae30 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _certs = 0;..}..
1ae40 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f  #ifdef CACKEY_NO
1ae50 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66  _EXTRA_CERTS..if
1ae60 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1ae70 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1ae80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1ae90 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1aea0 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  1;..} else {...i
1aeb0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1aec0 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09   = 0;..}.#else..
1aed0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1aee0 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
1aef0 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1af00 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1af10 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  ts = 0;..} else 
1af20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1af30 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65  certs = 1;..}.#e
1af40 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75  ndif...if (inclu
1af50 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a  de_dod_certs) {.
1af60 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  ..num_dod_certs 
1af70 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  = sizeof(extra_c
1af80 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 65  erts) / sizeof(e
1af90 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a  xtra_certs[0]);.
1afa0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f  .} else {...num_
1afb0 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1afc0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e  }...if (slot->in
1afd0 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f  ternal) {...num_
1afe0 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ids = cackey_rea
1aff0 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1b000 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63  (NULL, num_dod_c
1b010 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75  erts);....if (nu
1b020 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09  m_ids != 0) {...
1b030 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
1b040 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
1b050 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1b060 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  s));.....cackey_
1b070 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1b080 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20  ies(identities, 
1b090 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1b0a0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64  ..} else {....id
1b0b0 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
1b0c0 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75  ...}....*ids_fou
1b0d0 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1b0e0 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1b0f0 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69  es);..}...pcsc_i
1b100 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
1b110 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c  ey_read_certs(sl
1b120 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  ot, NULL, &num_c
1b130 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63  erts);..if (pcsc
1b140 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e  _identities != N
1b150 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76  ULL) {.../* Conv
1b160 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65  ert number of Ce
1b170 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66  rts to number of
1b180 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75   objects */...nu
1b190 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49  m_ids = (CKO_PRI
1b1a0 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43  VATE_KEY - CKO_C
1b1b0 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29 20  ERTIFICATE + 1) 
1b1c0 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09  * num_certs;....
1b1d0 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
1b1e0 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75  a_certs) {....nu
1b1f0 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f  m_ids += cackey_
1b200 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1b210 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f  ies(NULL, num_do
1b220 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
1b230 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61  .identities = ma
1b240 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73  lloc(num_ids * s
1b250 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1b260 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63  s));..../* Add c
1b270 65 72 74 69 66 69 63 61 74 65 73 2c 20 70 75 62  ertificates, pub
1b280 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72  lic keys, and pr
1b290 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20  ivate keys from 
1b2a0 74 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f  the smartcard */
1b2b0 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09  ...id_idx = 0;..
1b2c0 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
1b2d0 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
1b2e0 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69  um_certs; cert_i
1b2f0 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28  dx++) {....for (
1b300 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43  curr_id_type = C
1b310 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20  KO_CERTIFICATE; 
1b320 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20  curr_id_type <= 
1b330 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b  CKO_PRIVATE_KEY;
1b340 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29   curr_id_type++)
1b350 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65   {.....identitie
1b360 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1b370 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1b380 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75 72  t_attributes(cur
1b390 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63  r_id_type, &pcsc
1b3a0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1b3b0 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c  _idx], cert_idx,
1b3c0 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1b3d0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1b3e0 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65  count);......ide
1b3f0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b400 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
1b410 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69  malloc(sizeof(*i
1b420 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1b430 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
1b440 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
1b450 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1b460 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
1b470 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  &pcsc_identities
1b480 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65  [cert_idx], size
1b490 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69  of(*identities[i
1b4a0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1b4b0 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65  tity));......ide
1b4c0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b4d0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
1b4e0 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
1b4f0 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74  loc(pcsc_identit
1b500 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1b510 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
1b520 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74  ....memcpy(ident
1b530 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1b540 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
1b550 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
1b560 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1b570 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c  dx].certificate,
1b580 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
1b590 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1b5a0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
1b5b0 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d  ..id_idx++;....}
1b5c0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c  ...}....if (incl
1b5d0 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
1b5e0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1b5f0 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
1b600 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d 65  ding US Governme
1b610 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73 20  nt Certificates 
1b620 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74  on hardware slot
1b630 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72  ");.....cackey_r
1b640 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1b650 65 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20  es(identities + 
1b660 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f  id_idx, num_dod_
1b670 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63  certs);...}....c
1b680 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1b690 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1b6a0 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b  , num_certs, 1);
1b6b0 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d  ....*ids_found =
1b6c0 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74   num_ids;....ret
1b6d0 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b  urn(identities);
1b6e0 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e  ..}....*ids_foun
1b6f0 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e  d = 0;..return(N
1b700 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ULL);.}..CK_DEFI
1b710 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b720 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29  V, C_Initialize)
1b730 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e  (CK_VOID_PTR pIn
1b740 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f  itArgs) {..CK_C_
1b750 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20  INITIALIZE_ARGS 
1b760 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69  CK_PTR args;..ui
1b770 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68  nt32_t idx, high
1b780 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d  est_slot;..int m
1b790 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 09  utex_init_ret;..
1b7a0 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  int include_dod_
1b7b0 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  certs;...CACKEY_
1b7c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b7d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
1b7e0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b7f0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b800 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b810 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74  r.  Already init
1b820 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b830 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b840 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49  KI_ALREADY_INITI
1b850 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1b860 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e   (pInitArgs != N
1b870 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20  ULL) {...args = 
1b880 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d  pInitArgs;...mem
1b890 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73  cpy(&cackey_args
1b8a0 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63  , args, sizeof(c
1b8b0 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09  ackey_args));...
1b8c0 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1b8d0 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  eMutex == NULL |
1b8e0 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1b8f0 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
1b900 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1b910 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1b920 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  >UnlockMutex == 
1b930 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61  NULL) {....if (a
1b940 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
1b950 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1b960 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21  ->DestroyMutex !
1b970 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1b980 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  LockMutex != NUL
1b990 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
1b9a0 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20  kMutex != NULL) 
1b9b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
1b9c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b9d0 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20  . Some, but not 
1b9e0 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72  All threading pr
1b9f0 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65  imitives provide
1ba00 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
1ba10 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1ba20 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  BAD);....}...}..
1ba30 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
1ba40 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
1ba50 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1ba60 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
1ba70 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1ba80 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
1ba90 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1baa0 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
1bab0 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1bac0 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
1bad0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ags = 0;..}...fo
1bae0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1baf0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1bb00 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1bb10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1bb20 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1bb30 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
1bb40 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
1bb50 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1bb60 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1bb70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1bb80 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1bb90 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1bba0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
1bbb0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
1bbc0 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b  tive = 0;...cack
1bbd0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1bbe0 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1bbf0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1bc00 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
1bc10 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63  n_depth = 0;...c
1bc20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1bc30 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
1bc40 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
1bc50 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1bc60 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
1bc70 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1bc80 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  s[idx].token_fla
1bc90 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  gs = 0;...cackey
1bca0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
1bcb0 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  l = NULL;...cack
1bcc0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
1bcd0 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  ternal = 0;..}..
1bce0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e 4f  #ifdef CACKEY_NO
1bcf0 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 66  _EXTRA_CERTS..if
1bd00 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1bd10 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1bd20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1bd30 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1bd40 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  1;..} else {...i
1bd50 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1bd60 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a 09   = 0;..}.#else..
1bd70 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1bd80 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
1bd90 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1bda0 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72  .include_dod_cer
1bdb0 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20  ts = 0;..} else 
1bdc0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1bdd0 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23 65  certs = 1;..}.#e
1bde0 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c 75  ndif...if (inclu
1bdf0 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 3d 20  de_dod_certs == 
1be00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1be10 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65  BUG_PRINTF("Aske
1be20 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65  d not to include
1be30 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74 65   DoD certificate
1be40 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  s");..} else {..
1be50 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20  .highest_slot = 
1be60 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1be70 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1be80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1be90 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   - 1;....CACKEY_
1bea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
1beb0 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74  cluding DoD cert
1bec0 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20  s in slot %lu", 
1bed0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1bee0 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a  highest_slot);..
1bef0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1bf00 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74  ighest_slot].act
1bf10 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65  ive = 1;...cacke
1bf20 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1bf30 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d  slot].internal =
1bf40 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   1;...cackey_slo
1bf50 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1bf60 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e  .label = (unsign
1bf70 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20 47  ed char *) "US G
1bf80 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66  overnment Certif
1bf90 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65  icates";...cacke
1bfa0 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1bfb0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1bfc0 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09  r = "CACKey";...
1bfd0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1bfe0 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  hest_slot].token
1bff0 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  _flags = 0;..}..
1c000 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1c010 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21  zed = 1;...if (!
1c020 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
1c030 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69  nit) {...mutex_i
1c040 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  nit_ret = cackey
1c050 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26 63  _mutex_create(&c
1c060 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1c070 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69  ...if (mutex_ini
1c080 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  t_ret != 0) {...
1c090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c0a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75  INTF("Error.  Mu
1c0b0 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tex initializati
1c0c0 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  on failed.");...
1c0d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e  ..return(CKR_CAN
1c0e0 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09  T_LOCK);...}....
1c0f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69  cackey_biglock_i
1c100 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a  nit = 1;..}.../*
1c110 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e   Define a comman
1c120 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73 65 72  d to prompt user
1c130 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69   for a PIN */.#i
1c140 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f  fdef CACKEY_PIN_
1c150 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a  COMMAND_DEFAULT.
1c160 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  .cackey_pin_comm
1c170 61 6e 64 20 3d 20 43 41 43 4b 45 59 5f 50 49 4e  and = CACKEY_PIN
1c180 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1c190 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e  _XSTR(CACKEY_PIN
1c1a0 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
1c1b0 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
1c1c0 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  f CACKEY_PIN_COM
1c1d0 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55  MAND_XONLY_DEFAU
1c1e0 4c 54 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  LT..if (getenv("
1c1f0 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c  DISPLAY") != NUL
1c200 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69  L) {...cackey_pi
1c210 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 43 41 43 4b  n_command = CACK
1c220 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44  EY_PIN_COMMAND_D
1c230 45 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b  EFAULT_XSTR(CACK
1c240 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1c250 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29 3b 0a 09  ONLY_DEFAULT);..
1c260 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67  }.#endif...if (g
1c270 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1c280 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20 4e  N_COMMAND") != N
1c290 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1c2a0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67 65  pin_command = ge
1c2b0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1c2c0 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a 09 7d 0a 0a  _COMMAND");..}..
1c2d0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1c2e0 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1c2f0 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20  XONLY") != NULL 
1c300 26 26 20 67 65 74 65 6e 76 28 22 44 49 53 50 4c  && getenv("DISPL
1c310 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  AY") != NULL) {.
1c320 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1c330 6d 61 6e 64 20 3d 20 67 65 74 65 6e 76 28 22 43  mand = getenv("C
1c340 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c350 44 5f 58 4f 4e 4c 59 22 29 3b 0a 09 7d 0a 0a 09  D_XONLY");..}...
1c360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c370 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1c380 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1c390 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1c3a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1c3b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1c3c0 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29  _RV, C_Finalize)
1c3d0 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65  (CK_VOID_PTR pRe
1c3e0 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33  served) {..uint3
1c3f0 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  2_t idx;...CACKE
1c400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c410 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c420 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55  (pReserved != NU
1c430 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1c440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c450 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73  or. pReserved is
1c460 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
1c470 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1c480 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1c490 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1c4a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1c4b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c4c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1c4d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1c4e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1c4f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1c500 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  LIZED);..}...for
1c510 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1c520 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1c530 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1c540 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1c550 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1c560 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
1c570 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1c580 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73  ive) {....C_Clos
1c590 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
1c5a0 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  .}..}...cackey_s
1c5b0 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
1c5c0 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64  all();...for (id
1c5d0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
1c5e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1c5f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c600 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
1c610 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
1c620 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1c630 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63  internal) {....c
1c640 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
1c650 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1c660 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65  [idx].pcsc_reade
1c670 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  r) {....free(cac
1c680 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1c690 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d  csc_reader);...}
1c6a0 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1c6b0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1c6c0 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63  _certs) {....cac
1c6d0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63  key_free_certs(c
1c6e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1c6f0 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63  .cached_certs, c
1c700 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1c710 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  .cached_certs_co
1c720 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63  unt, 1);.....cac
1c730 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1c740 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
1c750 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  LL;...}..}...cac
1c760 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
1c770 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f  ect();...cackey_
1c780 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
1c790 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c7a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c7b0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c7c0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c7d0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c7e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c7f0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66  (CK_RV, C_GetInf
1c800 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70  o)(CK_INFO_PTR p
1c810 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1c820 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1c830 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1c840 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1c850 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1c860 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73  8CHAR libraryDes
1c870 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
1c880 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f  CKey";...CACKEY_
1c890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1c8a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1c8b0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1c8c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c8d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1c8e0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1c8f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1c900 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1c910 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1c920 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1c930 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c940 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c950 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c960 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c970 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c980 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70  IALIZED);..}...p
1c990 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
1c9a0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28  rsion.major = ((
1c9b0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
1c9c0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
1c9d0 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
1c9e0 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
1c9f0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43  sion.minor = ((C
1ca00 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
1ca10 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
1ca20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d  8) & 0xff;...mem
1ca30 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
1ca40 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
1ca50 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1ca60 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
1ca70 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1ca80 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d  anufacturerID, m
1ca90 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73  anufacturerID, s
1caa0 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72  izeof(manufactur
1cab0 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49  erID) - 1);...pI
1cac0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30  nfo->flags = 0x0
1cad0 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  0;...memset(pInf
1cae0 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
1caf0 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65  ption, ' ', size
1cb00 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  of(pInfo->librar
1cb10 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  yDescription));.
1cb20 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c  .memcpy(pInfo->l
1cb30 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1cb40 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69  n, libraryDescri
1cb50 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69  ption, sizeof(li
1cb60 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1cb70 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
1cb80 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e  >libraryVersion.
1cb90 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1cba0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1cbb0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1cbc0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1cbd0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1cbe0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1cbf0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1cc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cc10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1cc20 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1cc30 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1cc40 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  KR_OK);.}../*. *
1cc50 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66   Process list of
1cc60 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72   readers, and cr
1cc70 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74  eate mapping bet
1cc80 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65  ween reader name
1cc90 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f   and slot ID. */
1cca0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ccb0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1ccc0 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f  SlotList)(CK_BBO
1ccd0 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c  OL tokenPresent,
1cce0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
1ccf0 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c  pSlotList, CK_UL
1cd00 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
1cd10 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20  ) {..static int 
1cd20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a  first_call = 1;.
1cd30 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1cd40 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e  l;..int pcsc_con
1cd50 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c  nect_ret;..CK_UL
1cd60 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  ONG count, slot_
1cd70 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73  count = 0, currs
1cd80 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09  lot, slot_idx;..
1cd90 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65  char *pcsc_reade
1cda0 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  rs, *pcsc_reader
1cdb0 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  s_s, *pcsc_reade
1cdc0 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73  rs_e;..DWORD pcs
1cdd0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09  c_readers_len;..
1cde0 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72  LONG scard_listr
1cdf0 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a  eaders_ret;..siz
1ce00 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f  e_t curr_reader_
1ce10 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72  len;..int slot_r
1ce20 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  eset;...CACKEY_D
1ce30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1ce40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75  led.");...if (pu
1ce50 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1ce60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ce70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1ce80 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
1ce90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cea0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1ceb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1cec0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1ced0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cef0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1cf00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cf10 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1cf20 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1cf30 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1cf40 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1cf50 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1cf60 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1cf70 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1cf80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cf90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1cfa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1cfb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1cfc0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1cfd0 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69  .}.../* Clear li
1cfe0 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09  st of slots */..
1cff0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
1d000 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
1d010 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61  {...if (first_ca
1d020 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63  ll) {....first_c
1d030 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f  all = 0;.....slo
1d040 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d  t_reset = 1;...}
1d050 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66  ..../* If any of
1d060 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20   the slots have 
1d070 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20  been reset then 
1d080 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  purge all inform
1d090 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20  ation and check 
1d0a0 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28  again */...for (
1d0b0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1d0c0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1d0d0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1d0e0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d0f0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1d100 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  lot++) {....if (
1d110 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d120 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1d130 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1d140 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
1d150 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d160 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1d170 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1d180 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65  .}.....if (cacke
1d190 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1d1a0 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
1d1b0 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ....slot_reset =
1d1c0 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a   1;......break;.
1d1d0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1d1e0 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
1d1f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d200 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c  INTF("Purging al
1d210 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  l slot informati
1d220 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e  on.");...../* On
1d230 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69  ly update the li
1d240 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77  st of slots if w
1d250 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62  e are actually b
1d260 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20  eing supply the 
1d270 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1d280 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c   */....cackey_sl
1d290 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1d2a0 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63  ll();.....for (c
1d2b0 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1d2c0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1d2d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1d2e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1d2f0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1d300 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  ot++) {.....if (
1d310 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d320 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29  rslot].internal)
1d330 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65   {......continue
1d340 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1d350 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1d360 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1d370 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65  der) {......free
1d380 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1d390 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1d3a0 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b  der);.......cack
1d3b0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d3c0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1d3d0 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09   NULL;.....}....
1d3e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1d3f0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1d400 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  el) {......free(
1d410 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d420 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a  rslot].label);..
1d430 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1d440 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1d450 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  l = NULL;.....}.
1d460 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1d470 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1d480 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  ve = 0;....}...}
1d490 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a   else {.......}.
1d4a0 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
1d4b0 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  e list of reader
1d4c0 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  s */..pcsc_conne
1d4d0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
1d4e0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1d4f0 2f 2a 20 58 58 58 3a 20 43 41 4e 20 48 41 4e 47  /* XXX: CAN HANG
1d500 20 48 45 52 45 20 21 20 2a 2f 0a 09 69 66 20 28   HERE ! */..if (
1d510 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1d520 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1d530 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
1d540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1d550 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1d560 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
1d570 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
1d580 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1d590 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
1d5a0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
1d5b0 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
1d5c0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1d5d0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1d5e0 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1d5f0 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1d600 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1d610 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
1d620 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1d630 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
1d640 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
1d650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d660 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
1d670 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
1d680 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
1d690 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
1d6a0 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
1d6b0 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
1d6c0 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
1d6d0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
1d6e0 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
1d6f0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
1d700 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
1d710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d720 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
1d730 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
1d740 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
1d750 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d760 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1d770 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1d780 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
1d790 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
1d7a0 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
1d7b0 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1d7c0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1d7d0 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
1d7e0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1d7f0 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
1d800 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
1d810 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
1d820 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
1d830 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
1d840 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
1d850 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d860 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1d870 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1d880 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
1d890 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
1d8a0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1d8b0 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1d8c0 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1d8d0 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1d8e0 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
1d8f0 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
1d900 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
1d910 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f  ders_len;....../
1d920 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
1d930 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
1d940 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
1d950 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20   RHEL */...../* 
1d960 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
1d970 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
1d980 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
1d990 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
1d9a0 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d  /.....currslot =
1d9b0 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75   1;.....slot_cou
1d9c0 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  nt = 0;.....whil
1d9d0 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
1d9e0 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
1d9f0 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64  ) {....../* Find
1da00 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
1da10 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72  slot */......for
1da20 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   (; currslot < (
1da30 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1da40 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1da50 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1da60 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1da70 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1da80 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1da90 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1daa0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
1dab0 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75  ......}.......cu
1dac0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
1dad0 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
1dae0 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
1daf0 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
1db00 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
1db10 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
1db20 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
1db30 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
1db40 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
1db50 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
1db60 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1db70 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
1db80 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
1db90 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1dba0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1dbb0 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
1dbc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dbd0 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
1dbe0 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
1dbf0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
1dc00 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1dc10 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
1dc20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dc30 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
1dc40 3a 20 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d  : %s (currslot =
1dc50 20 25 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61   %lu)", pcsc_rea
1dc60 64 65 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20  ders, (unsigned 
1dc70 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
1dc80 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  ......./* Only u
1dc90 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
1dca0 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
1dcb0 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
1dcc0 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68   asked supply th
1dcd0 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
1dce0 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70  on */......if (p
1dcf0 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09  SlotList) {.....
1dd00 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74  ..if (slot_reset
1dd10 29 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  ) {........cacke
1dd20 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1dd30 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
1dd40 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1dd50 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1dd60 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09  rnal = 0;.......
1dd70 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1dd80 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1dd90 64 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73  der = strdup(pcs
1dda0 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09  c_readers);.....
1ddb0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ddc0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63  currslot].pcsc_c
1ddd0 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
1dde0 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1ddf0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1de00 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  .transaction_dep
1de10 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  th = 0;........c
1de20 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1de30 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
1de40 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
1de50 20 30 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63   0;........if (c
1de60 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1de70 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  d == NULL) {....
1de80 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1de90 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65  s[currslot].toke
1dea0 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
1deb0 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09  GIN_REQUIRED;...
1dec0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1ded0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1dee0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b  ts[currslot].tok
1def0 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09  en_flags = 0;...
1df00 09 09 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61  .....}........ca
1df10 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1df20 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  lot].label = NUL
1df30 4c 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65  L;.........cacke
1df40 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
1df50 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1df60 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09  currslot]);.....
1df70 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  ..}......} else 
1df80 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63 61 63  {.......if (!cac
1df90 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1dfa0 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1dfb0 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69  ...../* Artifici
1dfc0 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68  ally increase th
1dfd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  e number of acti
1dfe0 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74  ve slots by what
1dff0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74   will become act
1e000 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41  ive */........CA
1e010 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e020 46 28 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69  F("Found in-acti
1e030 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74  ve slot %lu, but
1e040 20 69 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69   it will be acti
1e050 76 65 20 61 66 74 65 72 20 61 20 72 65 73 65 74  ve after a reset
1e060 20 2d 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61   -- marking as a
1e070 63 74 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e  ctive for accoun
1e080 74 69 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20  ting purposes", 
1e090 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1e0a0 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  currslot);......
1e0b0 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
1e0c0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1e0d0 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b  .....currslot++;
1e0e0 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64  .......pcsc_read
1e0f0 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64  ers += curr_read
1e100 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09  er_len + 1;.....
1e110 7d 0a 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72  }......for (curr
1e120 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
1e130 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1e140 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1e150 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1e160 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
1e170 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61  +) {......if (ca
1e180 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e190 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1e1a0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1e1b0 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1e1c0 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c  active slot %lu,
1e1d0 20 72 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28   reader = %s", (
1e1e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1e1f0 75 72 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f  urrslot, cackey_
1e200 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1e210 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
1e220 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b  .....slot_count+
1e230 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  +;......}.....}.
1e240 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1e250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e260 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c  NTF("Second call
1e270 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
1e280 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
1e290 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
1e2a0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
1e2b0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
1e2c0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1e2d0 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
1e2e0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1e2f0 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  ret);....}.....f
1e300 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73  ree(pcsc_readers
1e310 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  _s);...} else {.
1e320 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e330 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61  PRINTF("First ca
1e340 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52  ll to SCardListR
1e350 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72  eaders failed, r
1e360 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43  eturn %s/%li", C
1e370 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
1e380 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
1e390 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1e3a0 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  rs_ret), (long) 
1e3b0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1e3c0 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  s_ret);...}..}..
1e3d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1e3e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1e3f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e400 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1e410 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1e420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e430 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1e440 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1e450 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e460 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e470 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c  ..}...if (pSlotL
1e480 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
1e490 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
1e4a0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b  t_count;....CACK
1e4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e4c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e4d0 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
1e4e0 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74 20  lu readers, but 
1e4f0 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20  not storing IDs 
1e500 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
1e510 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  LL)", CKR_OK, (u
1e520 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
1e530 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  ot_count);....re
1e540 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
1e550 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43  ...count = *pulC
1e560 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74  ount;..if (count
1e570 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b   < slot_count) {
1e580 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e590 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55  PRINTF("Error. U
1e5a0 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c  ser allocated %l
1e5b0 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77  u entries, but w
1e5c0 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69  e have %lu entri
1e5d0 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  es.", count, slo
1e5e0 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43  t_count);....CAC
1e5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e600 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1e610 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1e620 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e630 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1e640 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78  LL);...}...mutex
1e650 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e660 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e670 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e680 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e690 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e6a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e6b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1e6c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e6d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e6e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  RROR);..}...slot
1e6f0 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
1e700 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63  currslot = 0; (c
1e710 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1e720 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1e730 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1e740 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72  slots[0]))); cur
1e750 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20  rslot++) {...if 
1e760 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1e770 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1e780 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a   {....continue;.
1e790 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
1e7a0 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a  idx >= count) {.
1e7b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e7c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55  PRINTF("Error. U
1e7d0 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c  ser allocated %l
1e7e0 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77  u entries, but w
1e7f0 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20  e just tried to 
1e800 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75  write to the %lu
1e810 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69   index -- ignori
1e820 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  ng", count, slot
1e830 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  _idx);.....conti
1e840 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f  nue;...}....pSlo
1e850 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20  tList[slot_idx] 
1e860 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c  = currslot;...sl
1e870 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d  ot_idx++;..}...m
1e880 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e890 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e8a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e8b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1e8c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1e8d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e8e0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1e8f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e900 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e910 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e920 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
1e930 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41  slot_count;...CA
1e940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e950 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e960 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64  _OK (%i).  Found
1e970 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20   %lu readers.", 
1e980 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
1e990 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
1e9a0 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
1e9b0 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72  R_OK);...tokenPr
1e9c0 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65  esent = tokenPre
1e9d0 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73  sent; /* Supress
1e9e0 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
1e9f0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
1ea00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1ea10 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
1ea20 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  otInfo)(CK_SLOT_
1ea30 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c  ID slotID, CK_SL
1ea40 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  OT_INFO_PTR pInf
1ea50 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
1ea60 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73  UTF8CHAR slotDes
1ea70 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
1ea80 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74  CKey Slot";..int
1ea90 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1eaa0 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  int bytes_to_cop
1eab0 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  y;...CACKEY_DEBU
1eac0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1ead0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1eae0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1eaf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb00 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1eb10 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1eb20 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1eb30 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1eb40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1eb50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1eb60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eb70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1eb80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1eb90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1eba0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ebb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1ebc0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1ebd0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1ebe0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1ebf0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ec00 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1ec10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ec20 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1ec30 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1ec40 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1ec50 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1ec60 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1ec70 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1ec80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1ec90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1eca0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1ecb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ecc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1ecd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1ece0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ecf0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1ed00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1ed10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1ed20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1ed30 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1ed40 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1ed50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ed60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ed70 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1ed80 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1ed90 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1eda0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1edb0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1edc0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1edd0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ede0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1edf0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1ee00 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  .}...pInfo->flag
1ee10 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b  s = CKF_HW_SLOT;
1ee20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1ee30 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74  lots[slotID].int
1ee40 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f  ernal) {...pInfo
1ee50 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52  ->flags |= CKF_R
1ee60 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b  EMOVABLE_DEVICE;
1ee70 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1ee80 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1ee90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1eea0 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f  tID]) == CACKEY_
1eeb0 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
1eec0 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ENT) {...pInfo->
1eed0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b  flags |= CKF_TOK
1eee0 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a  EN_PRESENT;..}..
1eef0 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
1ef00 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73   strlen(cackey_s
1ef10 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73  lots[slotID].pcs
1ef20 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28  c_reader);..if (
1ef30 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1ef40 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20  nufacturerID) < 
1ef50 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
1ef60 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
1ef70 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d   = sizeof(pInfo-
1ef80 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1ef90 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e  ;..}..memcpy(pIn
1efa0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1efb0 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ID, cackey_slots
1efc0 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
1efd0 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63  ader, bytes_to_c
1efe0 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  opy);...mutex_re
1eff0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f000 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f010 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f020 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f030 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f050 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f060 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f070 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f080 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d  ERROR);..}...mem
1f090 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  set(pInfo->slotD
1f0a0 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c  escription, ' ',
1f0b0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73   sizeof(pInfo->s
1f0c0 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29  lotDescription))
1f0d0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1f0e0 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  >slotDescription
1f0f0 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  , slotDescriptio
1f100 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65  n, sizeof(slotDe
1f110 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
1f120 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1f130 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1f140 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1f150 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1f160 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68  ID));...pInfo->h
1f170 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1f180 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1f190 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1f1a0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1f1b0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
1f1c0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1f1d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1f1e0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1f1f0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1f200 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30  ersion.major = 0
1f210 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  x00;..pInfo->fir
1f220 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  mwareVersion.min
1f230 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43  or = 0x00;...CAC
1f240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f250 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1f260 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1f270 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1f280 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1f290 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1f2a0 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  , C_GetTokenInfo
1f2b0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1f2c0 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e  tID, CK_TOKEN_IN
1f2d0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1f2e0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1f2f0 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1f300 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1f310 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1f320 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65  c CK_UTF8CHAR de
1f330 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22  faultLabel[] = "
1f340 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a  Unknown Token";.
1f350 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1f360 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43  HAR model[] = "C
1f370 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75  AC Token";..stru
1f380 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1f390 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1f3a0 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
1f3b0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
1f3c0 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62  ts;..ssize_t lab
1f3d0 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  el_ret;..int mut
1f3e0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1f3f0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1f400 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1f410 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1f420 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1f430 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1f440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f450 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1f460 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1f470 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1f480 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1f490 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1f4a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1f4b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f4c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1f4d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1f4e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1f4f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1f500 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1f510 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1f520 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1f530 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1f540 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f550 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1f560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f570 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1f580 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1f590 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1f5a0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1f5b0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1f5c0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1f5d0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1f5e0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1f5f0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1f600 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f610 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f620 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f640 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1f650 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1f660 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1f670 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1f680 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1f690 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1f6a0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f6b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f6c0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1f6d0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1f6e0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1f6f0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1f700 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1f710 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f720 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f730 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1f740 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1f750 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1f760 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
1f770 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f780 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50  ID]) != CACKEY_P
1f790 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
1f7a0 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
1f7b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20  EBUG_PRINTF("No 
1f7c0 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74  token is present
1f7d0 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75   in slotID = %lu
1f7e0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
1f7f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1f800 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1f810 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1f820 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53  R_TOKEN_NOT_PRES
1f830 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ENT);..}...mutex
1f840 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1f850 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1f860 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1f870 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1f880 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1f890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f8a0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1f8b0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1f8c0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1f8d0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1f8e0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b  /* Determine tok
1f8f0 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65  en label from ce
1f900 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d  rtificates */..m
1f910 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62  emset(pInfo->lab
1f920 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1f930 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
1f940 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  .use_default_lab
1f950 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61  el = 1;...if (ca
1f960 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f970 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c  D].label == NULL
1f980 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74  ) {...pcsc_ident
1f990 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
1f9a0 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65  ead_certs(&cacke
1f9b0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
1f9c0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
1f9d0 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69  s);...if (pcsc_i
1f9e0 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
1f9f0 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f  L) {....if (num_
1fa00 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09  certs > 0) {....
1fa10 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63  .label_ret = cac
1fa20 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1fa30 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f  y_to_label(pcsc_
1fa40 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66  identities, pInf
1fa50 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
1fa60 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1fa70 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72  .....if (label_r
1fa80 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75  et > 0) {......u
1fa90 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1faa0 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b   = 0;.......cack
1fab0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1fac0 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28  .label = malloc(
1fad0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
1fae0 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d  bel));.......mem
1faf0 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  cpy(cackey_slots
1fb00 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20  [slotID].label, 
1fb10 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
1fb20 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1fb30 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  l));.....}....}.
1fb40 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
1fb50 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
1fb60 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
1fb70 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  , 1);...}..} els
1fb80 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  e {...memcpy(pIn
1fb90 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65  fo->label, cacke
1fba0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1fbb0 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
1fbc0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09  nfo->label));...
1fbd0 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  .use_default_lab
1fbe0 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  el = 0;..}...if 
1fbf0 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  (use_default_lab
1fc00 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70  el) {...memcpy(p
1fc10 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66  Info->label, def
1fc20 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f  aultLabel, sizeo
1fc30 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20  f(defaultLabel) 
1fc40 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  - 1);..}...memse
1fc50 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1fc60 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1fc70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1fc80 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
1fc90 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
1fca0 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
1fcb0 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
1fcc0 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
1fcd0 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  ID) - 1);...mems
1fce0 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  et(pInfo->model,
1fcf0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1fd00 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65  fo->model));..me
1fd10 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  mcpy(pInfo->mode
1fd20 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66  l, model, sizeof
1fd30 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09  (model) - 1);...
1fd40 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65  memset(pInfo->se
1fd50 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c  rialNumber, ' ',
1fd60 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73   sizeof(pInfo->s
1fd70 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a  erialNumber));..
1fd80 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75  .memset(pInfo->u
1fd90 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a  tcTime, ' ', siz
1fda0 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  eof(pInfo->utcTi
1fdb0 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68  me));...pInfo->h
1fdc0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1fdd0 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1fde0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1fdf0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1fe00 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
1fe10 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1fe20 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1fe30 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1fe40 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1fe50 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30  ersion.major = 0
1fe60 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  x00;..pInfo->fir
1fe70 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  mwareVersion.min
1fe80 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e  or = 0x00;...pIn
1fe90 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1fea0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
1feb0 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49  | CKF_USER_PIN_I
1fec0 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46  NITIALIZED | CKF
1fed0 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a  _TOKEN_INITIALIZ
1fee0 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ED | cackey_slot
1fef0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
1ff00 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28 63 61 63  flags;...if (cac
1ff10 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1ff20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e  != NULL) {...pIn
1ff30 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46  fo->flags |= CKF
1ff40 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45  _PROTECTED_AUTHE
1ff50 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a  NTICATION_PATH;.
1ff60 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  .}...pInfo->ulMa
1ff70 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  xSessionCount = 
1ff80 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1ff90 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1ffa0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1ffb0 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e  s[0])) - 1;..pIn
1ffc0 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75  fo->ulSessionCou
1ffd0 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
1ffe0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1fff0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77  ..pInfo->ulMaxRw
20000 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30  SessionCount = 0
20010 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65  ;..pInfo->ulRwSe
20020 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
20030 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
20040 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
20050 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31  >ulMaxPinLen = 1
20060 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  28;..pInfo->ulMi
20070 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49  nPinLen = 0;..pI
20080 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c  nfo->ulTotalPubl
20090 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
200a0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
200b0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
200c0 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72  lFreePublicMemor
200d0 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
200e0 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
200f0 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
20100 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43  rivateMemory = C
20110 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
20120 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
20130 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65  o->ulFreePrivate
20140 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
20150 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
20160 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ION;...CACKEY_DE
20170 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20180 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
20190 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
201a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
201b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
201c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61  TION(CK_RV, C_Wa
201d0 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28  itForSlotEvent)(
201e0 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
201f0 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70  CK_SLOT_ID_PTR p
20200 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f  SlotID, CK_VOID_
20210 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20 7b  PTR pReserved) {
20220 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20230 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20240 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76 65  ;...if (pReserve
20250 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d != NULL) {...C
20260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20270 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65  TF("Error. pRese
20280 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rved is not NULL
20290 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
202a0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
202b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
202c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
202d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
202e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
202f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20300 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20310 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20320 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20330 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f  }.../* XXX: TODO
20340 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73  : Implement this
20350 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44  ... */..CACKEY_D
20360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20370 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
20380 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20390 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
203a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
203b0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
203c0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
203d0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
203e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
203f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65  N(CK_RV, C_GetMe
20400 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f  chanismList)(CK_
20410 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
20420 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
20430 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  E_PTR pMechanism
20440 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
20450 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
20460 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20470 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20480 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20490 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
204a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
204b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
204c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
204d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
204e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
204f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
20500 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55   (pulCount == NU
20510 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
20520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20530 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73  or.  pulCount is
20540 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
20550 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
20560 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
20570 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20  (pMechanismList 
20580 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
20590 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43  lCount = 1;....C
205a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
205b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
205c0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
205d0 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
205e0 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
205f0 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20  (*pulCount < 1) 
20600 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20610 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20620 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c   Buffer too smal
20630 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  l.");....return(
20640 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
20650 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63  MALL);..}...pMec
20660 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20  hanismList[0] = 
20670 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a  CKM_RSA_PKCS;..*
20680 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09  pulCount = 1;...
20690 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
206a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
206b0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
206c0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
206d0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
206e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
206f0 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
20700 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  ismInfo)(CK_SLOT
20710 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
20720 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79  ECHANISM_TYPE ty
20730 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  pe, CK_MECHANISM
20740 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
20750 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
20760 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
20770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20780 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
20790 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
207a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
207b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
207c0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
207d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
207e0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
207f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20800 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20820 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20830 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20840 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20850 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20860 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
20870 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
20880 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
20890 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
208a0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
208b0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
208c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
208d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
208e0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
208f0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
20900 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
20910 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
20920 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
20930 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
20940 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
20950 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
20960 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20970 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
20980 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20990 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
209a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
209b0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
209c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
209d0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
209e0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
209f0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
20a00 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
20a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a20 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
20a30 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
20a40 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
20a50 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
20a60 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
20a70 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
20a80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
20a90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20aa0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
20ab0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
20ac0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
20ad0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20ae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20af0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20b00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20b10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20b20 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
20b30 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
20b40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
20b50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
20b60 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63  tch (type) {...c
20b70 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
20b80 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69  :....pInfo->ulMi
20b90 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a  nKeySize = 512;.
20ba0 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b  ...pInfo->ulMaxK
20bb0 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09  eySize = 8192;..
20bc0 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
20bd0 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e   CKF_HW | CKF_EN
20be0 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52  CRYPT | CKF_DECR
20bf0 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c  YPT | CKF_SIGN |
20c00 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09   CKF_VERIFY;....
20c10 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b  break;..}...CACK
20c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20c30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20c40 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20c50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20c60 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  K);.}../* We don
20c70 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
20c80 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
20c90 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20ca0 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e  _RV, C_InitToken
20cb0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
20cc0 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  tID, CK_UTF8CHAR
20cd0 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
20ce0 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b  ONG ulPinLen, CK
20cf0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c  _UTF8CHAR_PTR pL
20d00 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f  abel) {..CACKEY_
20d10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20d20 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
20d30 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20d40 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20d60 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
20d70 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
20d80 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
20d90 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
20da0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
20db0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
20dc0 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f  rning CKR_TOKEN_
20dd0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
20de0 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e  (%i)", CKR_TOKEN
20df0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20e00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20e10 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
20e20 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  ECTED);.}../* We
20e30 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
20e40 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
20e50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20e60 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50  N(CK_RV, C_InitP
20e70 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  IN)(CK_SESSION_H
20e80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20e90 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
20ea0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
20eb0 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  lPinLen) {..CACK
20ec0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20ed0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
20ee0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20ef0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20f00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20f10 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20f20 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20f30 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
20f40 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
20f50 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
20f60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20f70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b  eturning CKR_TOK
20f80 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
20f90 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f  ED (%i)", CKR_TO
20fa0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
20fb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
20fc0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
20fd0 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  ROTECTED);.}../*
20fe0 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
20ff0 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
21000 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
21010 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
21020 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tPIN)(CK_SESSION
21030 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
21040 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
21050 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c  R pOldPin, CK_UL
21060 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c  ONG ulOldPinLen,
21070 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
21080 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f   pNewPin, CK_ULO
21090 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20  NG ulNewPinLen) 
210a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
210b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
210c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
210d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
210e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
210f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
21100 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
21110 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21120 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
21130 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
21140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21150 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21160 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21170 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
21180 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
21190 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
211a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
211b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
211c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
211d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
211e0 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29  , C_OpenSession)
211f0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
21200 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61  ID, CK_FLAGS fla
21210 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  gs, CK_VOID_PTR 
21220 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b  pApplication, CK
21230 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20  _NOTIFY notify, 
21240 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
21250 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29  E_PTR phSession)
21260 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
21270 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  g idx;..int mute
21280 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66  x_retval;..int f
21290 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30  ound_session = 0
212a0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
212b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
212c0 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73  ");...if ((flags
212d0 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45   & CKF_SERIAL_SE
212e0 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45  SSION) != CKF_SE
212f0 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a  RIAL_SESSION) {.
21300 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
21310 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f  SION_PARALLEL_NO
21320 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d  T_SUPPORTED);..}
21330 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21340 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21350 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21360 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21370 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21380 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21390 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
213a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
213b0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
213c0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
213d0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
213e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
213f0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
21400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
21420 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
21430 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
21440 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
21450 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
21460 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
21470 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
21480 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
21490 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
214a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
214b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
214c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
214d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
214e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
214f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
21500 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21510 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21520 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
21530 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
21540 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
21550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21560 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
21570 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
21580 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
21590 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
215a0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
215b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
215c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
215d0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
215e0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
215f0 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69  D);..}.../* Veri
21600 66 79 20 74 68 61 74 20 74 68 65 20 63 61 72 64  fy that the card
21610 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20   is actually in 
21620 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a  the slot. */../*
21630 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d   XXX: Check to m
21640 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
21650 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20   in the PKCS#11 
21660 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f  specification */
21670 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
21680 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
21690 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
216a0 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
216b0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
216c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
216d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
216e0 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65    Card not prese
216f0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43  nt.  Returning C
21700 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
21710 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  D");....cackey_m
21720 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21730 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21740 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43  return(CKR_DEVIC
21750 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a  E_REMOVED);..}..
21760 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69  .for (idx = 1; i
21770 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
21780 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
21790 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
217a0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
217b0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63  ++) {...if (!cac
217c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
217d0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66  ].active) {....f
217e0 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31  ound_session = 1
217f0 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e  ;.....*phSession
21800 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b   = idx;.....cack
21810 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
21820 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
21830 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21840 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c  idx].slotID = sl
21850 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f  otID;....cackey_
21860 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74  sessions[idx].st
21870 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
21880 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09  LIC_SESSION;....
21890 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
218a0 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61  idx].flags = fla
218b0 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  gs;....cackey_se
218c0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65  ssions[idx].ulDe
218d0 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09  viceError = 0;..
218e0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
218f0 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74  s[idx].pApplicat
21900 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69  ion = pApplicati
21910 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  on;....cackey_se
21920 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69  ssions[idx].Noti
21930 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09  fy = notify;....
21940 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21950 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
21960 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
21970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
21980 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
21990 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  t = 0;.....cacke
219a0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
219b0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
219c0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
219d0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e  ssions[idx].sign
219e0 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
219f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21a00 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63  [idx].decrypt_ac
21a10 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
21a20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
21a30 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
21a40 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
21a50 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
21a60 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
21a70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21a80 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  dx].identities_c
21a90 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61  ount);......brea
21aa0 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  k;...}..}...mute
21ab0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21ac0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21ad0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21ae0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21af0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21b10 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
21b20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21b40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21b50 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73  .if (!found_sess
21b60 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ion) {...CACKEY_
21b70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21b80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53  turning CKR_SESS
21b90 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c  ION_COUNT (%i)",
21ba0 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55   CKR_SESSION_COU
21bb0 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  NT);....return(C
21bc0 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
21bd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21be0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21bf0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21c00 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
21c10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21c20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21c30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
21c40 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f  loseSession)(CK_
21c50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21c60 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20  Session) {..int 
21c70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
21c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21c90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21ca0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21cb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21cd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21ce0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21cf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21d00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21d10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21d20 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21d30 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
21d40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21d50 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
21d60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21d70 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21d80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21d90 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21da0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
21db0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21dc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21dd0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
21de0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21df0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
21e00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21e10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21e20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21e40 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
21e50 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21e60 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21e70 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21e80 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21e90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
21ea0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
21eb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21ec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21ee0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21ef0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
21f00 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
21f10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
21f20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
21f30 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
21f40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
21f50 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b  ctive = 0;..cack
21f60 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
21f70 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  es(cackey_sessio
21f80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
21f90 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f  ntities, cackey_
21fa0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21fb0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
21fc0 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  unt);...mutex_re
21fd0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
21fe0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21ff0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22000 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22010 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22020 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22030 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22040 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22050 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22060 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
22070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22080 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22090 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
220a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
220b0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
220c0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
220d0 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73  , C_CloseAllSess
220e0 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  ions)(CK_SLOT_ID
220f0 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74   slotID) {..uint
22100 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d  32_t idx;..int m
22110 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
22120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22130 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22140 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22150 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
22160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22170 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22180 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22190 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
221a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
221b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
221c0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
221d0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
221e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
221f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
22200 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
22210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22220 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
22230 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
22240 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
22250 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
22260 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
22270 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
22280 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
22290 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
222a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
222b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
222c0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
222d0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
222e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
222f0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
22300 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22310 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22320 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22330 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
22340 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
22350 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
22360 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22370 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
22380 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
22390 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
223a0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
223b0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
223c0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
223d0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
223e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
223f0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
22400 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
22410 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
22420 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
22430 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
22440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
22450 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  ); idx++) {...if
22460 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
22470 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
22480 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
22490 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f  essions[idx].slo
224a0 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b  tID != slotID) {
224b0 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
224c0 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d  ..}.....cackey_m
224d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
224e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
224f0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69  C_CloseSession(i
22500 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  dx);....cackey_m
22510 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
22520 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09  _biglock);...}..
22530 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
22540 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22550 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22560 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22570 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22580 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22590 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
225a0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
225b0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
225c0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
225d0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
225e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
225f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
22600 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
22610 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
22620 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22630 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22640 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28  GetSessionInfo)(
22650 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22660 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53  E hSession, CK_S
22670 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20  ESSION_INFO_PTR 
22680 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75  pInfo) {..int mu
22690 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
226a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
226b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
226c0 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
226d0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
226e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
226f0 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
22700 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22710 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
22720 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22730 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22740 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22750 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22760 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22770 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22780 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22790 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
227a0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
227b0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
227c0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
227d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
227e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
227f0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
22800 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22810 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22820 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
22830 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
22840 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22850 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22860 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22870 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22880 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
22890 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
228a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
228b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
228c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
228d0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
228e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
228f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22900 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
22910 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22920 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
22930 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
22940 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22950 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
22960 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22970 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
22980 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
22990 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
229a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
229b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  LID);..}...pInfo
229c0 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ->slotID = cacke
229d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
229e0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49  ion].slotID;..pI
229f0 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63  nfo->state = cac
22a00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22a10 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70  ssion].state;..p
22a20 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61  Info->flags = ca
22a30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22a40 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09  ession].flags;..
22a50 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45  pInfo->ulDeviceE
22a60 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65  rror = cackey_se
22a70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22a80 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a  .ulDeviceError;.
22a90 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
22aa0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
22ab0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22ac0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22ad0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22ae0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22af0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
22b00 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
22b10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22b20 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22b30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22b40 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22b50 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
22b60 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
22b70 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
22b80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22b90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
22ba0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
22bb0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22bc0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22bd0 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
22be0 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
22bf0 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74  NG_PTR pulOperat
22c00 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09  ionStateLen) {..
22c10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22c20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22c30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22c40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22c60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22c70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22c80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22c90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22ca0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22cb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22cc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22cd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22ce0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22cf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22d00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22d10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22d20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22d30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22d40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22d50 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
22d60 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
22d70 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22d80 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65  CK_BYTE_PTR pOpe
22d90 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f  rationState, CK_
22da0 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f  ULONG ulOperatio
22db0 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42  nStateLen, CK_OB
22dc0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63  JECT_HANDLE hEnc
22dd0 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f  ryptionKey, CK_O
22de0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75  BJECT_HANDLE hAu
22df0 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29  thenticationKey)
22e00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22e10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22e20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22e30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22e40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22e50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22e60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22e70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22e80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22e90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22ea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22eb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22ec0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22ed0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22ee0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22ef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22f00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22f10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22f20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22f30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22f40 56 2c 20 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  V, _C_LoginMutex
22f50 41 72 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Arg)(CK_SESSION_
22f60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22f70 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
22f80 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
22f90 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
22fa0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c  _ULONG ulPinLen,
22fb0 20 69 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29   int lock_mutex)
22fc0 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73   {..CK_SLOT_ID s
22fd0 6c 6f 74 49 44 3b 0a 09 46 49 4c 45 20 2a 70 69  lotID;..FILE *pi
22fe0 6e 66 64 3b 0a 09 63 68 61 72 20 2a 70 69 6e 63  nfd;..char *pinc
22ff0 6d 64 2c 20 70 69 6e 62 75 66 5b 36 34 5d 2c 20  md, pinbuf[64], 
23000 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74  *fgets_ret;..int
23010 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
23020 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
23030 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  ing;..int login_
23040 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65  ret;..int pclose
23050 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
23060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23070 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23080 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23090 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
230a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
230b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
230c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
230d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
230e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
230f0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
23100 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
23110 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
23120 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
23130 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
23140 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
23150 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23160 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23170 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
23180 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
23190 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
231a0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
231b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54  ;..}...if (userT
231c0 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29  ype != CKU_USER)
231d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
231e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
231f0 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72    We only suppor
23200 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b  t USER mode, ask
23210 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e  ed for %lu mode.
23220 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
23230 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09  g) userType)....
23240 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f  return(CKR_USER_
23250 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  TYPE_INVALID);..
23260 7d 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  }...if (lock_mut
23270 65 78 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65  ex) {...mutex_re
23280 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23290 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
232a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28  biglock);...if (
232b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
232c0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
232d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
232e0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
232f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
23300 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23310 52 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  RROR);...}..}...
23320 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
23330 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
23340 63 74 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c  ctive) {...if (l
23350 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09  ock_mutex) {....
23360 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23370 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23380 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  ck);...}....CACK
23390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
233a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
233b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
233c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
233d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
233e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
233f0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
23400 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23410 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
23420 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
23430 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
23440 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
23450 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
23460 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
23470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23480 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
23490 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
234a0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
234b0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
234c0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28  slotID);....if (
234d0 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
234e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
234f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23500 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74  ock);...}....ret
23510 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23520 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23530 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
23540 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
23550 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23570 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
23580 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
23590 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
235a0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
235b0 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63  tID);....if (loc
235c0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
235d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
235e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
235f0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
23600 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23610 4f 52 29 3b 0a 09 7d 0a 0a 09 70 69 6e 63 6d 64  OR);..}...pincmd
23620 20 3d 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f   = cackey_pin_co
23630 6d 6d 61 6e 64 3b 0a 09 69 66 20 28 70 69 6e 63  mmand;..if (pinc
23640 6d 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  md != NULL) {...
23650 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23660 4e 54 46 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f  NTF("CACKEY_PIN_
23670 43 4f 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20 70  COMMAND = %s", p
23680 69 6e 63 6d 64 29 3b 0a 0a 09 09 69 66 20 28 70  incmd);....if (p
23690 50 69 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Pin != NULL) {..
236a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
236b0 52 49 4e 54 46 28 22 50 72 6f 74 65 63 74 65 64  RINTF("Protected
236c0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
236d0 70 61 74 68 20 69 6e 20 65 66 66 65 63 74 20 61  path in effect a
236e0 6e 64 20 50 49 4e 20 70 72 6f 76 69 64 65 64 20  nd PIN provided 
236f0 21 3f 22 29 3b 0a 09 09 7d 0a 0a 09 09 70 69 6e  !?");...}....pin
23700 66 64 20 3d 20 70 6f 70 65 6e 28 70 69 6e 63 6d  fd = popen(pincm
23710 64 2c 20 22 72 22 29 3b 0a 09 09 69 66 20 28 70  d, "r");...if (p
23720 69 6e 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  infd == NULL) {.
23730 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23740 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23750 25 73 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75  %s: Unable to ru
23760 6e 22 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09  n", pincmd);....
23770 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
23780 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
23790 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
237a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d  y_biglock);....}
237b0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
237c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
237d0 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  ing CKR_PIN_INCO
237e0 52 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e  RRECT (%i)", (in
237f0 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  t) CKR_PIN_INCOR
23800 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72  RECT);.....retur
23810 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23820 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 66 67 65  ECT);...}....fge
23830 74 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70  ts_ret = fgets(p
23840 69 6e 62 75 66 2c 20 73 69 7a 65 6f 66 28 70 69  inbuf, sizeof(pi
23850 6e 62 75 66 29 2c 20 70 69 6e 66 64 29 3b 0a 09  nbuf), pinfd);..
23860 09 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d  .if (fgets_ret =
23870 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 70 69 6e  = NULL) {....pin
23880 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09  buf[0] = '\0';..
23890 09 7d 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74  .}....pclose_ret
238a0 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29   = pclose(pinfd)
238b0 3b 0a 09 09 69 66 20 28 70 63 6c 6f 73 65 5f 72  ;...if (pclose_r
238c0 65 74 20 3d 3d 20 2d 31 20 26 26 20 65 72 72 6e  et == -1 && errn
238d0 6f 20 3d 3d 20 45 43 48 49 4c 44 29 20 7b 0a 09  o == ECHILD) {..
238e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
238f0 52 49 4e 54 46 28 22 4e 6f 74 69 63 65 2e 20 20  RINTF("Notice.  
23900 70 63 6c 6f 73 65 28 29 20 69 6e 64 69 63 61 74  pclose() indicat
23910 65 64 20 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ed it could not 
23920 67 65 74 20 74 68 65 20 73 74 61 74 75 73 20 6f  get the status o
23930 66 20 74 68 65 20 63 68 69 6c 64 2c 20 61 73 73  f the child, ass
23940 75 6d 69 6e 67 20 69 74 20 73 75 63 63 65 65 65  uming it succeee
23950 64 65 64 20 21 22 29 3b 0a 0a 09 09 09 70 63 6c  ded !");.....pcl
23960 6f 73 65 5f 72 65 74 20 3d 20 30 3b 0a 09 09 7d  ose_ret = 0;...}
23970 0a 0a 09 09 69 66 20 28 70 63 6c 6f 73 65 5f 72  ....if (pclose_r
23980 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  et != 0) {....CA
23990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
239a0 46 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65  F("Error.  %s: e
239b0 78 69 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a  xited with non-z
239c0 65 72 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69  ero status of %i
239d0 22 2c 20 70 69 6e 63 6d 64 2c 20 70 63 6c 6f 73  ", pincmd, pclos
239e0 65 5f 72 65 74 29 3b 0a 0a 09 09 09 69 66 20 28  e_ret);.....if (
239f0 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
23a00 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
23a10 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
23a20 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  lock);....}.....
23a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23a40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23a50 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23a60 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
23a70 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
23a80 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
23a90 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
23aa0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6c  ...}....if (strl
23ab0 65 6e 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20  en(pinbuf) < 1) 
23ac0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
23ad0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23ae0 20 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20 6e    %s: returned n
23af0 6f 20 64 61 74 61 22 2c 20 70 69 6e 63 6d 64 29  o data", pincmd)
23b00 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d  ;.....if (lock_m
23b10 75 74 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b  utex) {.....cack
23b20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23b30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23b40 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59  ....}.....CACKEY
23b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23b60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e  eturning CKR_PIN
23b70 5f 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22  _INCORRECT (%i)"
23b80 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f  , (int) CKR_PIN_
23b90 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09  INCORRECT);.....
23ba0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49  return(CKR_PIN_I
23bb0 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a  NCORRECT);...}..
23bc0 09 09 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72  ..if (pinbuf[str
23bd0 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d  len(pinbuf) - 1]
23be0 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 09 70   == '\n') {....p
23bf0 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e  inbuf[strlen(pin
23c00 62 75 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27  buf) - 1] = '\0'
23c10 3b 0a 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20  ;...}....pPin = 
23c20 28 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52  (CK_UTF8CHAR_PTR
23c30 29 20 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69  ) pinbuf;...ulPi
23c40 6e 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69  nLen = strlen(pi
23c50 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69  nbuf);..}...logi
23c60 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c  n_ret = cackey_l
23c70 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ogin(&cackey_slo
23c80 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e  ts[slotID], pPin
23c90 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69  , ulPinLen, &tri
23ca0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09  es_remaining);..
23cb0 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d  if (login_ret !=
23cc0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
23cd0 4b 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  K) {...if (lock_
23ce0 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
23cf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23d00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23d10 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6c 6f 67 69  ...}....if (logi
23d20 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
23d30 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b  PCSC_E_LOCKED) {
23d40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23d50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23d60 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64   Token is locked
23d70 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
23d80 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
23d90 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
23da0 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
23db0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
23dc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23dd0 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  ning CKR_PIN_LOC
23de0 4b 45 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29  KED (%i)", (int)
23df0 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29   CKR_PIN_LOCKED)
23e00 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
23e10 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
23e20 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e  } else if (login
23e30 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
23e40 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a  CSC_E_BADPIN) {.
23e50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23e60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23e70 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a  Invalid PIN.");.
23e80 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
23e90 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
23ea0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
23eb0 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a  _PIN_COUNT_LOW;.
23ec0 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
23ed0 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a  maining == 1) {.
23ee0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
23ef0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
23f00 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
23f10 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a  _PIN_FINAL_TRY;.
23f20 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
23f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23f40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
23f50 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c  INCORRECT (%i)",
23f60 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49   (int) CKR_PIN_I
23f70 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72  NCORRECT);.....r
23f80 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
23f90 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
23fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23fb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
23fc0 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
23fd0 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
23fe0 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
23ff0 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
24000 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24010 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
24020 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24030 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
24040 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
24050 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
24060 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
24070 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
24080 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
24090 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
240a0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
240b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
240c0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
240d0 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 69  R_FUNCTIONS;...i
240e0 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
240f0 0a 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24100 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
24110 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24120 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74  lock);...if (mut
24130 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
24140 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
24150 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24160 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
24170 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
24180 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24190 52 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ROR);...}..}...C
241a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
241b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
241c0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
241d0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
241e0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
241f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24200 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f  RV, C_Login)(CK_
24210 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
24220 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
24230 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
24240 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
24250 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
24260 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 72 65 74 75  lPinLen) {..retu
24270 72 6e 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78  rn(_C_LoginMutex
24280 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 75 73  Arg(hSession, us
24290 65 72 54 79 70 65 2c 20 70 50 69 6e 2c 20 75 6c  erType, pPin, ul
242a0 50 69 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d 0a 0a  PinLen, 1));.}..
242b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
242c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f  ON(CK_RV, C_Logo
242d0 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ut)(CK_SESSION_H
242e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
242f0 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
24300 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78  otID;..int mutex
24310 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
24320 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24330 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24340 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24350 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24370 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24380 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24390 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
243a0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
243b0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
243c0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
243d0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
243e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
243f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
24400 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
24410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24430 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
24440 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
24450 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24460 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
24470 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
24480 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
24490 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
244a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
244b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
244c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
244d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
244e0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
244f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24500 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24510 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
24520 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24530 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
24540 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
24550 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24560 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
24570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24580 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24590 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
245a0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
245b0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
245c0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
245d0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
245e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
245f0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
24600 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
24610 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
24620 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
24630 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
24640 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
24650 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24660 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
24670 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
24680 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
24690 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
246a0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
246b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
246c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
246d0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
246e0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
246f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24700 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24710 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
24720 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
24730 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
24740 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
24750 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
24760 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24770 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24790 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
247a0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
247b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
247c0 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
247d0 43 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66 20  C_SESSION;...if 
247e0 28 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d  (cackey_pin_comm
247f0 61 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  and == NULL) {..
24800 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
24810 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
24820 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
24830 51 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20  QUIRED;..} else 
24840 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  {...cackey_slots
24850 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
24860 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  lags = 0;..}...m
24870 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
24880 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24890 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
248a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
248b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
248c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
248d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
248e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
248f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
24900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
24910 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24920 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24930 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
24940 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
24950 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
24960 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24970 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74  N(CK_RV, C_Creat
24980 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  eObject)(CK_SESS
24990 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
249a0 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ion, CK_ATTRIBUT
249b0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
249c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
249d0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
249e0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
249f0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24a00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24a10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24a20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24a30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24a40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24a50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24a60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24a70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24a80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24a90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24aa0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24ab0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
24ac0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
24ad0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
24ae0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
24af0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
24b00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24b10 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
24b20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24b30 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  RV, C_CopyObject
24b40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24b50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24b60 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
24b70 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
24b80 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
24b90 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
24ba0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
24bb0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77  HANDLE_PTR phNew
24bc0 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
24bd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24be0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24bf0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24c00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24c10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24c20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24c30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24c40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24c50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24c60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
24c70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24c80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24c90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24ca0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24cb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24cc0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
24cd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24ce0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
24cf0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24d00 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74  ON(CK_RV, C_Dest
24d10 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  royObject)(CK_SE
24d20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24d30 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
24d40 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29  _HANDLE hObject)
24d50 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24d60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24d70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24d80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24d90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24da0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24db0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
24dc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24dd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
24de0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
24df0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24e00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24e10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24e20 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
24e30 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
24e40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24e50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
24e60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24e70 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
24e80 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24e90 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69  V, C_GetObjectSi
24ea0 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ze)(CK_SESSION_H
24eb0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
24ec0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
24ed0 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f   hObject, CK_ULO
24ee0 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20  NG_PTR pulSize) 
24ef0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
24f00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24f10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24f20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24f30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24f40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24f50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24f60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24f70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24f80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24fa0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24fb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24fc0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
24fd0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
24fe0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
24ff0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
25000 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
25010 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
25020 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
25030 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  , C_GetAttribute
25040 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
25050 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
25060 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
25070 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
25080 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
25090 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
250a0 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b  G ulCount) {..CK
250b0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
250c0 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63  _attr;..struct c
250d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
250e0 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67  identity;..unsig
250f0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
25100 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c  y_idx, attr_idx,
25110 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20   sess_attr_idx, 
25120 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75  num_ids;..int mu
25130 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  tex_retval;..CK_
25140 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
25150 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52  OK;..CK_VOID_PTR
25160 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f   pValue;..CK_ULO
25170 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  NG ulValueLen;..
25180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25190 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
251a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
251b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
251c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
251d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
251e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
251f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25200 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25210 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
25220 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
25230 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
25240 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
25250 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
25260 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25270 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25290 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
252a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
252b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
252c0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
252d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
252e0 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30  if (hObject == 0
252f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25300 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25310 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
25320 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
25330 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25340 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  R_OBJECT_HANDLE_
25350 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
25360 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29  f (ulCount == 0)
25370 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
25380 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
25390 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
253a0 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
253b0 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
253c0 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ely */...CACKEY_
253d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
253e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
253f0 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
25400 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
25410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25420 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70  ;..}...if (pTemp
25430 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  late == NULL) {.
25440 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25450 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
25460 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c  Template is NULL
25470 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25480 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
25490 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
254a0 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d  _idx = hObject -
254b0 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   1;...mutex_retv
254c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
254d0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
254e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
254f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
25500 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25510 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25520 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
25530 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25540 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25550 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
25560 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25570 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
25580 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25590 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
255a0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
255b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
255c0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
255d0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
255e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
255f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25600 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f  ALID);..}...num_
25610 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ids = cackey_ses
25620 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25630 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
25640 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  ;...if (identity
25650 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29  _idx >= num_ids)
25660 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
25670 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25680 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
25690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
256a0 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74  ("Error.  Object
256b0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
256c0 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f  ange.  identity_
256d0 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69  idx = %lu, num_i
256e0 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73  ds = %lu.", (uns
256f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
25700 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67  tity_idx, (unsig
25710 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64  ned long) num_id
25720 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  s);....return(CK
25730 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  R_OBJECT_HANDLE_
25740 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
25750 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
25760 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25770 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
25780 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a  identity_idx];..
25790 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d  .for (attr_idx =
257a0 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75   0; attr_idx < u
257b0 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  lCount; attr_idx
257c0 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74  ++) {...curr_att
257d0 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61  r = &pTemplate[a
257e0 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61  ttr_idx];....pVa
257f0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
25800 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
25810 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b  ONG) -1;....CACK
25820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25830 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74  "Looking for att
25840 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28  ribute 0x%08lx (
25850 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e  identity:%lu) ..
25860 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
25870 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
25880 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ype, (unsigned l
25890 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
258a0 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73  x);....for (sess
258b0 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
258c0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69  ess_attr_idx < i
258d0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
258e0 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f  tes_count; sess_
258f0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
25900 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61  .if (identity->a
25910 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
25920 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d  ttr_idx].type ==
25930 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
25940 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
25950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
25960 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c  . found it, pVal
25970 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65  ue = %p, ulValue
25980 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e  Len = %lu", iden
25990 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
259a0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
259b0 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79  pValue, identity
259c0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
259d0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
259e0 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09  lueLen);........
259f0 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74  ..pValue = ident
25a00 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
25a10 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
25a20 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  Value;.....ulVal
25a30 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  ueLen = identity
25a40 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
25a50 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
25a60 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d  lueLen;....}...}
25a70 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
25a80 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61  r->pValue && pVa
25a90 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75  lue) {....if (cu
25aa0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
25ab0 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65  Len >= ulValueLe
25ac0 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28  n) {.....memcpy(
25ad0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
25ae0 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c  e, pValue, ulVal
25af0 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73  ueLen);....} els
25b00 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  e {.....ulValueL
25b10 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
25b20 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  1;......retval =
25b30 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
25b40 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a  SMALL;....}...}.
25b50 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  ...curr_attr->ul
25b60 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
25b70 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ueLen;..}...mute
25b80 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25b90 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25ba0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25bb0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25bc0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25be0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
25bf0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25c10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25c20 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43  .if (retval == C
25c30 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  KR_ATTRIBUTE_TYP
25c40 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43  E_INVALID) {...C
25c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25c60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25c70 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
25c80 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20  _INVALID (%i)", 
25c90 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
25ca0 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
25cb0 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  l == CKR_BUFFER_
25cc0 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43  TOO_SMALL) {...C
25cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25ce0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25cf0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
25d00 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  LL (%i)", (int) 
25d10 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
25d20 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
25d30 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
25d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25d50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
25d60 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
25d70 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  tval);..} else {
25d80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25d90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25da0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
25db0 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  val);..}...retur
25dc0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
25dd0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
25de0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74  (CK_RV, C_SetAtt
25df0 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
25e00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25e10 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
25e20 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
25e30 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
25e40 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
25e50 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
25e60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
25e70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
25e80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
25e90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
25ea0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25eb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25ec0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
25ed0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25ee0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
25ef0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25f00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25f10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25f20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25f30 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
25f40 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
25f50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25f60 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
25f70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25f80 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
25f90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
25fa0 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
25fb0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
25fc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
25fd0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
25fe0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
25ff0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
26000 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
26010 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  otID;..CK_ULONG 
26020 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
26030 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
26040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26050 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
26060 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26070 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26080 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26090 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
260a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
260b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
260c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
260d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
260e0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
260f0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26100 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26110 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
26120 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
26130 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26140 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26150 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
26160 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
26170 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26180 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26190 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
261a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
261b0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
261c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
261d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
261e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
261f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26200 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
26210 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26220 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26230 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
26240 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26250 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
26260 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
26270 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26280 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
26290 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
262a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
262b0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
262c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
262d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
262e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
262f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
26300 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26310 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
26320 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26330 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26340 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
26350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26360 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65  or.  Search alre
26370 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  ady active.");..
26380 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
26390 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
263a0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
263b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
263c0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
263d0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
263e0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
263f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
26400 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
26410 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
26420 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26430 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26440 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
26450 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
26460 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
26470 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
26480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26490 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
264a0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
264b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
264c0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
264d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
264e0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
264f0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
26500 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
26510 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
26520 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
26530 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
26540 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26550 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
26560 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26570 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
26580 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26590 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
265a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
265b0 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20  RINTF("The slot 
265c0 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73  has been reset s
265d0 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f  ince we last loo
265e0 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69  ked for identiti
265f0 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67  es -- rescanning
26600 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ");....if (cacke
26610 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26620 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
26630 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61  != NULL) {....ca
26640 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
26650 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
26660 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
26670 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
26680 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26690 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
266a0 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b  count);.....cack
266b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
266c0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
266d0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
266e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
266f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
26700 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a  _count = 0;...}.
26710 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
26720 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
26730 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  l != NULL) {....
26740 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
26750 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29  s[slotID].label)
26760 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ;....cackey_slot
26770 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
26780 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63  = NULL;...}....c
26790 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
267a0 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c  reset(&cackey_sl
267b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09  ots[slotID]);...
267c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
267d0 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  tID].slot_reset 
267e0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  = 0;..}...if (ca
267f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26800 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
26810 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
26820 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26830 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
26840 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
26850 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
26860 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26870 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
26880 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26890 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
268a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  );..}...if (pTem
268b0 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  plate != NULL) {
268c0 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21  ...if (ulCount !
268d0 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  = 0) {....cackey
268e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
268f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26900 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74  _count = ulCount
26910 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26920 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26930 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61  earch_query = ma
26940 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73  lloc(ulCount * s
26950 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65  izeof(*pTemplate
26960 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ));.....memcpy(c
26970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26980 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26990 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65  query, pTemplate
269a0 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65  , ulCount * size
269b0 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b  of(*pTemplate));
269c0 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ....for (idx = 0
269d0 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  ; idx < ulCount;
269e0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66   idx++) {.....if
269f0 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d   (pTemplate[idx]
26a00 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30  .ulValueLen == 0
26a10 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  ) {......cackey_
26a20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26a30 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
26a40 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55  idx].pValue = NU
26a50 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  LL;.......contin
26a60 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
26a70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26a80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26a90 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
26aa0 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70  e = malloc(pTemp
26ab0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
26ac0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  eLen);......if (
26ad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26ae0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26af0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
26b00 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  ue) {......memcp
26b10 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
26b20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26b30 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
26b40 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
26b50 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65  idx].pValue, pTe
26b60 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
26b70 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09  lueLen);.....}..
26b80 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
26b90 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26ba0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26bb0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
26bc0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
26bd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26be0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
26bf0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  NULL;...}..} els
26c00 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e  e {...if (ulCoun
26c10 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63  t != 0) {....cac
26c20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26c30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26c40 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
26c50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26c60 2e 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20  .  Search query 
26c70 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
26c80 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66  L, but number of
26c90 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74   query terms not
26ca0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e   specified as 0.
26cb0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
26cc0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
26cd0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
26ce0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26cf0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26d00 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61  _count = 0;...ca
26d10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26d20 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26d30 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  uery = NULL;..}.
26d40 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26d50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26d60 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  ch_active = 1;..
26d70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26d80 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26d90 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09  _curr_id = 0;...
26da0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
26db0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26dc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26dd0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
26de0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
26df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
26e10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
26e20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26e30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
26e40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26e50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26e60 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
26e70 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
26e80 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
26e90 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
26ea0 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
26eb0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41  _attributes(CK_A
26ec0 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f  TTRIBUTE *a, CK_
26ed0 41 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a  ATTRIBUTE *b) {.
26ee0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
26ef0 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65  smallbuf, *large
26f00 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61  buf;..size_t sma
26f10 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65  llbuf_len, large
26f20 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61  buf_len;...if (a
26f30 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70  ->type != b->typ
26f40 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  e) {...return(0)
26f50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26f60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
26f70 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69  ... found matchi
26f80 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a  ng type ...");..
26f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26fa0 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20  INTBUF("    ... 
26fb0 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e  our value:", a->
26fc0 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c  pValue, a->ulVal
26fd0 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d  ueLen);...if (b-
26fe0 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  >pValue == NULL)
26ff0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27000 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20  G_PRINTF("      
27010 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63   ... found wildc
27020 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ard match");....
27030 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
27040 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (a->pValue ==
27050 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
27060 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28  n(0);..}.. .if (
27070 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  b->ulValueLen ==
27080 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26   a->ulValueLen &
27090 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c  & memcmp(a->pVal
270a0 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62  ue, b->pValue, b
270b0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d  ->ulValueLen) ==
270c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
270d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
270e0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78      ... found ex
270f0 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  act match");....
27100 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
27110 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29  switch (a->type)
27120 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f   {...case CKA_MO
27130 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d  DULUS:....if (a-
27140 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62  >ulValueLen == b
27150 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  ->ulValueLen) {.
27160 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
27170 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c  ....if (a->ulVal
27180 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c  ueLen > b->ulVal
27190 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61  ueLen) {.....sma
271a0 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  llbuf = b->pValu
271b0 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f  e;.....smallbuf_
271c0 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
271d0 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62  Len;......largeb
271e0 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
271f0 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e  ....largebuf_len
27200 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
27210 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
27220 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e  ..smallbuf = a->
27230 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
27240 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  lbuf_len = a->ul
27250 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
27260 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61  argebuf = b->pVa
27270 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
27280 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
27290 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09  ueLen;....}.....
272a0 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f  for (; largebuf_
272b0 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f  len != smallbuf_
272c0 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c  len; largebuf++,
272d0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20  largebuf_len--) 
272e0 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65 62  {.....if (largeb
272f0 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09  uf[0] != 0) {...
27300 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
27310 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72  ...}.....if (lar
27320 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
27330 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09  llbuf_len) {....
27340 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09  .break;....}....
27350 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67  .if (memcmp(larg
27360 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20  ebuf, smallbuf, 
27370 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d  smallbuf_len) ==
27380 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
27390 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
273a0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
273b0 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63  approximate matc
273c0 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  h");......return
273d0 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  (1);....}.....br
273e0 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
273f0 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  (0);.}..CK_DEFIN
27400 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27410 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29  , C_FindObjects)
27420 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
27430 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
27440 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
27450 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  R phObject, CK_U
27460 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74  LONG ulMaxObject
27470 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  Count, CK_ULONG_
27480 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  PTR pulObjectCou
27490 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
274a0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
274b0 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52  urr_id;..CK_ATTR
274c0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
274d0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72  ;..CK_ULONG curr
274e0 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75  _id_idx, curr_ou
274f0 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61  t_id_idx, curr_a
27500 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
27510 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e  tr_idx;..CK_ULON
27520 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  G matched_count,
27530 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f   prev_matched_co
27540 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  unt;..int mutex_
27550 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43  retval;.#ifdef C
27560 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
27570 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74  CH_SPEEDTEST..st
27580 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61  ruct timeval sta
27590 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34  rt, end;..uint64
275a0 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e  _t start_int, en
275b0 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_int;.#endif...
275c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
275d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
275e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
275f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27610 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27620 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27640 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27650 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27660 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   (pulObjectCount
27670 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
27680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27690 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62  F("Error.  pulOb
276a0 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c  jectCount is NUL
276b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
276c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
276d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  D);..}...if (phO
276e0 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  bject == NULL &&
276f0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
27700 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
27710 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
27720 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
27730 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
27740 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
27750 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
27760 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
27770 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 0;....CACKEY_D
27780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27790 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
277a0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
277b0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
277c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
277d0 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65  ..}...if (phObje
277e0 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ct == NULL) {...
277f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f  NTF("Error.  phO
27810 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29  bject is NULL.")
27820 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27830 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
27840 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62  .}...if (ulMaxOb
27850 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
27860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27870 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27880 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
27890 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69  of objects speci
278a0 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b  fied as zero.");
278b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
278c0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
278d0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
278e0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
278f0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
27900 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
27910 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27920 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
27930 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27940 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27950 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
27960 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
27970 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
27980 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27990 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
279a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
279b0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
279c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
279d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
279e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
279f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27a00 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
27a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27a20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27a30 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27a40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27a50 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
27a60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27a70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27a80 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
27a90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27aa0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
27ab0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
27ac0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
27ad0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
27ae0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
27af0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27b00 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27b10 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
27b20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27b30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27b40 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27b50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27b60 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
27b70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
27b80 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
27b90 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
27ba0 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  D);..}..#ifdef C
27bb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
27bc0 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65  CH_SPEEDTEST..ge
27bd0 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72  ttimeofday(&star
27be0 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  t, NULL);.#endif
27bf0 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
27c00 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
27c10 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b  rr_id_idx = cack
27c20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27c30 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
27c40 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64  r_id; curr_id_id
27c50 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
27c60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
27c70 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26  entities_count &
27c80 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
27c90 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b  nt; curr_id_idx+
27ca0 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d  +) {...curr_id =
27cb0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
27cc0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
27cd0 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69  tities[curr_id_i
27ce0 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  dx];....CACKEY_D
27cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
27d00 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79  cessing identity
27d10 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  :%lu", (unsigned
27d20 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69   long) curr_id_i
27d30 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f  dx);....matched_
27d40 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f  count = 0;....fo
27d50 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78  r (curr_attr_idx
27d60 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
27d70 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
27d80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27d90 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
27da0 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  nt; curr_attr_id
27db0 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d  x++) {....prev_m
27dc0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d  atched_count = m
27dd0 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09  atched_count;...
27de0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63  ..curr_attr = &c
27df0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27e00 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
27e10 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f  query[curr_attr_
27e20 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59  idx];.....CACKEY
27e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
27e40 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74   Checking for at
27e50 74 72 69 62 75 74 65 20 25 73 20 28 30 78 25 30  tribute %s (0x%0
27e60 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79  8lx) in identity
27e70 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f  :%i...", CACKEY_
27e80 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
27e90 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72  BUTE_TO_STR(curr
27ea0 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75  _attr->type), (u
27eb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
27ec0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
27ed0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
27ee0 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
27ef0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
27f00 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66   Value looking f
27f10 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d  or:", curr_attr-
27f20 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74  >pValue, curr_at
27f30 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  tr->ulValueLen);
27f40 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61  .....for (sess_a
27f50 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
27f60 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72  s_attr_idx < cur
27f70 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
27f80 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
27f90 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  r_idx++) {.....i
27fa0 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  f (cackey_pkcs11
27fb0 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
27fc0 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74  tes(&curr_id->at
27fd0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
27fe0 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74  tr_idx], curr_at
27ff0 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63  tr)) {......matc
28000 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
28010 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
28020 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74  ...}...../* If t
28030 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75  he attribute cou
28040 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65  ld not be matche
28050 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f  d, do not try to
28060 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61   match additiona
28070 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a  l attributes */.
28080 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63  ...if (prev_matc
28090 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74  hed_count == mat
280a0 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ched_count) {...
280b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
280c0 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64  }....if (matched
280d0 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79  _count == cackey
280e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
280f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
28100 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
28110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28120 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61  ("  ... All %i a
28130 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
28140 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64  d for found, add
28150 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20  ing identity:%i 
28160 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74  to returned list
28170 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f  ", (int) cackey_
28180 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28190 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
281a0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
281b0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70  r_id_idx);.....p
281c0 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74  hObject[curr_out
281d0 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f  _id_idx] = curr_
281e0 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09  id_idx + 1;.....
281f0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
28200 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74  --;.....curr_out
28210 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65  _id_idx++;...} e
28220 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
28230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
28240 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28  ... Not all %i (
28250 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61  only found %i) a
28260 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
28270 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74  d for found, not
28280 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
28290 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b  :%i", (int) cack
282a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
282b0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
282c0 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ry_count, (int) 
282d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28  matched_count, (
282e0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
282f0 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65  );...}..}..cacke
28300 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28310 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
28320 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  _id = curr_id_id
28330 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  x;..*pulObjectCo
28340 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69  unt = curr_out_i
28350 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43  d_idx;..#ifdef C
28360 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
28370 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65  CH_SPEEDTEST..ge
28380 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c  ttimeofday(&end,
28390 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69   NULL);..start_i
283a0 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73  nt = (start.tv_s
283b0 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20  ec * 1000000) + 
283c0 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09  start.tv_usec;..
283d0 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74  end_int = (end.t
283e0 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29  v_sec * 1000000)
283f0 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a   + end.tv_usec;.
28400 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
28410 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c   "Search took %l
28420 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e  u microseconds\n
28430 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
28440 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74  g) (end_int - st
28450 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69  art_int));.#endi
28460 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  f...mutex_retval
28470 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
28480 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28490 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
284a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
284b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
284c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
284d0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
284e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
284f0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28500 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
28510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28520 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
28530 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73  %i), num objects
28540 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c   = %lu", CKR_OK,
28550 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   *pulObjectCount
28560 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28570 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
28580 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28590 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  , C_FindObjectsF
285a0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
285b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
285c0 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ) {..CK_ULONG id
285d0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
285e0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
285f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
28600 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
28610 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
28620 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
28630 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28640 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
28650 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
28660 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
28670 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28680 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
28690 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
286a0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
286b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
286c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
286d0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
286e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
286f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28700 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
28710 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
28720 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
28730 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
28740 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
28750 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
28760 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
28770 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
28780 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
28790 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
287a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
287b0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
287c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
287d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
287e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
287f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28800 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
28810 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28820 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28830 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
28840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28850 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28860 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
28870 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
28880 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
28890 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
288a0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
288b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
288c0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
288d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
288e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
288f0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
28900 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28910 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
28920 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
28930 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
28940 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
28950 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ZED);..}...cacke
28960 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28970 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
28980 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69  ve = 0;...for (i
28990 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61  dx = 0; idx < ca
289a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
289b0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
289c0 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b  uery_count; idx+
289d0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
289e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
289f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
28a00 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b  y[idx].pValue) {
28a10 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
28a20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28a30 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
28a40 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09  idx].pValue);...
28a50 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  }..}...if (cacke
28a60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28a70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
28a80 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  y) {...free(cack
28a90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28aa0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
28ab0 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ry);..}...mutex_
28ac0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28ad0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
28ae0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
28af0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28b00 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
28b10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28b20 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
28b30 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
28b40 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28b50 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
28b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28b70 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28b80 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
28b90 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
28ba0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
28bb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28bc0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  RV, C_EncryptIni
28bd0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
28be0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
28bf0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
28c00 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
28c10 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
28c20 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
28c30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28c40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28c50 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28c60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28c70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28c80 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28c90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28ca0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28cb0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28cc0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
28cd0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28ce0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
28cf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
28d00 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
28d10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
28d20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
28d30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28d40 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
28d50 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28d60 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28  _RV, C_Encrypt)(
28d70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28d80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
28d90 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
28da0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
28db0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28dc0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
28dd0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
28de0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29  ncryptedDataLen)
28df0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
28e00 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28e10 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28e20 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28e30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28e40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28e50 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28e60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28e70 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
28e80 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28e90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28ea0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28eb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
28ec0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
28ed0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
28ee0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
28ef0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
28f00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28f10 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
28f20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28f30 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61  V, C_EncryptUpda
28f40 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
28f50 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28f60 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
28f70 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
28f80 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
28f90 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
28fa0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
28fb0 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
28fc0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
28fd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
28fe0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
28ff0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29000 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29010 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29020 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29030 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29040 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29050 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29060 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29070 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29080 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
290a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
290b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
290c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
290d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
290e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
290f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29100 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
29110 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
29120 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
29130 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29140 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72  LastEncryptedPar
29150 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
29160 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64  pulLastEncrypted
29170 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
29180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29190 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
291a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
291b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
291c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
291d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
291e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
291f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29200 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29210 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
29220 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29230 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
29240 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29250 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
29260 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29270 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
29280 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
29290 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
292a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
292b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
292c0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
292d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
292e0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
292f0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
29300 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
29310 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
29320 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
29330 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
29340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29350 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29360 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29370 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29390 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
293a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
293b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
293c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
293d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
293e0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
293f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29400 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29410 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
29420 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29430 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29440 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
29450 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
29460 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
29470 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
29480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29490 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
294a0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
294b0 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
294c0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
294d0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
294e0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
294f0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
29500 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
29510 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
29520 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
29530 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
29540 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
29550 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
29560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29570 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
29580 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
29590 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
295a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
295b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
295c0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
295d0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
295e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
295f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
29600 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29620 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
29630 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29640 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29650 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
29660 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
29670 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
29680 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29690 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
296a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
296b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
296c0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
296d0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
296e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
296f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
29700 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29710 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
29720 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
29730 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
29740 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29750 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
29760 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
29770 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29780 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
29790 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
297a0 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
297b0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
297c0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
297d0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
297e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
297f0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29800 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
29810 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29820 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29830 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29840 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29850 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
29860 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
29870 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
29880 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
29890 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
298a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
298b0 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
298c0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
298d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
298e0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
298f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29900 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
29910 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
29920 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29930 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
29940 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79  ve = 1;...cackey
29950 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29960 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
29970 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
29980 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  sm->mechanism;..
29990 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
299a0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
299b0 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d  t_mech_parm = pM
299c0 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d  echanism->pParam
299d0 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65  eter;..cackey_se
299e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
299f0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
29a00 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69  rmlen = pMechani
29a10 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c  sm->ulParameterL
29a20 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  en;..cackey_sess
29a30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
29a40 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20  ecrypt_identity 
29a50 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
29a60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
29a70 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
29a80 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
29a90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29aa0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29ab0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
29ac0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
29ad0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29ae0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
29af0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
29b00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29b10 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29b20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29b30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29b40 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
29b50 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
29b60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
29b70 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29b80 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
29b90 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
29ba0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
29bb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
29bc0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
29bd0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
29be0 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  edDataLen, CK_BY
29bf0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
29c00 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
29c10 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  taLen) {..CK_ULO
29c20 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  NG datalen_updat
29c30 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  e, datalen_final
29c40 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74  ;..CK_RV decrypt
29c50 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
29c60 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
29c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29c80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29c90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29ca0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29cc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29cd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29ce0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29cf0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29d00 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
29d10 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  DataLen == NULL)
29d20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29d30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29d40 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e   pulDataLen is N
29d50 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29d60 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29d70 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c  BAD);..}...datal
29d80 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c  en_update = *pul
29d90 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79  DataLen;...decry
29da0 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
29db0 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  ptUpdate(hSessio
29dc0 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  n, pEncryptedDat
29dd0 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  a, ulEncryptedDa
29de0 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64  taLen, pData, &d
29df0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a  atalen_update);.
29e00 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
29e10 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
29e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29e30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
29e40 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74  ryptUpdate() ret
29e50 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
29e60 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
29e70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
29e80 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20  ypt_ret);....if 
29e90 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
29ea0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
29eb0 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65  MALL) {..../* Te
29ec0 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69  rminate decrypti
29ed0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
29ee0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
29ef0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
29f00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29f10 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
29f20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
29f30 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
29f40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29f50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
29f60 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
29f70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29f80 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
29f90 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
29fa0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
29fb0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
29fc0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29fd0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29fe0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
29ff0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a000 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2a010 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2a020 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2a030 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2a040 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
2a050 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2a060 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2a070 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
2a080 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2a090 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a0a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
2a0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a0c0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2a0d0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
2a0e0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
2a0f0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2a100 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a110 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
2a120 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a130 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2a140 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f   = 0;.....mutex_
2a150 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a160 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a170 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
2a180 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2a190 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
2a1a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a1b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2a1c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2a1d0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a1e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a1f0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
2a200 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
2a210 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29  ..}...if (pData)
2a220 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61   {...pData += da
2a230 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d  talen_update;..}
2a240 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20  ..datalen_final 
2a250 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20  = *pulDataLen - 
2a260 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
2a270 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
2a280 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68  C_DecryptFinal(h
2a290 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20  Session, pData, 
2a2a0 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b  &datalen_final);
2a2b0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
2a2c0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
2a2d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a2e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2a2f0 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74  cryptFinal() ret
2a300 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
2a310 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
2a320 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
2a330 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ypt_ret);....ret
2a340 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
2a350 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c  ;..}...*pulDataL
2a360 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en = datalen_upd
2a370 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69  ate + datalen_fi
2a380 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  nal;...CACKEY_DE
2a390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a3a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2a3b0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2a3c0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2a3d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a3e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2a3f0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2a400 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2a410 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2a420 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2a430 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2a440 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2a450 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2a460 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2a470 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2a480 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
2a490 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69  buf[16384];..ssi
2a4a0 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b  ze_t buflen;..CK
2a4b0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
2a4c0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
2a4d0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
2a4e0 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  OR;..int mutex_r
2a4f0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2a500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2a510 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2a520 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2a530 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2a540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a550 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2a560 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2a570 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2a580 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2a590 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2a5a0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2a5b0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2a5c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2a5d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2a5e0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2a5f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a600 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a610 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2a620 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2a630 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2a640 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2a650 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
2a660 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
2a670 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65  LL && ulEncrypte
2a680 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
2a690 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
2a6a0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
2a6b0 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e  ked to decrypt n
2a6c0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
2a6d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a6e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a6f0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
2a700 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
2a710 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
2a720 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
2a730 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
2a740 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2a750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a760 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70  ("Error. pEncryp
2a770 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  tedPart is NULL,
2a780 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64   but ulEncrypted
2a790 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
2a7a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a7b0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2a7c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e  );..}...if (ulEn
2a7d0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
2a7e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a7f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a800 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64  ror. ulEncrypted
2a810 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
2a820 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
2a830 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2a840 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2a850 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
2a860 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  ulPartLen == NUL
2a870 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2a880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a890 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73  r. pulPartLen is
2a8a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2a8b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2a8c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
2a8d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2a8e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2a8f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2a900 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2a910 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2a920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a930 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2a940 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2a950 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a960 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2a970 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2a980 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2a990 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2a9a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a9b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2a9c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a9d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2a9e0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2a9f0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2aa00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2aa10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2aa20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2aa30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2aa40 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2aa50 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2aa60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2aa70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2aa80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aa90 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
2aaa0 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
2aab0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2aac0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2aad0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2aae0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
2aaf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ab00 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
2ab10 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
2ab20 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
2ab30 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2ab40 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2ab50 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
2ab60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ab70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2ab80 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2ab90 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
2aba0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
2abb0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
2abc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2abd0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2abe0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
2abf0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
2ac00 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2ac10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ac20 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2ac30 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2ac40 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
2ac50 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
2ac60 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
2ac70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2ac80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2ac90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2aca0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2acb0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
2acc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2acd0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
2ace0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
2acf0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
2ad00 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
2ad10 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09  to decrypt */...
2ad20 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  .buflen = cackey
2ad30 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2ad40 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2ad50 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2ad60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2ad70 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
2ad80 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2ad90 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2ada0 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
2adb0 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09  buf), 0, 1);....
2adc0 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43  .if (buflen == C
2add0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
2ade0 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65 79  DLOGIN && cackey
2adf0 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20  _pin_command != 
2ae00 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20 28  NULL) {.....if (
2ae10 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67  _C_LoginMutexArg
2ae20 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55  (hSession, CKU_U
2ae30 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29  SER, NULL, 0, 0)
2ae40 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
2ae50 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
2ae60 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2ae70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2ae80 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2ae90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2aea0 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
2aeb0 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
2aec0 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
2aed0 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
2aee0 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 09  f(buf), 0, 1);..
2aef0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
2af00 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a   (buflen < 0) {.
2af10 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f  ..../* Decryptio
2af20 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  n failed. */....
2af30 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43  .if (buflen == C
2af40 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
2af50 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72  DLOGIN) {......r
2af60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52  etval = CKR_USER
2af70 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a  _NOT_LOGGED_IN;.
2af80 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62  ....} else if (b
2af90 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2afa0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2afb0 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2afc0 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2afd0 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2afe0 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  se {......CACKEY
2aff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
2b000 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
2b010 44 55 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69 22  DU, error = %li"
2b020 2c 20 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75 66  , (long int) buf
2b030 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74 76  len);.......retv
2b040 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c  al = CKR_GENERAL
2b050 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09  _ERROR;.....}...
2b060 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e  .} else if (((un
2b070 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
2b080 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c  len) > *pulPartL
2b090 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09  en && pPart) {..
2b0a0 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20  .../* Decrypted 
2b0b0 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
2b0c0 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  /.....retval = C
2b0d0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2b0e0 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ALL;....} else {
2b0f0 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20  .....if (pPart) 
2b100 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50  {......memcpy(pP
2b110 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e  art, buf, buflen
2b120 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  );.....}......*p
2b130 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c  ulPartLen = bufl
2b140 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
2b150 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
2b160 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
2b170 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2b180 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b190 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b1a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2b1b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2b1c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b1d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2b1e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2b1f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2b200 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2b210 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b220 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b230 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
2b240 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
2b250 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
2b260 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2b270 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46  K_RV, C_DecryptF
2b280 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2b290 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2b2a0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
2b2b0 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  astPart, CK_ULON
2b2c0 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72  G_PTR pulLastPar
2b2d0 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
2b2e0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
2b2f0 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2b300 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f  t = 1;...CACKEY_
2b310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b320 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b330 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b340 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b360 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2b370 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2b380 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b390 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b3a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2b3b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2b3c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2b3d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2b3e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2b3f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2b400 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b410 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b420 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2b430 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2b440 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2b450 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2b460 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c  );..}...if (pulL
2b470 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  astPartLen == NU
2b480 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2b490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b4a0 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  or. pulLastPartL
2b4b0 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
2b4c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2b4d0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2b4e0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2b4f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2b500 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b510 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2b520 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2b530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b540 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2b550 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2b560 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2b570 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2b580 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2b590 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b5a0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2b5b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b5c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b5d0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2b5e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b5f0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2b600 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2b610 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2b620 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2b630 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2b640 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b650 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
2b660 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2b670 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2b680 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b690 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b6a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b6b0 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
2b6c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2b6d0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2b6e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2b6f0 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74  );..}...*pulLast
2b700 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69  PartLen = 0;...i
2b710 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20  f (pLastPart == 
2b720 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e  NULL) {...termin
2b730 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b  ate_decrypt = 0;
2b740 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e  ..}...if (termin
2b750 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09  ate_decrypt) {..
2b760 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b770 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2b780 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  pt_active = 0;..
2b790 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2b7a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2b7b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2b7c0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2b7d0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2b7e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b7f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b800 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2b810 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b820 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b830 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2b840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2b850 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2b860 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2b870 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2b880 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b890 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b8a0 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53  DigestInit)(CK_S
2b8b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b8c0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2b8d0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2b8e0 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ism) {..CACKEY_D
2b8f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2b900 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2b910 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2b920 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2b930 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b940 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2b950 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2b960 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2b970 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b980 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b990 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b9a0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2b9b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2b9c0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2b9d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b9e0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2b9f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ba00 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2ba10 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ba20 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29  CK_RV, C_Digest)
2ba30 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ba40 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ba50 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2ba60 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2ba70 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2ba80 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
2ba90 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
2baa0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2bab0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2bac0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2bad0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2bae0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2baf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bb00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2bb10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2bb20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2bb30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2bb40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2bb50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2bb60 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2bb70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2bb80 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2bb90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bba0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2bbb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2bbc0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2bbd0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2bbe0 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70  K_RV, C_DigestUp
2bbf0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2bc00 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2bc10 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2bc20 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2bc30 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2bc40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bc50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2bc60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2bc70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2bc80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bc90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2bca0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2bcb0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2bcc0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2bcd0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2bce0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2bcf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2bd00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2bd10 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2bd20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2bd30 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2bd40 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2bd50 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2bd60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2bd70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2bd80 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  estKey)(CK_SESSI
2bd90 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2bda0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
2bdb0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
2bdc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bdd0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2bde0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2bdf0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2be00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2be10 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2be20 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2be30 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2be40 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2be50 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2be60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2be80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2be90 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2bea0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2beb0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2bec0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2bed0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2bee0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2bef0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2bf00 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53  igestFinal)(CK_S
2bf10 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2bf20 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2bf30 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f  PTR pDigest, CK_
2bf40 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67  ULONG_PTR pulDig
2bf50 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  estLen) {..CACKE
2bf60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bf70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2bf80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2bf90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2bfa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bfb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2bfc0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2bfd0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2bfe0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2bff0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2c000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2c010 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2c020 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c030 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2c040 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c050 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2c060 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c070 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2c080 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2c090 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2c0a0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2c0b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c0c0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2c0d0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2c0e0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2c0f0 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74  hKey) {..int mut
2c100 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65  ex_retval;...hKe
2c110 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  y--;...CACKEY_DE
2c120 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2c130 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2c140 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2c150 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c160 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c170 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2c180 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c190 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2c1a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2c1b0 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
2c1c0 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ism == NULL) {..
2c1d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c1e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65  INTF("Error. pMe
2c1f0 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e  chanism is NULL.
2c200 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c210 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2c220 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
2c230 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2c240 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53   != CKM_RSA_PKCS
2c250 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c260 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c270 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  . pMechanism->me
2c280 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63  chanism not spec
2c290 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41  ified as CKM_RSA
2c2a0 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75  _PKCS");....retu
2c2b0 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d  rn(CKR_MECHANISM
2c2c0 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b  _PARAM_INVALID);
2c2d0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2c2e0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2c2f0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2c300 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2c310 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2c320 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2c330 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c340 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c350 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2c360 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2c370 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2c380 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2c390 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2c3a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2c3b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2c3c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2c3d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2c3e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c3f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c400 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2c410 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c420 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2c430 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2c440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c450 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2c460 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2c470 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2c480 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2c490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c4a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c4b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2c4c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2c4d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2c4e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2c4f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c500 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c510 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c520 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c530 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c540 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c550 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c560 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e   Sign already in
2c570 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09   progress.");...
2c580 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2c590 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
2c5a0 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e  ..}...if (hKey >
2c5b0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2c5c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
2c5d0 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a  tities_count) {.
2c5e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2c5f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c600 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2c610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c620 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c  rror.  Key handl
2c630 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  e out of range (
2c640 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c  requested key %l
2c650 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e  u, only %lu iden
2c660 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65  tities available
2c670 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2c680 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69  ong) hKey, (unsi
2c690 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65  gned long) cacke
2c6a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c6b0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2c6c0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
2c6d0 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45  n(CKR_KEY_HANDLE
2c6e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2c6f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c700 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2c710 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63  ctive = 1;...cac
2c720 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c730 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
2c740 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
2c750 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a  sm->mechanism;..
2c760 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c770 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c780 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63  buflen = 128;..c
2c790 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c7a0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c7b0 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b  fused = 0;..cack
2c7c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c7d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
2c7e0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
2c7f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c800 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2c810 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
2c820 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c830 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09  sign_buflen);...
2c840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c850 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75  NTF("Session %lu
2c860 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69   sign_identity i
2c870 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23  s %p (identity #
2c880 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
2c890 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c   long) hSession,
2c8a0 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65   (void *) &cacke
2c8b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c8c0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2c8d0 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64  hKey], (unsigned
2c8e0 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63   long) hKey);..c
2c8f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c900 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
2c910 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
2c920 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c930 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
2c940 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  Key];...mutex_re
2c950 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2c960 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c970 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2c980 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2c990 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2c9a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c9b0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2c9c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2c9d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2c9e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2c9f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ca00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ca10 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2ca20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ca30 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2ca40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ca50 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53  , C_Sign)(CK_SES
2ca60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ca70 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ca80 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2ca90 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2caa0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2cab0 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
2cac0 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
2cad0 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
2cae0 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62  ong start_sign_b
2caf0 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73  ufused;..CK_RV s
2cb00 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  ign_ret;..int mu
2cb10 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2cb20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cb30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2cb40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2cb50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2cb60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cb70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2cb80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2cb90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2cba0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2cbb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2cbc0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2cbd0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2cbe0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2cbf0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2cc00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2cc10 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2cc20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2cc30 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2cc40 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2cc50 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2cc60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2cc70 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61  VALID);..}...sta
2cc80 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20  rt_sign_bufused 
2cc90 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2cca0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ccb0 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e  _bufused;...sign
2ccc0 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64  _ret = C_SignUpd
2ccd0 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  ate(hSession, pD
2cce0 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b  ata, ulDataLen);
2ccf0 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
2cd00 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
2cd10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cd20 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55  F("Error.  SignU
2cd30 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
2cd40 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
2cd50 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
2cd60 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
2cd70 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65  ;....if (sign_re
2cd80 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
2cd90 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
2cda0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2cdb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2cdc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2cdd0 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2cde0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2cdf0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ce00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2ce10 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2ce20 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ce30 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2ce40 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
2ce50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ce60 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2ce70 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
2ce80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2ce90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2cea0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ceb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2cec0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2ced0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
2cee0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2cef0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2cf00 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
2cf10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cf20 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2cf30 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2cf40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2cf50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2cf60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2cf70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cf80 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
2cf90 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2cfa0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2cfb0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2cfc0 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ED);....}.....ca
2cfd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cfe0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2cff0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74  ive = 0;.....mut
2d000 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d010 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2d020 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2d030 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
2d040 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
2d050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d060 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2d070 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2d080 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
2d090 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2d0a0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  );....}...}....r
2d0b0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
2d0c0 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ..}...sign_ret =
2d0d0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65   C_SignFinal(hSe
2d0e0 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72  ssion, pSignatur
2d0f0 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  e, pulSignatureL
2d100 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72  en);..if (sign_r
2d110 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
2d120 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d  ..if (sign_ret =
2d130 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2d140 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43  _SMALL) {....CAC
2d150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d160 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65  ("SignFinal() re
2d170 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45  turned CKR_BUFFE
2d180 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20  R_TOO_SMALL (rv 
2d190 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20  = %lu), undoing 
2d1a0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c  C_SignUpdate()",
2d1b0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2d1c0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09   sign_ret);.....
2d1d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d1e0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2d1f0 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73  ufused = start_s
2d200 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09  ign_bufused;....
2d210 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2d220 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
2d230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d240 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c  rror.  SignFinal
2d250 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  () returned fail
2d260 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22  ure (rv = %lu)."
2d270 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2d280 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
2d290 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
2d2a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e  ;..}...if (pSign
2d2b0 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ature == NULL) {
2d2c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d2d0 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75  PRINTF("pSignatu
2d2e0 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20  re specified as 
2d2f0 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f  NULL, undoing C_
2d300 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a  SignUpdate()");.
2d310 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2d320 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d330 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72  n_bufused = star
2d340 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
2d350 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
2d360 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  et);..}...CACKEY
2d370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d380 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2d390 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2d3a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2d3b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2d3c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2d3d0 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f  _SignUpdate)(CK_
2d3e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2d3f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2d400 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2d410 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20  LONG ulPartLen) 
2d420 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
2d430 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2d440 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2d450 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2d460 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2d470 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d480 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d490 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2d4a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d4b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2d4c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d4d0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2d4e0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2d4f0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2d500 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2d510 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2d520 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2d530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2d550 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2d560 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2d570 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2d580 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2d590 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
2d5a0 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72  == NULL && ulPar
2d5b0 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f  tLen == 0) {.../
2d5c0 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20  * Short circuit 
2d5d0 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20  if we are asked 
2d5e0 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e  to sign nothing.
2d5f0 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
2d600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d610 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2d620 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
2d630 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
2d640 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2d650 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20  ..}...if (pPart 
2d660 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2d670 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d680 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69  ("Error. pPart i
2d690 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61  s NULL, but ulPa
2d6a0 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
2d6b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d6c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2d6d0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74  ..}...if (ulPart
2d6e0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
2d6f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d700 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74  F("Error. ulPart
2d710 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50  Len is 0, but pP
2d720 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  art is not NULL.
2d730 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d740 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2d750 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2d760 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2d770 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2d780 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2d790 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2d7a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d7b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d7c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2d7d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d7e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2d7f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2d800 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d810 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2d820 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2d830 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2d840 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2d850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d860 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2d870 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2d880 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d890 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d8a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2d8b0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2d8c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d8d0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2d8e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d8f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d900 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d910 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d920 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
2d930 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2d940 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2d950 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d960 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
2d970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d980 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
2d990 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
2d9a0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
2d9b0 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65  .../* Accumulate
2d9c0 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09   directly */....
2d9d0 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73  if ((cackey_sess
2d9e0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d9f0 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c  ign_bufused + ul
2da00 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65  PartLen) > cacke
2da10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2da20 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
2da30 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
2da40 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2da50 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d  ].sign_buflen *=
2da60 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f   2;......cackey_
2da70 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2da80 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65  n].sign_buf = re
2da90 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73  alloc(cackey_ses
2daa0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2dab0 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66  sign_buf, sizeof
2dac0 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
2dad0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2dae0 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
2daf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2db00 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
2db10 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
2db20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2db30 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2db40 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73  uf + cackey_sess
2db50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2db60 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61  ign_bufused, pPa
2db70 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a  rt, ulPartLen);.
2db80 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2db90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2dba0 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c  gn_bufused += ul
2dbb0 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65  PartLen;.....bre
2dbc0 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
2dbd0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2dbe0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2dbf0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2dc00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2dc10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2dc20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2dc30 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2dc40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2dc50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2dc60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2dc70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc80 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2dc90 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2dca0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2dcb0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2dcc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2dcd0 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28  V, C_SignFinal)(
2dce0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dcf0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2dd00 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2dd10 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
2dd20 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2dd30 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
2dd40 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d  YTE sigbuf[1024]
2dd50 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75  ;..ssize_t sigbu
2dd60 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
2dd70 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
2dd80 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
2dd90 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
2dda0 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  t terminate_sign
2ddb0 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78   = 1;..int mutex
2ddc0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
2ddd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dde0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2ddf0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2de00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2de10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2de20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2de30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2de40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2de50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2de60 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2de70 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20  SignatureLen == 
2de80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2de90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dea0 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75  rror. pulSignatu
2deb0 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  reLen is NULL.")
2dec0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ded0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2dee0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2def0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2df00 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2df10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2df20 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2df30 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2df40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2df50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2df60 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2df70 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2df80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2df90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2dfa0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2dfb0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2dfc0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2dfd0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2dfe0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2dff0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e000 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e010 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2e020 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e030 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2e040 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2e050 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e060 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2e070 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2e080 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2e090 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2e0a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e0b0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2e0c0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2e0d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2e0e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2e0f0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2e100 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2e110 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2e120 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2e130 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e140 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e150 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2e160 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e170 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
2e180 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2e190 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2e1a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e1b0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
2e1c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2e1d0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
2e1e0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
2e1f0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
2e200 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
2e210 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
2e220 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
2e230 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e240 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e250 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
2e260 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
2e270 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
2e280 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
2e290 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2e2a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2e2b0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
2e2c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
2e2d0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
2e2e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e2f0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
2e300 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
2e310 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
2e320 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
2e330 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
2e340 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2e350 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2e360 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
2e370 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2e380 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
2e390 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e3a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
2e3b0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
2e3c0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
2e3d0 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
2e3e0 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41  to sign */....CA
2e3f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e400 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67  F("Asking to sig
2e410 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20  n from identity 
2e420 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c  %p in session %l
2e430 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63  u", (void *) cac
2e440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e450 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
2e460 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  tity, (unsigned 
2e470 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b  long) hSession);
2e480 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20  ....sigbuflen = 
2e490 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
2e4a0 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  pt(&cackey_slots
2e4b0 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79  [slotID], cackey
2e4c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e4d0 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74  on].sign_identit
2e4e0 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  y, cackey_sessio
2e4f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e500 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65  n_buf, cackey_se
2e510 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e520 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73  .sign_bufused, s
2e530 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69  igbuf, sizeof(si
2e540 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09  gbuf), 1, 0);...
2e550 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20  ..if (sigbuflen 
2e560 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2e570 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61  _NEEDLOGIN && ca
2e580 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
2e590 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
2e5a0 69 66 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65  if (_C_LoginMute
2e5b0 78 41 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43  xArg(hSession, C
2e5c0 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30  KU_USER, NULL, 0
2e5d0 2c 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  , 0) == CKR_OK) 
2e5e0 7b 0a 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e  {......sigbuflen
2e5f0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2e600 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2e610 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2e620 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e630 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
2e640 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73  tity, cackey_ses
2e650 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e660 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79  sign_buf, cackey
2e670 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e680 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2e690 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66  , sigbuf, sizeof
2e6a0 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b  (sigbuf), 1, 0);
2e6b0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
2e6c0 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20  if (sigbuflen < 
2e6d0 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  0) {...../* Sign
2e6e0 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09  ing failed. */..
2e6f0 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
2e700 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2e710 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  E_NEEDLOGIN) {..
2e720 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2e730 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44  _USER_NOT_LOGGED
2e740 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  _IN;.....} else 
2e750 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d  if (sigbuflen ==
2e760 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
2e770 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
2e780 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2e790 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
2e7a0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
2e7b0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
2e7c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
2e7d0 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  ..}....} else if
2e7e0 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
2e7f0 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20  g) sigbuflen) > 
2e800 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
2e810 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29 20   && pSignature) 
2e820 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20  {...../* Signed 
2e830 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a  data too large *
2e840 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  /.....CACKEY_DEB
2e850 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61  UG_PRINTF("retva
2e860 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2e870 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75  OO_SMALL;  sigbu
2e880 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53  flen = %lu, pulS
2e890 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c  ignatureLen = %l
2e8a0 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
2e8b0 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28  ng) sigbuflen, (
2e8c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
2e8d0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
2e8e0 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2e8f0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2e900 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69  MALL;......termi
2e910 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09  nate_sign = 0;..
2e920 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74  ..} else {.....t
2e930 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2e940 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67  0;......if (pSig
2e950 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d  nature) {......m
2e960 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72 65  emcpy(pSignature
2e970 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75 66  , sigbuf, sigbuf
2e980 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d  len);.......term
2e990 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a  inate_sign = 1;.
2e9a0 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53  ....}......*pulS
2e9b0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69  ignatureLen = si
2e9c0 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65  gbuflen;......re
2e9d0 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
2e9e0 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
2e9f0 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74  }...if (terminat
2ea00 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28  e_sign) {...if (
2ea10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ea20 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2ea30 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  uf) {....free(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 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ea60 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
2ea70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ea80 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
2ea90 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  = 0;..}...mutex_
2eaa0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2eab0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2eac0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2ead0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2eae0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2eaf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2eb00 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2eb10 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2eb20 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2eb30 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2eb40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eb50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69  TF("Returning %i
2eb60 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
2eb70 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  ;...return(retva
2eb80 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
2eb90 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2eba0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e   C_SignRecoverIn
2ebb0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2ebc0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2ebd0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2ebe0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2ebf0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2ec00 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2ec10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ec20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ec30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2ec40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ec50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ec60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2ec70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ec80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2ec90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2eca0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2ecb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2ecc0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2ecd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2ece0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ecf0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ed00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ed10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ed20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ed30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ed40 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
2ed50 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ver)(CK_SESSION_
2ed60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ed70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2ed80 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2ed90 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2eda0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2edb0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2edc0 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
2edd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ede0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2edf0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ee00 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ee10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ee20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ee30 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ee40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ee50 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ee60 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2ee70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ee80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2ee90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eea0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2eeb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2eec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2eed0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2eee0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2eef0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2ef00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ef10 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b  C_VerifyInit)(CK
2ef20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ef30 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2ef40 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2ef50 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2ef60 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2ef70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ef80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ef90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2efa0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2efb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2efc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2efd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2efe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2eff0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2f000 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2f010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f020 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f030 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f040 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2f050 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f060 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2f070 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2f080 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f090 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2f0a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2f0b0 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53  C_Verify)(CK_SES
2f0c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f0d0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2f0e0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2f0f0 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2f100 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2f110 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
2f120 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
2f130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f140 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2f150 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2f160 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2f170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f180 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2f190 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2f1a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2f1b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2f1c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2f1d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f1e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f1f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f200 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2f210 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f220 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2f230 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2f240 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f250 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2f260 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2f270 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29 28  C_VerifyUpdate)(
2f280 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2f290 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2f2a0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2f2b0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2f2c0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2f2d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2f2e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2f2f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2f300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f320 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2f330 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f340 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2f350 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f360 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f370 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f380 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f3a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f3b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f3c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2f3d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f3e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2f3f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f400 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e  _RV, C_VerifyFin
2f410 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2f420 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2f430 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2f440 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2f450 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
2f460 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2f470 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2f480 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2f490 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2f4a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f4b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f4c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2f4d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2f4e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2f4f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2f500 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f510 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f520 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f530 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2f540 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2f550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f560 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2f570 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f580 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2f590 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2f5a0 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76  V, C_VerifyRecov
2f5b0 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
2f5c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2f5d0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2f5e0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2f5f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2f600 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2f610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f620 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2f630 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2f640 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2f650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f660 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2f670 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2f680 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2f690 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2f6a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2f6b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2f6c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2f6d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f6e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2f6f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f700 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2f710 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f720 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2f730 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2f740 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
2f750 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  fyRecover)(CK_SE
2f760 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2f770 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2f780 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
2f790 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74  K_ULONG ulSignat
2f7a0 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ureLen, CK_BYTE_
2f7b0 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
2f7c0 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c  ONG_PTR pulDataL
2f7d0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2f7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f7f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f800 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f810 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f820 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f830 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f840 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f850 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f860 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f870 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f880 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f890 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2f8a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2f8b0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2f8c0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f8d0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f8e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f8f0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2f900 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f910 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e  K_RV, C_DigestEn
2f920 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2f930 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f940 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f950 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2f960 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
2f970 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2f980 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2f990 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
2f9a0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2f9b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f9c0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2f9d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2f9e0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2f9f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fa00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2fa10 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2fa20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2fa30 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2fa40 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2fa50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fa60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2fa70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fa80 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2fa90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2faa0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2fab0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2fac0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fad0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2fae0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2faf0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
2fb00 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2fb10 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2fb20 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2fb30 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2fb40 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
2fb50 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
2fb60 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2fb70 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
2fb80 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2fb90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fba0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2fbb0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2fbc0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2fbd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2fbe0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2fbf0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2fc00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2fc10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2fc20 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2fc30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2fc40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2fc50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fc60 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2fc70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fc80 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2fc90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fca0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2fcb0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2fcc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2fcd0 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
2fce0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2fcf0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2fd00 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2fd10 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2fd20 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2fd30 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2fd40 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
2fd50 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
2fd60 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2fd70 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2fd80 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fd90 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fda0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fdb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fdc0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fdd0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fde0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fdf0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fe00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fe10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2fe20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fe30 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2fe40 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2fe50 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2fe60 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2fe70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fe80 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2fe90 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fea0 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  , C_DecryptVerif
2feb0 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  yUpdate)(CK_SESS
2fec0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2fed0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2fee0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2fef0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72   CK_ULONG ulEncr
2ff00 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b  yptedPartLen, CK
2ff10 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
2ff20 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2ff30 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2ff40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ff50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ff60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ff70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ff80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ff90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ffa0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ffb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2ffc0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2ffd0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2ffe0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fff0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
30000 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30010 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
30020 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30030 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
30040 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30050 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
30060 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30070 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
30080 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45  nerateKey)(CK_SE
30090 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
300a0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
300b0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
300c0 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
300d0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
300e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
300f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30100 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
30110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30120 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30130 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30140 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30150 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30160 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30170 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30180 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30190 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
301a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
301b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
301c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
301d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
301e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
301f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30200 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30210 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30220 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30230 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30240 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30250 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
30260 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
30270 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30280 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
30290 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
302a0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 75  TTRIBUTE_PTR pPu
302b0 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c  blicKeyTemplate,
302c0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c   CK_ULONG ulPubl
302d0 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  icKeyAttributeCo
302e0 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  unt, CK_ATTRIBUT
302f0 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b 65  E_PTR pPrivateKe
30300 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  yTemplate, CK_UL
30310 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79  ONG ulPrivateKey
30320 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
30330 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30340 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79  _PTR phPublicKey
30350 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30360 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74 65  LE_PTR phPrivate
30370 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
30380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30390 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
303a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
303b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
303c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
303d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
303e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
303f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
30400 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
30410 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30420 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30430 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
30440 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
30450 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
30460 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30470 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
30480 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30490 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
304a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
304b0 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79  CK_RV, C_WrapKey
304c0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
304d0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
304e0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
304f0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
30500 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61  JECT_HANDLE hWra
30510 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ppingKey, CK_OBJ
30520 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c  ECT_HANDLE hKey,
30530 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72   CK_BYTE_PTR pWr
30540 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f  appedKey, CK_ULO
30550 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65  NG_PTR pulWrappe
30560 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  dKeyLen) {..CACK
30570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30580 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
30590 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
305a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
305b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
305c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
305d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
305e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
305f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
30600 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
30610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30620 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30630 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30640 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
30650 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30660 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
30670 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
30680 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
30690 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
306a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77  ION(CK_RV, C_Unw
306b0 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
306c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
306d0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
306e0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
306f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
30700 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79  E hUnwrappingKey
30710 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
30720 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
30730 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79  ONG ulWrappedKey
30740 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  Len, CK_ATTRIBUT
30750 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
30760 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72   CK_ULONG ulAttr
30770 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
30780 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
30790 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45   phKey) {..CACKE
307a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
307b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
307c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
307d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
307e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
307f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
30800 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
30810 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
30820 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
30830 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
30840 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
30850 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
30860 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30870 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
30880 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30890 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
308a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
308b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
308c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
308d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69  ON(CK_RV, C_Deri
308e0 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  veKey)(CK_SESSIO
308f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30900 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
30910 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
30920 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30930 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54   hBaseKey, CK_AT
30940 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
30950 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
30960 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
30970 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30980 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
30990 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
309a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
309b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
309c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
309d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
309e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
309f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30a00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30a10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
30a20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
30a30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30a40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30a50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30a60 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30a70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30a80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30a90 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30aa0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30ab0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
30ac0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30ad0 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b  C_SeedRandom)(CK
30ae0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
30af0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
30b00 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f  E_PTR pSeed, CK_
30b10 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29  ULONG ulSeedLen)
30b20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
30b30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30b40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
30b50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
30b60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
30b70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
30b80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
30b90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
30ba0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
30bb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30bc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30bd0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30be0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30bf0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
30c00 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
30c10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30c20 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
30c30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30c40 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
30c50 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30c60 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e  V, C_GenerateRan
30c70 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  dom)(CK_SESSION_
30c80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
30c90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61   CK_BYTE_PTR pRa
30ca0 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  ndomData, CK_ULO
30cb0 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20  NG ulRandomLen) 
30cc0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30cd0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30ce0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
30cf0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
30d00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30d10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
30d20 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
30d30 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
30d40 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
30d50 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
30d60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30d70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
30d80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30d90 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
30da0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30db0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
30dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
30dd0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30de0 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  ED);.}../* Depre
30df0 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
30e00 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
30e10 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
30e20 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29  tFunctionStatus)
30e30 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30e40 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
30e50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30e60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30e70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30e80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30e90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30ea0 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
30eb0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
30ec0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
30ed0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
30ee0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
30ef0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
30f00 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
30f10 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
30f20 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
30f30 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64  }../* Deprecated
30f40 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f   Function */.CK_
30f50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
30f60 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46  CK_RV, C_CancelF
30f70 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53  unction)(CK_SESS
30f80 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
30f90 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
30fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30fb0 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
30fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
30fd0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
30fe0 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
30ff0 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
31000 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
31010 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
31020 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
31030 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
31040 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
31050 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
31060 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
31070 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
31080 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
31090 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69  _RV, C_GetFuncti
310a0 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54  onList)(CK_FUNCT
310b0 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52  ION_LIST_PTR_PTR
310c0 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29   ppFunctionList)
310d0 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f   {..CK_FUNCTION_
310e0 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69  LIST_PTR pFuncti
310f0 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59  onList;...CACKEY
31100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
31110 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
31120 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
31130 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
31140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31150 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69  "Error. ppFuncti
31160 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22  onList is NULL."
31170 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
31180 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
31190 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ..}...pFunctionL
311a0 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ist = malloc(siz
311b0 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69  eof(*pFunctionLi
311c0 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f  st));...pFunctio
311d0 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
311e0 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
311f0 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
31200 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
31210 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  0xff;..pFunction
31220 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69  List->version.mi
31230 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
31240 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
31250 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
31260 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ff;...pFunctionL
31270 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a  ist->C_Initializ
31280 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  e = C_Initialize
31290 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
312a0 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43  ->C_Finalize = C
312b0 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e  _Finalize;..pFun
312c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
312d0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f  Info = C_GetInfo
312e0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
312f0 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20  ->C_GetSlotList 
31300 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b  = C_GetSlotList;
31310 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31320 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d  >C_GetSlotInfo =
31330 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a   C_GetSlotInfo;.
31340 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31350 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d  C_GetTokenInfo =
31360 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b   C_GetTokenInfo;
31370 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31380 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76  >C_WaitForSlotEv
31390 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53  ent = C_WaitForS
313a0 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63  lotEvent;..pFunc
313b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d  tionList->C_GetM
313c0 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43  echanismList = C
313d0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
313e0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
313f0 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  t->C_GetMechanis
31400 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63  mInfo = C_GetMec
31410 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75  hanismInfo;..pFu
31420 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
31430 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74  itToken = C_Init
31440 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  Token;..pFunctio
31450 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e  nList->C_InitPIN
31460 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70   = C_InitPIN;..p
31470 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31480 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49  SetPIN = C_SetPI
31490 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
314a0 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e  t->C_OpenSession
314b0 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e   = C_OpenSession
314c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
314d0 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ->C_CloseSession
314e0 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f   = C_CloseSessio
314f0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
31500 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73  t->C_CloseAllSes
31510 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41  sions = C_CloseA
31520 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75  llSessions;..pFu
31530 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31540 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43  tSessionInfo = C
31550 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b  _GetSessionInfo;
31560 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31570 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_GetOperationS
31580 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72  tate = C_GetOper
31590 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
315a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
315b0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
315c0 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  = C_SetOperation
315d0 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
315e0 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d  nList->C_Login =
315f0 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63   C_Login;..pFunc
31600 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f  tionList->C_Logo
31610 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09  ut = C_Logout;..
31620 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31630 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20  _CreateObject = 
31640 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a  C_CreateObject;.
31650 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31660 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43  C_CopyObject = C
31670 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46  _CopyObject;..pF
31680 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
31690 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43  estroyObject = C
316a0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a  _DestroyObject;.
316b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
316c0 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20  C_GetObjectSize 
316d0 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  = C_GetObjectSiz
316e0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
316f0 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74  t->C_GetAttribut
31700 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74  eValue = C_GetAt
31710 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
31720 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31730 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  SetAttributeValu
31740 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75  e = C_SetAttribu
31750 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
31760 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f  ionList->C_FindO
31770 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46  bjectsInit = C_F
31780 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a  indObjectsInit;.
31790 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
317a0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20  C_FindObjects = 
317b0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09  C_FindObjects;..
317c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
317d0 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
317e0 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  l = C_FindObject
317f0 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  sFinal;..pFuncti
31800 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
31810 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70  tInit = C_Encryp
31820 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
31830 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
31840 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70   = C_Encrypt;..p
31850 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31860 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
31870 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  C_EncryptUpdate;
31880 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31890 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20  >C_EncryptFinal 
318a0 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  = C_EncryptFinal
318b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
318c0 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20  ->C_DecryptInit 
318d0 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b  = C_DecryptInit;
318e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
318f0 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44  >C_Decrypt = C_D
31900 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69  ecrypt;..pFuncti
31910 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
31920 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  tUpdate = C_Decr
31930 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
31940 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
31950 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65  ryptFinal = C_De
31960 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75  cryptFinal;..pFu
31970 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
31980 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67  gestInit = C_Dig
31990 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  estInit;..pFunct
319a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
319b0 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70  t = C_Digest;..p
319c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
319d0 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43  DigestUpdate = C
319e0 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09  _DigestUpdate;..
319f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31a00 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44  _DigestKey = C_D
31a10 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63  igestKey;..pFunc
31a20 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
31a30 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65  stFinal = C_Dige
31a40 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  stFinal;..pFunct
31a50 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49  ionList->C_SignI
31a60 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74  nit = C_SignInit
31a70 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31a80 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67  ->C_Sign = C_Sig
31a90 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
31aa0 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20  t->C_SignUpdate 
31ab0 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a  = C_SignUpdate;.
31ac0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31ad0 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f  C_SignFinal = C_
31ae0 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  SignFinal;..pFun
31af0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
31b00 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  nRecoverInit = C
31b10 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
31b20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31b30 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20  ->C_SignRecover 
31b40 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b  = C_SignRecover;
31b50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31b60 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20  >C_VerifyInit = 
31b70 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70  C_VerifyInit;..p
31b80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31b90 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66  Verify = C_Verif
31ba0 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
31bb0 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74  t->C_VerifyUpdat
31bc0 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61  e = C_VerifyUpda
31bd0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
31be0 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61  st->C_VerifyFina
31bf0 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61  l = C_VerifyFina
31c00 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
31c10 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
31c20 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66  erInit = C_Verif
31c30 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70  yRecoverInit;..p
31c40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31c50 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20  VerifyRecover = 
31c60 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b  C_VerifyRecover;
31c70 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31c80 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74  >C_DigestEncrypt
31c90 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73  Update = C_Diges
31ca0 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  tEncryptUpdate;.
31cb0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31cc0 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
31cd0 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
31ce0 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09  tDigestUpdate;..
31cf0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31d00 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
31d10 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79  te = C_SignEncry
31d20 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  ptUpdate;..pFunc
31d30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
31d40 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 20  yptVerifyUpdate 
31d50 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  = C_DecryptVerif
31d60 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
31d70 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
31d80 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72  ateKey = C_Gener
31d90 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  ateKey;..pFuncti
31da0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61  onList->C_Genera
31db0 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65  teKeyPair = C_Ge
31dc0 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09  nerateKeyPair;..
31dd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31de0 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61  _WrapKey = C_Wra
31df0 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
31e00 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65  List->C_UnwrapKe
31e10 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b  y = C_UnwrapKey;
31e20 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31e30 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43  >C_DeriveKey = C
31e40 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75  _DeriveKey;..pFu
31e50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
31e60 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65  edRandom = C_See
31e70 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  dRandom;..pFunct
31e80 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
31e90 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65  ateRandom = C_Ge
31ea0 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70  nerateRandom;..p
31eb0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31ec0 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75  GetFunctionStatu
31ed0 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  s = C_GetFunctio
31ee0 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74  nStatus;..pFunct
31ef0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65  ionList->C_Cance
31f00 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61  lFunction = C_Ca
31f10 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70  ncelFunction;..p
31f20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31f30 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  GetFunctionList 
31f40 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  = C_GetFunctionL
31f50 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69  ist;...*ppFuncti
31f60 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69  onList = pFuncti
31f70 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59  onList;...CACKEY
31f80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
31f90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
31fa0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
31fb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
31fc0 3b 0a 7d 0a 0a                                   ;.}..