Hex Artifact Content

Artifact 745d36081e94238b48bdec801e89876d55fb0034:


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 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  time = 0;.static
1760: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
1780: 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66 20  IME(void) {..if 
1790: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74  (cackey_debug_st
17a0: 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b  art_time == 0) {
17b0: 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  ...cackey_debug_
17c0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17d0: 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  e(NULL);..}...re
17e0: 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29 20  turn(time(NULL) 
17f0: 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  - cackey_debug_s
1800: 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20  tart_time);.}.# 
1810: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e 73   else.static uns
1820: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1830: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1840: 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  void) {..return(
1850: 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a 0a  0);.}.#  endif..
1860: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
1880: 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20  ..) { \..static 
1890: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
18a0: 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e  96] = {0}; \..sn
18b0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 2c  printf(buf_user,
18c0: 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72   sizeof(buf_user
18d0: 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73  ), x); \..buf_us
18e0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
18f0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1900: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1910: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1920: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1930: 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  %s\n", CACKEY_DE
1940: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1950: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1960: 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a  _, buf_user); \.
1970: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1980: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
19a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
19b0: 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73 74  f, x, y) { \..st
19c0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
19d0: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c 20  er[4096] = {0}, 
19e0: 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a 09  *buf_user_p; \..
19f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75  unsigned long bu
1a00: 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09  f_user_size; \..
1a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1a20: 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e  MPBUF; \..unsign
1a30: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09  ed long idx; \..
1a40: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
1a50: 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28 75  ; \..TMPBUF = (u
1a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a70: 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  (x); \..buf_user
1a80: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a90: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1aa0: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1ab0: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1ac0: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1ad0: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1ae0: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1af0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b00: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b10: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1b20: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1b30: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1b40: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b50: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b60: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b70: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b80: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b90: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1ba0: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1bb0: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1bc0: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1bd0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1be0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1bf0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1c00: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c10: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1c20: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1c30: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1c40: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c50: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c70: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c80: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c90: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1ca0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1cc0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1cd0: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1ce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1d00: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1d10: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1d30: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1d40: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d50: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d60: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d70: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d80: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d90: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1da0: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1db0: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1dc0: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1dd0: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1de0: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1df0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1e00: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1e10: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1e20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1e40: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e50: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e70: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e90: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1ea0: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1eb0: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1ec0: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1ed0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ee0: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ef0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1f00: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1f10: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1f20: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1f30: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1f40: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f50: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f60: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f70: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f80: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f90: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1fa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fb0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1fc0: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1fd0: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1fe0: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1ff0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
2000: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
2010: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
2020: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
2030: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
2040: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2050: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2060: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2070: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2080: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2090: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
20a0: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
20b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
20c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
20d0: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
20e0: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20f0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
2100: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
2110: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
2120: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
2130: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2140: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2150: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2160: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2170: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2180: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2190: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
21a0: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
21b0: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
21c0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
21d0: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
21e0: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21f0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
2200: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
2210: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2220: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
2230: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
2240: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2250: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2260: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2270: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2280: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2290: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
22a0: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
22b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
22c0: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
22d0: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
22e0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22f0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
2300: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
2310: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2330: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2340: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2350: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2360: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2370: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2380: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2390: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
23a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
23b0: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
23c0: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
23d0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
23e0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23f0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
2400: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
2410: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
2420: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
2430: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
2440: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2450: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2460: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2470: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2480: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2490: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
24a0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
24b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
24c0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
24d0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
24e0: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24f0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
2500: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
2510: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
2520: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2530: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
2540: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2550: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2560: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2570: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2590: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
25a0: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
25b0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
25c0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
25d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25e0: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2600: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
2610: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
2620: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
2630: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
2640: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2650: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2660: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2670: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2680: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2690: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
26a0: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
26b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
26c0: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
26d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
26e0: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
2700: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
2710: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
2720: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
2730: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
2740: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2750: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2760: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2780: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2790: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
27a0: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
27b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
27c0: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
27d0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
27e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27f0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
2800: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
2810: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2820: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
2830: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2840: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2850: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2860: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2880: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2890: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
28a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28b0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
28e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28f0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2910: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
2920: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
2930: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
2940: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2950: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2970: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2980: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2990: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
29a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
29b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
29c0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
29d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29e0: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a00: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
2a10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2a20: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
2a30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a40: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a60: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a90: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2aa0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ab0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2ac0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2ad0: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2ae0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2af0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2b00: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b10: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2b20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b30: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2b40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b50: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b70: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b80: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b90: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2ba0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bb0: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2bd0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2be0: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2bf0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2c00: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2c10: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c20: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2c30: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c40: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c50: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c60: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c80: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ca0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2cb0: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2cc0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2cd0: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2ce0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2cf0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2d00: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2d10: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2d30: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2d40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d50: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
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 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d80: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d90: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2da0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2db0: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2dc0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2dd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2de0: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2df0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2e00: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2e10: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2e20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e30: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2e40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e50: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e60: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e70: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e80: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ea0: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2eb0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ec0: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ef0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2f00: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2f10: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2f20: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2f30: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2f40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f50: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f70: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f90: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2fa0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fb0: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2fc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fd0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2fe0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ff0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
3000: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3010: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
3020: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
3030: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
3040: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3050: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3060: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3070: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3080: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3090: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30a0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30b0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
30c0: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
30d0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
30e0: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3100: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
3110: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
3120: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
3130: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
3140: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3150: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3160: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3170: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3190: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
31a0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
31b0: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
31c0: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
31d0: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
31e0: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
3200: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
3210: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
3220: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3230: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
3240: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3250: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3260: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3270: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3280: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3290: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
32a0: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
32b0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
32c0: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
32d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3300: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
3310: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3320: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
3330: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3340: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3350: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3360: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3370: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3380: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3390: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
33a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
33b0: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....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 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
33e0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33f0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
3400: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3410: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
3420: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3430: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
3440: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3450: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3460: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3470: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3480: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3490: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
34a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34b0: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
34c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
34d0: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
34e0: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34f0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
3500: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
3510: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
3520: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3530: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
3540: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3550: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3560: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3570: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3580: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3590: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
35a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
35b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
35c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
35d0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
35e0: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35f0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
3600: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3610: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
3620: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
3630: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
3640: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3650: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3660: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3670: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3680: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3690: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
36a0: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
36b0: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
36c0: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
36d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
36e0: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36f0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
3700: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
3710: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3720: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
3730: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
3740: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3750: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3760: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3770: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3780: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3790: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
37a0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
37b0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
37c0: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
37d0: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
37e0: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37f0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
3800: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3810: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
3820: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3830: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
3840: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3850: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3860: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3870: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3880: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3890: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
38a0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
38b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38c0: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
38d0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
38e0: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38f0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3900: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
3910: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
3920: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3930: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
3940: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3950: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3960: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3970: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3980: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3990: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
39a0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
39b0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
39c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
39d0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
39e0: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39f0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
3a00: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
3a10: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3a20: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
3a30: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
3a40: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a50: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a60: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a80: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a90: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3aa0: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3ab0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3ac0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3ad0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3ae0: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3af0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3b00: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3b10: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3b20: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3b30: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3b40: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b50: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b60: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b70: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b80: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b90: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3ba0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3bb0: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3bc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3bd0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3be0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3bf0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3c00: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
3c10: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c20: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3c30: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3c40: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c60: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c70: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3ca0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3cb0: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3cc0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3cd0: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3ce0: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3cf0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d00: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3d10: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3d20: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3d30: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d40: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d50: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d60: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d70: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d80: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d90: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3da0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3db0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3dc0: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3dd0: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3de0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3df0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3e00: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3e10: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3e20: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3e30: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3e40: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e50: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e60: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e70: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e80: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e90: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3ea0: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3eb0: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3ec0: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3ed0: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3ee0: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ef0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f00: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3f10: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3f20: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3f30: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3f40: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f60: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
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: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3fa0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3fb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3fc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3fd0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3fe0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | 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 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....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 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
4030: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
4040: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4050: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4060: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4070: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4080: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4090: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
40a0: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
40b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
40c0: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
40d0: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
40e0: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40f0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
4100: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
4110: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
4120: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
4130: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
4140: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4150: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4160: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4170: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4180: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4190: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
41a0: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
41b0: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
41c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
41d0: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
41e0: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41f0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
4200: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
4210: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
4220: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
4230: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
4240: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4250: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4260: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4270: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4280: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4290: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
42a0: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
42b0: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
42c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
42d0: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
42e0: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42f0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
4300: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
4310: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4320: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
4330: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
4340: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4350: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4360: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4370: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4380: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4390: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
43a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
43b0: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
43c0: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
43d0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
43e0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43f0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
4400: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
4410: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
4420: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
4430: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
4440: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4450: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4460: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4470: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4480: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4490: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
44a0: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
44b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
44c0: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
44d0: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
44e0: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
4500: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
4510: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
4520: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
4530: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4540: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4550: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4560: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4570: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4580: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4590: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
45a0: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
45b0: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
45c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
45d0: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
45e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45f0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
4600: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
4610: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
4620: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4630: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
4640: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4650: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4660: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4670: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4680: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4690: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
46a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
46b0: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
46c0: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
46d0: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
46e0: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46f0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
4700: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
4710: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4720: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
4730: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
4740: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4750: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4760: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4770: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4780: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4790: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
47a0: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
47b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
47c0: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
47d0: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
47e0: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47f0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
4800: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
4810: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
4820: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
4830: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
4840: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4850: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4860: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4870: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4880: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4890: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
48a0: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
48b0: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
48c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
48d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
48e0: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48f0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4900: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4910: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
4920: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4930: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
4940: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4950: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4960: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4970: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4980: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4990: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
49a0: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
49b0: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
49c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49d0: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
49e0: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a00: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
4a10: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
4a20: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
4a30: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
4a40: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a50: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a60: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a70: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a80: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a90: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4aa0: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4ab0: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4ac0: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4ad0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4ae0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4af0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4b00: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4b10: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4b20: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4b30: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4b40: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b50: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b60: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b70: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b80: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b90: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4ba0: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4bb0: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4bc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4bd0: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4be0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4bf0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4c00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4c10: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4c20: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4c30: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4c40: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c50: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c60: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c70: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c80: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c90: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4ca0: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4cb0: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4cc0: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4cd0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4ce0: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4cf0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4d00: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4d10: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4d20: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4d30: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d50: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d70: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d80: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d90: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4da0: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4db0: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4dc0: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4dd0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4de0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4df0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4e00: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4e10: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4e30: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4e40: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e50: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e60: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e70: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e80: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e90: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4ea0: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4eb0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4ec0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4ed0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4ee0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ef0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4f00: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4f10: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4f20: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f30: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4f40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f50: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f60: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f70: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74  ABLED".#endif..t
4f80: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
4f90: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
4fa0: 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  C,..CACKEY_ID_TY
4fb0: 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f  PE_PIV,..CACKEY_
4fc0: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
4fd0: 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  Y.} cackey_pcsc_
4fe0: 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74  id_type;..struct
4ff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
5000: 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f  ntity {..cackey_
5010: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
5020: 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  type;...size_t c
5030: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
5040: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5050: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
5060: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
5070: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75  ..union {...stru
5080: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
5090: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
50a0: 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ....uint16_t fil
50b0: 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73  e;...} cac;....s
50c0: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
50d0: 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b  ned char key_id;
50e0: 0a 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33  ....char label[3
50f0: 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20  2];...} piv;..} 
5100: 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  card;.};..struct
5110: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
5120: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
5130: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5140: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a  *pcsc_identity;.
5150: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
5160: 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f  attributes;..CK_
5170: 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73  ULONG attributes
5180: 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75  _count;.};..stru
5190: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
51a0: 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  n {..int active;
51b0: 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ...CK_SLOT_ID sl
51c0: 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45  otID;...CK_STATE
51d0: 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47   state;..CK_FLAG
51e0: 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f  S flags;..CK_ULO
51f0: 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72  NG ulDeviceError
5200: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
5210: 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b  Application;..CK
5220: 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a  _NOTIFY Notify;.
5230: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5240: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
5250: 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
5260: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
5270: 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61  count;...int sea
5280: 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  rch_active;..CK_
5290: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65  ATTRIBUTE_PTR se
52a0: 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f  arch_query;..CK_
52b0: 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65  ULONG search_que
52c0: 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ry_count;..unsig
52d0: 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f  ned long search_
52e0: 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73  curr_id;...int s
52f0: 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ign_active;..CK_
5300: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73  MECHANISM_TYPE s
5310: 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ign_mechanism;..
5320: 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e  CK_BYTE_PTR sign
5330: 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _buf;..unsigned 
5340: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e  long sign_buflen
5350: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5360: 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09   sign_bufused;..
5370: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
5380: 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65  entity *sign_ide
5390: 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63  ntity;...int dec
53a0: 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b  rypt_active;..CK
53b0: 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
53c0: 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
53d0: 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  m;..CK_VOID_PTR 
53e0: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
53f0: 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63  m;..CK_ULONG dec
5400: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
5410: 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  n;..struct cacke
5420: 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72  y_identity *decr
5430: 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b  ypt_identity;.};
5440: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5450: 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69  slot {..int acti
5460: 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61  ve;..int interna
5470: 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  l;...char *pcsc_
5480: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
5490: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
54a0: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
54b0: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
54c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
54d0: 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  th;..int transac
54e0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
54f0: 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  k;...int slot_re
5500: 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20  set;...CK_FLAGS 
5510: 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75  token_flags;...u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
5530: 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f  bel;...DWORD pro
5540: 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65  tocol;...unsigne
5550: 64 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72  d int cached_cer
5560: 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63  ts_count;..struc
5570: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5580: 65 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63  entity *cached_c
5590: 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  erts;.};..typede
55a0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
55b0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
55c0: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
55d0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
55e0: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
55f0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
5600: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
5610: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
5620: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
5630: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5640: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
5650: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
5660: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
5670: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
5680: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
5690: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
56a0: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
56b0: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
56c0: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
56e0: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
56f0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
5700: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
5710: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5720: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
5730: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
5740: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5750: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
5760: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
5770: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5780: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
5790: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
57a0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
57b0: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
57c0: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
57d0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
57e0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
57f0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
5800: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5810: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
5820: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
5830: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
5840: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
5850: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
5860: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
5870: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5880: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
5890: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
58a0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
58b0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
58c0: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
58d0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
58e0: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
58f0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
5900: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
5910: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
5920: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
5930: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
5940: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
5950: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
5960: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
5970: 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41  NT     = -6,..CA
5980: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
5990: 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37  Y           = -7
59a0: 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a  .} cackey_ret;..
59b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
59c0: 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73  v_cardurl {..uns
59d0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
59e0: 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65    rid[5];..cacke
59f0: 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20  y_tlv_apptype   
5a00: 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  apptype;..cackey
5a10: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f  _tlv_objectid  o
5a20: 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79  bjectid;..cackey
5a30: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61  _tlv_objectid  a
5a40: 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ppid;..unsigned 
5a50: 63 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69  char        pini
5a60: 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  d;.};..struct ca
5a70: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b  ckey_tlv_entity;
5a80: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5a90: 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e  lv_entity {..uin
5aa0: 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f  t8_t tag;..size_
5ab0: 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f  t length;...unio
5ac0: 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75  n {...void *valu
5ad0: 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b  e;...struct cack
5ae0: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a  ey_tlv_cardurl *
5af0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09  value_cardurl;..
5b00: 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62  .uint8_t value_b
5b10: 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63  yte;..};...struc
5b20: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
5b30: 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a  ity *_next;.};..
5b40: 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c  /* CACKEY Global
5b50: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5b60: 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f  ic void *cackey_
5b70: 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  biglock = NULL;.
5b80: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5b90: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63  ckey_session cac
5ba0: 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38  key_sessions[128
5bb0: 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ];.static struct
5bc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63   cackey_slot cac
5bd0: 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a  key_slots[128];.
5be0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5bf0: 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
5c00: 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  0;.static int ca
5c10: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
5c20: 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54  t = 0;.CK_C_INIT
5c30: 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b  IALIZE_ARGS cack
5c40: 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78  ey_args;../** Ex
5c50: 74 72 61 20 63 65 72 74 69 66 69 63 61 74 65 73  tra certificates
5c60: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
5c70: 6f 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20  oken **/.struct 
5c80: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
5c90: 74 69 74 79 20 65 78 74 72 61 5f 63 65 72 74 73  tity extra_certs
5ca0: 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
5cb0: 22 63 61 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f  "cackey_builtin_
5cc0: 63 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20  certs.h".};../* 
5cd0: 50 72 6f 74 65 63 74 65 64 20 41 75 74 68 65 6e  Protected Authen
5ce0: 74 69 63 61 74 69 6f 6e 20 50 61 74 68 20 63 6f  tication Path co
5cf0: 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65  mmand */.#define
5d00: 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
5d10: 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52  AND_DEFAULT_XSTR
5d20: 28 73 74 72 29 20 43 41 43 4b 45 59 5f 50 49 4e  (str) CACKEY_PIN
5d30: 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
5d40: 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e  _STR(str).#defin
5d50: 65 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  e CACKEY_PIN_COM
5d60: 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 53 54 52  MAND_DEFAULT_STR
5d70: 28 73 74 72 29 20 23 73 74 72 0a 73 74 61 74 69  (str) #str.stati
5d80: 63 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 70  c char *cackey_p
5d90: 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c  in_command = NUL
5da0: 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  L;.static char *
5db0: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
5dc0: 6e 64 5f 78 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  nd_xonly = NULL;
5dd0: 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c  ../* PCSC Global
5de0: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5df0: 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58  ic LPSCARDCONTEX
5e00: 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  T cackey_pcsc_ha
5e10: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74  ndle = NULL;..st
5e20: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5e30: 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72  ng cackey_getver
5e40: 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74  sion(void) {..st
5e50: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5e60: 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b  ng retval = 255;
5e70: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5e80: 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69  major = 0;..unsi
5e90: 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20  gned long minor 
5ea0: 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f  = 0;..char *majo
5eb0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  r_str = NULL;..c
5ec0: 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d  har *minor_str =
5ed0: 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f   NULL;...CACKEY_
5ee0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5ef0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72  lled.");...if (r
5f00: 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a  etval != 255) {.
5f10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5f20: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
5f30: 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e   0x%lx (cached).
5f40: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ", retval);....r
5f50: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
5f60: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a  }...retval = 0;.
5f70: 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f  .#ifdef PACKAGE_
5f80: 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  VERSION.        
5f90: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b  major_str = PACK
5fa0: 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66  AGE_VERSION;..if
5fb0: 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09   (major_str) {..
5fc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20          major = 
5fd0: 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74  strtoul(major_st
5fe0: 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31  r, &minor_str, 1
5ff0: 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  0);....if (minor
6000: 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  _str) {....minor
6010: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72   = strtoul(minor
6020: 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20  _str + 1, NULL, 
6030: 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  10);...}..}...re
6040: 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c  tval = (major <<
6050: 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c   16) | (minor <<
6060: 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41   8);.#endif...CA
6070: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6080: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
6090: 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  lx", retval);...
60a0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
60b0: 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61  }../* PC/SC Rela
60c0: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
60d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
60e0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
60f0: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6100: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20  ect_all(void);. 
6110: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
6120: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
6130: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6140: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6150: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6160: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
6170: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20  nnects from all 
6180: 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  cards.. *. */.st
6190: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
61a0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
61b0: 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75  t_all(void) {..u
61c0: 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
61d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
61e0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
61f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
6200: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
6210: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
6220: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
6230: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
6240: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6250: 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
6260: 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69  ) {..../* Skip i
6270: 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f  nternal slots */
6280: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
6290: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
62a0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
62b0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
62c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
62d0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
62e0: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
62f0: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
6300: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
6310: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
6320: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
6330: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
6340: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
6350: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
6360: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
6370: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
6380: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6390: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
63a0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
63b0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
63c0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
63d0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
63e0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
63f0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6400: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
6410: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
6420: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6430: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
6440: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
6450: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
6460: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
6470: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6480: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
6490: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
64a0: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
64b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
64c0: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
64d0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64e0: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
64f0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
6500: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
6510: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
6520: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
6530: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
6540: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
6550: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
6560: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
6570: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
6580: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
6590: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
65a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
65b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
65c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
65d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
65e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
65f0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6600: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
6610: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6620: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
6630: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
6640: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
6650: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
6660: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
6670: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
6680: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
6690: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
66a0: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
66b0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
66c0: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
66d0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
66e0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
66f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6700: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6710: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6720: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
6730: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6740: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
6750: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6760: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
6770: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6780: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
6790: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
67a0: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
67b0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
67c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
67d0: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
67e0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
67f0: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6800: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6810: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
6820: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6830: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
6840: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
6850: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
6860: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6870: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
6880: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
6890: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
68a0: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
68b0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
68c0: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
68d0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
68e0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
68f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6900: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
6910: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6920: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
6930: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
6940: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6950: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
6960: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
6970: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
6980: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
6990: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
69a0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
69b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
69c0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
69d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
69e0: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
69f0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6a00: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6a10: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6a20: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6a30: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
6a40: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
6a50: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
6a60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
6a70: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
6a80: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
6a90: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6aa0: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
6ab0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6ac0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
6ad0: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
6ae0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6af0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
6b00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6b10: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
6b20: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
6b30: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6b40: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
6b50: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
6b60: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
6b70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6b80: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6b90: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
6ba0: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
6bb0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
6bc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6bd0: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6be0: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6bf0: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6c00: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6c10: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6c20: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6c30: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
6c40: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
6c50: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
6c60: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6c70: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6c80: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
6c90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6ca0: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
6cb0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6cc0: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6cd0: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6ce0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6cf0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6d00: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6d10: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6d20: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6d30: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6d40: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6d50: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
6d60: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
6d70: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6d80: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
6d90: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6da0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
6db0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6dc0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6dd0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6de0: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6df0: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
6e00: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
6e10: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6e20: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
6e30: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
6e40: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
6e50: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
6e60: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
6e70: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
6e80: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6e90: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
6ea0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
6eb0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
6ec0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6ed0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6ee0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6ef0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6f00: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6f10: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6f20: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6f30: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6f40: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6f50: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6f60: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
6f70: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
6f80: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
6f90: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
6fa0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
6fb0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6fc0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6fd0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6fe0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
6ff0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
7000: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
7010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7020: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7030: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
7040: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
7050: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
7060: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
7070: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
7080: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
7090: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
70a0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
70b0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
70c0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
70d0: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
70e0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
70f0: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
7100: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
7110: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
7120: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
7130: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7140: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
7150: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7160: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
7170: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7180: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
7190: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
71a0: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
71b0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
71c0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71d0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
71e0: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
71f0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7200: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
7210: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
7220: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
7230: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
7240: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
7250: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
7260: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
7270: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
7280: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
7290: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
72a0: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
72b0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
72c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
72d0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
72e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
72f0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
7300: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
7310: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
7320: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7330: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7340: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
7350: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7360: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
7370: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7380: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
7390: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
73a0: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
73b0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
73c0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
73d0: 20 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e   0;..slot->token
73e0: 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
73f0: 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43  IN_REQUIRED;...C
7400: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7410: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29  TF("Returning.")
7420: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
7430: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
7440: 20 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79       LONG cackey
7450: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
7460: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7470: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
7480: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
7490: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
74a0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a  ed_protocol);. *
74b0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
74c0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
74d0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
74e0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
74f0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
7500: 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75       DWORD defau
7510: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  lt_protocol. *  
7520: 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20         Protocol 
7530: 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74  to attempt first
7540: 0a 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f  . *. *     LPDWO
7550: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
7560: 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  ocol. *         
7570: 5b 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73  [OUT] Protocol s
7580: 65 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45  elected. *. * RE
7590: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
75a0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
75b0: 75 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63  ue from SCardRec
75c0: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e  onnect(). *. * N
75d0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
75e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
75f0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43  rapper around SC
7600: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20  ardReconnect(). 
7610: 2a 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61  *. *     The SCa
7620: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75  rdReconnect() fu
7630: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c  nction call will
7640: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
7650: 20 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20   with the. *    
7660: 20 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74   dwPreferredProt
7670: 6f 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c  ocols of "defaul
7680: 74 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66  t_protocol".  If
7690: 20 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72   that call retur
76a0: 6e 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f  ns. *     SCARD_
76b0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
76c0: 20 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20   try again with 
76d0: 61 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d  a protocol of T=
76e0: 30 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20  0, and failing. 
76f0: 2a 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a  *     that T=1..
7700: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f   *. */.static LO
7710: 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e  NG cackey_reconn
7720: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7730: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7740: 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74  t, DWORD default
7750: 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f  _protocol, LPDWO
7760: 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  RD selected_prot
7770: 6f 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  ocol) {..LONG sc
7780: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
7790: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
77a0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
77b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
77c0: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
77d0: 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f  RED, default_pro
77e0: 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53  tocol, SCARD_RES
77f0: 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65  ET_CARD, selecte
7800: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69  d_protocol);...i
7810: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7820: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
7830: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
7840: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7850: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
7860: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7870: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7880: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7890: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
78a0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
78b0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
78c0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
78d0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
78e0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
78f0: 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52  OCOL_T0, SCARD_R
7900: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
7910: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  ted_protocol);..
7920: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7930: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7940: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7950: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
7960: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52  G_PRINTF("SCardR
7970: 65 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  econnect() retur
7980: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
7990: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
79a0: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
79b0: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
79c0: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f  _ret = SCardReco
79d0: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
79e0: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41  _card, SCARD_SHA
79f0: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7a00: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43  _PROTOCOL_T1, SC
7a10: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7a20: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7a30: 6c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  l);...}..}...ret
7a40: 75 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  urn(scard_conn_r
7a50: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
7a60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
7a70: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7a80: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7a90: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7aa0: 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *slot);. *. * AR
7ab0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7ac0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7ad0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7ae0: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7af0: 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52  s to. *. * RETUR
7b00: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
7b10: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
7b20: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
7b30: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
7b40: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
7b50: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
7b60: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
7b70: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
7b80: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
7b90: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
7ba0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7bb0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
7bc0: 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
7bd0: 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
7be0: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e  D protocol;..LON
7bf0: 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  G scard_conn_ret
7c00: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
7c20: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29  ");...if (!slot)
7c30: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7c40: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
7c50: 64 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64  d slot specified
7c60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
7c70: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
7c80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7c90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
7ca0: 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
7cb0: 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
7cc0: 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
7cd0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7ce0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
7cf0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
7d00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7d10: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
7d20: 53 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  SC failed, retur
7d30: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7d40: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7d50: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7d60: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e  IC);..}.../* Con
7d70: 6e 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20  nect to reader, 
7d80: 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66  if needed */..if
7d90: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
7da0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
7db0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7dc0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7dd0: 65 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c  ect(%s) called",
7de0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7df0: 65 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e  er);...scard_con
7e00: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7e10: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7e20: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7e30: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7e40: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7e50: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7e60: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
7e70: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
7e80: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
7e90: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
7ea0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7eb0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7ec0: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
7ed0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7ee0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
7ef0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
7f00: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
7f10: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
7f20: 74 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64  t T=0")....scard
7f30: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7f40: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
7f50: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
7f60: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
7f70: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7f80: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7f90: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
7fa0: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
7fb0: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
7fc0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7fd0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7fe0: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
7ff0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8000: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8010: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8020: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8030: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
8040: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63  ust T=1").....sc
8050: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
8060: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
8070: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
8080: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8090: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
80a0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
80b0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74  OTOCOL_T1, &slot
80c0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
80d0: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09  otocol);....}...
80e0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
80f0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
8100: 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52  _W_UNPOWERED_CAR
8110: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
8120: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8130: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
8140: 72 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50  rned SCARD_W_UNP
8150: 4f 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79  OWERED_CARD, try
8160: 69 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63  ing to re-connec
8170: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72  t...");.....scar
8180: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
8190: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
81a0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
81b0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
81c0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49  , SCARD_SHARE_DI
81d0: 52 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54  RECT, SCARD_PROT
81e0: 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
81f0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
8200: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
8210: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69  protocol);.....i
8220: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8230: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8240: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8250: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8260: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8270: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8280: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8290: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
82a0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
82b0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
82c0: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
82d0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
82e0: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
82f0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8300: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8310: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
8320: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8330: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
8340: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
8350: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
8360: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
8370: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
8380: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8390: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
83a0: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
83b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
83c0: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
83d0: 31 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63  1")......scard_c
83e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
83f0: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
8400: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
8410: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
8420: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
8430: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
8440: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
8450: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
8460: 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  l);.....}....}..
8470: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8480: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
8490: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
84a0: 70 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f  protocol, &proto
84b0: 63 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  col);...}....if 
84c0: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
84d0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
84e0: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
84f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
8500: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64  nnection to card
8510: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
8520: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53  ng in failure (S
8530: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20  CardConnect() = 
8540: 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59  %s/%li)", CACKEY
8550: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
8560: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
8570: 64 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f  d_conn_ret), (lo
8580: 6e 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ng) scard_conn_r
8590: 65 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  et);.....return(
85a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
85b0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73  NERIC);...}....s
85c0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
85d0: 6f 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09  onnected = 1;...
85e0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
85f0: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73  n_depth = 0;...s
8600: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8610: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8620: 30 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  0;...slot->proto
8630: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
8640: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
8650: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
8660: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29  ing in success")
8670: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
8680: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
8690: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
86a0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
86b0: 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  t cackey_begin_t
86c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
86d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
86e0: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
86f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8700: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8710: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8720: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8730: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8740: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8750: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8760: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8770: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8780: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8790: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
87a0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65  NOTES. *     The
87b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f   transaction sho
87c0: 75 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65  uld be terminate
87d0: 64 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f  d using "cackey_
87e0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22  end_transaction"
87f0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8800: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8810: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8820: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
8830: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
8840: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8850: 79 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e  y_conn_ret;..LON
8860: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8870: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8880: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8890: 2e 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f  .");...cackey_co
88a0: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
88b0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
88c0: 74 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  t);..if (cackey_
88d0: 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  conn_ret != CACK
88e0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
88f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8900: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
8910: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
8920: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
8930: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
8940: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8950: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73  GENERIC);..}...s
8960: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8970: 5f 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28  _depth++;...if (
8980: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8990: 6e 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21  n_depth > 1 && !
89a0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
89b0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20  n_need_hw_lock) 
89c0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
89d0: 5f 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79  _PRINTF("Already
89e0: 20 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f   in a transactio
89f0: 6e 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f  n, performing no
8a00: 20 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70   action (new dep
8a10: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
8a20: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8a30: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
8a40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
8a50: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
8a60: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8a70: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61  _lock = 0;...sca
8a80: 72 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53  rd_trans_ret = S
8a90: 43 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63  CardBeginTransac
8aa0: 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  tion(slot->pcsc_
8ab0: 63 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72  card);..if (scar
8ac0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53  d_trans_ret != S
8ad0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
8ae0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
8af0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
8b00: 74 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  to begin transac
8b10: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
8b20: 69 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72  in error");....r
8b30: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8b40: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8b50: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8b60: 50 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75  PRINTF("Sucessfu
8b70: 6c 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61  lly began transa
8b80: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
8b90: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
8ba0: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
8bb0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
8bc0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
8bd0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
8be0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8bf0: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8c00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8c10: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
8c20: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
8c30: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
8c40: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
8c50: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
8c60: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45  ands to. *. * RE
8c70: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
8c80: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
8c90: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
8ca0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
8cb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8cc0: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
8cd0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
8ce0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
8cf0: 72 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79  requires "cackey
8d00: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8d10: 6f 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  on" to be called
8d20: 20 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74   first. *. */.st
8d30: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
8d40: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
8d50: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
8d60: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
8d70: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74   {..LONG scard_t
8d80: 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  rans_ret;...CACK
8d90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8da0: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
8db0: 20 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61   (!slot->pcsc_ca
8dc0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a  rd_connected) {.
8dd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8de0: 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e  RINTF("Card is n
8df0: 6f 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e  ot connected, un
8e00: 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e  able to end tran
8e10: 73 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22  saction on card"
8e20: 29 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e  );....if (slot->
8e30: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8e40: 68 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b  h > 0) {....CACK
8e50: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8e60: 22 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e  "Decreasing tran
8e70: 73 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e  saction depth an
8e80: 64 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68  d asking for a h
8e90: 61 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20  ardware lock on 
8ea0: 74 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74  the next begin t
8eb0: 72 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72  ransaction (curr
8ec0: 65 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22  ent depth = %i)"
8ed0: 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  , slot->transact
8ee0: 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09  ion_depth);.....
8ef0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8f00: 6e 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69  n_depth--;.....i
8f10: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8f20: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8f30: 7b 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  {.....slot->tran
8f40: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8f50: 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09  lock = 1;....}..
8f60: 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
8f70: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8f80: 49 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  IC);..}...if (sl
8f90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8fa0: 64 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09  depth == 0) {...
8fb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8fc0: 4e 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67  NTF("Terminating
8fd0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
8fe0: 68 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75  hat has not begu
8ff0: 6e 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  n!");....return(
9000: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9010: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  NERIC);..}...slo
9020: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9030: 65 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c  epth--;...if (sl
9040: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9050: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43  depth > 0) {...C
9060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9070: 54 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73  TF("Transactions
9080: 20 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65   still in progre
9090: 73 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  ss, not terminat
90a0: 69 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e  ing on-card Tran
90b0: 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74  saction (current
90c0: 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73   depth = %i)", s
90d0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
90e0: 5f 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75  _depth);....retu
90f0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
9100: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
9110: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
9120: 72 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  rdEndTransaction
9130: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
9140: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
9150: 52 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  RD);..if (scard_
9160: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
9170: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
9180: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9190: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
91a0: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
91b0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
91c0: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
91d0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
91e0: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
91f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9200: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
9210: 74 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73  terminated trans
9220: 61 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28  action on slot (
9230: 25 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  %s)", slot->pcsc
9240: 5f 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75  _reader);...retu
9250: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
9260: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55  _OK);.}../* APDU
9270: 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f   Related Functio
9280: 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50  ns */./*. * SYNP
9290: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
92a0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
92b0: 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63  nd_apdu(struct c
92c0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
92d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
92e0: 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20  class, unsigned 
92f0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
9300: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9310: 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p1, unsigned cha
9320: 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p2, unsigned c
9330: 68 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64  har lc, unsigned
9340: 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73   char *data, uns
9350: 69 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75  igned char le, u
9360: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
9370: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
9380: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
9390: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
93a0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
93b0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
93c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
93d0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
93e0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
93f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9400: 65 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a  ed char class. *
9410: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c           APDU Cl
9420: 61 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53  ass (GSCIS_CLASS
9430: 5f 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49  _ISO7816 or GSCI
9440: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
9450: 4c 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20  LATFORM. *      
9460: 20 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c     usually), (CL
9470: 41 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  A). *. *     uns
9480: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
9490: 75 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20  uction. *       
94a0: 20 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69    APDU Instructi
94b0: 6f 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20  on (INS). *. *  
94c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
94d0: 20 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41   p1. *         A
94e0: 50 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20  PDU Parameter 1 
94f0: 28 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  (P1). *. *     u
9500: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a  nsigned char p2.
9510: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9520: 50 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29  Parameter 2 (P2)
9530: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9540: 6e 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20  ned char lc. *  
9550: 20 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67         APDU Leng
9560: 74 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c  th of Content (L
9570: 63 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  c) -- this is th
9580: 65 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74  e length of "dat
9590: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61  a". *         pa
95a0: 72 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61  rameter.  If "da
95b0: 74 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64  ta" is specified
95c0: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70   as NULL, this p
95d0: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a  arameter will. *
95e0: 20 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f           be igno
95f0: 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  red.. *. *     u
9600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9610: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f  ta. *         Po
9620: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
9630: 74 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f  to send.  It sho
9640: 75 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65  uld be "Lc" byte
9650: 73 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20  s long.  If. *  
9660: 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64         specified
9670: 20 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77   as NULL, "Lc" w
9680: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c  ill not be sent,
9690: 20 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72   and this buffer
96a0: 20 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20   will be. *     
96b0: 20 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a      ignored.. *.
96c0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
96d0: 63 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20  char le. *      
96e0: 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f     APDU Length o
96f0: 66 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c  f Expectation (L
9700: 65 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68  e) -- this is th
9710: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a  e length of the.
9720: 20 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63   *         expec
9730: 74 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74  ted reply.  If t
9740: 68 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64  his is specified
9750: 20 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69   as 0 then it wi
9760: 6c 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20  ll not. *       
9770: 20 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a    be sent.. *. *
9780: 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72       uint16_t *r
9790: 65 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20  espcode. *      
97a0: 20 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72     [OUT] Pointer
97b0: 20 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41   to storage of A
97c0: 50 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64  PDU response cod
97d0: 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20  e.  If this is. 
97e0: 2a 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66  *         specif
97f0: 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65  ied as NULL, the
9800: 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77   response code w
9810: 69 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64  ill be discarded
9820: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  .. *. *     unsi
9830: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9840: 61 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  ata. *         [
9850: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT] Pointer to 
9860: 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20  storage of APDU 
9870: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20  response data.  
9880: 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20  If this is. *   
9890: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
98a0: 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  as NULL, the res
98b0: 70 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20  ponse data will 
98c0: 62 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  be discarded.  I
98d0: 66 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65  f. *         the
98e0: 20 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20   "respdata_len" 
98f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65  parameter is spe
9900: 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
9910: 74 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20  this buffer. *  
9920: 20 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20         will not 
9930: 62 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20  be updated.. *. 
9940: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65  *     size_t *re
9950: 73 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20  spdata_len. *   
9960: 20 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20        [IN, OUT] 
9970: 50 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69  Pointer initiali
9980: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
9990: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72  e size of the "r
99a0: 65 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20  espdata". *     
99b0: 20 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66      buffer.  Bef
99c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74  ore returning, t
99d0: 68 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61  he pointed to va
99e0: 6c 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74  lue is updated t
99f0: 6f 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  o the. *        
9a00: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9a10: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
9a20: 62 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73  buffer.  If this
9a30: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
9a40: 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  . *         NULL
9a50: 2c 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  , it will not be
9a60: 20 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72   updated, and "r
9a70: 65 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65  espdata" will be
9a80: 20 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67   ignored causing
9a90: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
9aa0: 72 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f  response data to
9ab0: 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
9ac0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
9ad0: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
9ae0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
9af0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
9b00: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
9b10: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20  C_E_GENERIC     
9b20: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20   On error. *    
9b30: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
9b40: 4f 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74  OKENABSENT  If t
9b50: 68 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65  he sending faile
9b60: 64 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f  d because the to
9b70: 6b 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20  ken is. *       
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a           absent.
9ba0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
9bb0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
9bc0: 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f   will connect to
9bd0: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
9be0: 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69  ction Manager vi
9bf0: 61 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  a. *     cackey_
9c00: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69  pcsc_connect() i
9c10: 66 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20  f needed.. *. * 
9c20: 20 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e      It will conn
9c30: 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20  ect to the card 
9c40: 69 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74  in the reader at
9c50: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c  tached to the sl
9c60: 6f 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66  ot. *     specif
9c70: 69 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65  ied.  It will re
9c80: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63  connect to the c
9c90: 61 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65  ard if the conne
9ca0: 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65  ction. *     goe
9cb0: 73 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73  s away.. *. */.s
9cc0: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
9cd0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
9ce0: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
9cf0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9d00: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
9d10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
9d20: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
9d30: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
9d40: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
9d50: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 63 2c  unsigned int lc,
9d60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9d70: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 69  data, unsigned i
9d80: 6e 74 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20  nt le, uint16_t 
9d90: 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67  *respcode, unsig
9da0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
9db0: 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70  ta, size_t *resp
9dc0: 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e  data_len) {..uin
9dd0: 74 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d  t8_t major_rc, m
9de0: 69 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74  inor_rc;..size_t
9df0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20   bytes_to_copy, 
9e00: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
9e10: 3b 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52  ;..LPCSCARD_IO_R
9e20: 45 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63  EQUEST pioSendPc
9e30: 69 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  i;..DWORD protoc
9e40: 6f 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f  ol;..DWORD xmit_
9e50: 6c 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09  len, recv_len;..
9e60: 4c 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f  LONG scard_xmit_
9e70: 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
9e80: 6e 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69  n_ret;..BYTE xmi
9e90: 74 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63  t_buf[1024], rec
9ea0: 76 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e  v_buf[1024];..in
9eb0: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
9ec0: 65 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70  et, pcsc_getresp
9ed0: 5f 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a  _ret;..int idx;.
9ee0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9ef0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
9f00: 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b  ;...if (!slot) {
9f10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f20: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
9f30: 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22  slot specified."
9f40: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9f50: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
9f60: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
9f70: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
9f80: 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
9f90: 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
9fa0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
9fb0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
9fc0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
9fd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
9fe0: 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
9ff0: 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
a000: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
a010: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a020: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
a030: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
a040: 6e 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f  ne which protoco
a050: 6c 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 20  l to send using 
a060: 2a 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f 74  */..switch (slot
a070: 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09  ->protocol) {...
a080: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
a090: 43 4f 4c 5f 54 30 3a 0a 09 09 09 43 41 43 4b 45  COL_T0:....CACKE
a0a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a0b0: 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64  Protocol to send
a0c0: 20 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 30   datagram is T=0
a0d0: 22 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50  ");.....pioSendP
a0e0: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
a0f0: 30 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  0;.....break;...
a100: 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f  case SCARD_PROTO
a110: 43 4f 4c 5f 54 31 3a 0a 09 09 09 43 41 43 4b 45  COL_T1:....CACKE
a120: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a130: 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64  Protocol to send
a140: 20 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 31   datagram is T=1
a150: 22 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50  ");.....pioSendP
a160: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
a170: 31 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
a180: 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b  default:....CACK
a190: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a1a0: 22 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  "Invalid protoco
a1b0: 6c 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e  l found, abortin
a1c0: 67 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  g.");.....return
a1d0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
a1e0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
a1f0: 20 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d   Transmit */..xm
a200: 69 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69  it_len = 0;..xmi
a210: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a220: 5d 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74  ] = class;..xmit
a230: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a240: 20 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a   = instruction;.
a250: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a260: 65 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69  en++] = p1;..xmi
a270: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a280: 5d 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74  ] = p2;..if (dat
a290: 61 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20  a) {...if (lc > 
a2a0: 32 35 35 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  255) {....CACKEY
a2b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
a2c0: 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61  AUTION!  Using a
a2d0: 6e 20 4c 63 20 67 72 65 61 74 65 72 20 74 68 61  n Lc greater tha
a2e0: 6e 20 32 35 35 20 69 73 20 75 6e 74 65 73 74 65  n 255 is unteste
a2f0: 64 2e 20 20 4c 63 20 3d 20 25 75 22 2c 20 6c 63  d.  Lc = %u", lc
a300: 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  );.....xmit_buf[
a310: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
a320: 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53  82; /* XXX UNTES
a330: 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62  TED */....xmit_b
a340: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a350: 20 28 6c 63 20 26 20 30 78 66 66 30 30 29 20 3e   (lc & 0xff00) >
a360: 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66  > 8;....xmit_buf
a370: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
a380: 63 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c  c & 0xff;...} el
a390: 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  se {....xmit_buf
a3a0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
a3b0: 63 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 64  c;...}...for (id
a3c0: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b  x = 0; idx < lc;
a3d0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69   idx++) {....xmi
a3e0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a3f0: 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09  ] = data[idx];..
a400: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21  .}..}...if (le !
a410: 3d 20 30 78 30 30 29 20 7b 0a 09 09 69 66 20 28  = 0x00) {...if (
a420: 6c 65 20 3e 20 32 35 36 29 20 7b 0a 09 09 09 43  le > 256) {....C
a430: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a440: 54 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73  TF("CAUTION!  Us
a450: 69 6e 67 20 61 6e 20 4c 65 20 67 72 65 61 74 65  ing an Le greate
a460: 72 20 74 68 61 6e 20 32 35 36 20 69 73 20 75 6e  r than 256 is un
a470: 74 65 73 74 65 64 2e 20 20 4c 65 20 3d 20 25 75  tested.  Le = %u
a480: 22 2c 20 6c 65 29 3b 0a 0a 09 09 09 78 6d 69 74  ", le);.....xmit
a490: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a4a0: 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20   = 0x82; /* XXX 
a4b0: 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78  UNTESTED */....x
a4c0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a4d0: 2b 2b 5d 20 3d 20 28 6c 65 20 26 20 30 78 66 66  ++] = (le & 0xff
a4e0: 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69  00) >> 8;....xmi
a4f0: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a500: 5d 20 3d 20 6c 65 20 26 20 30 78 66 66 3b 0a 09  ] = le & 0xff;..
a510: 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 65 20 3d  .} else if (le =
a520: 3d 20 32 35 36 29 20 7b 0a 09 09 09 78 6d 69 74  = 256) {....xmit
a530: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a540: 20 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73   = 0x00;...} els
a550: 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  e {....xmit_buf[
a560: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
a570: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65  ;...}..}.../* Be
a580: 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72  gin Smartcard Tr
a590: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
a5a0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
a5b0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
a5c0: 69 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53 43  if (class == GSC
a5d0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
a5e0: 20 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   && instruction 
a5f0: 3d 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  == GSCIS_INSTR_V
a600: 45 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20 30  ERIFY && p1 == 0
a610: 78 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  x00) {...CACKEY_
a620: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
a630: 6e 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65  nding APDU: <<ce
a640: 6e 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65  nsored>>");..} e
a650: 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
a660: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
a670: 65 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78  ending APDU:", x
a680: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
a690: 6e 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65  n);..}...recv_le
a6a0: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
a6b0: 62 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69  buf);..scard_xmi
a6c0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
a6d0: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
a6e0: 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63  _card, pioSendPc
a6f0: 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  i, xmit_buf, xmi
a700: 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63  t_len, NULL, rec
a710: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
a720: 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78  );...if (scard_x
a730: 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  mit_ret == SCARD
a740: 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45  _E_NOT_TRANSACTE
a750: 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
a760: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
a770: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
a780: 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72  to card (SCardTr
a790: 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c  ansmit() = %s/%l
a7a0: 78 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c  x), will ask cal
a7b0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ling function to
a7c0: 20 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65   retry (not rese
a7d0: 74 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c  tting card)...",
a7e0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
a7f0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
a800: 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  TR(scard_xmit_re
a810: 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t), (unsigned lo
a820: 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ng) scard_xmit_r
a830: 65 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e  et);..../* Begin
a840: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
a850: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
a860: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
a870: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  on(slot);....ret
a880: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
a890: 45 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69  E_RETRY);..}...i
a8a0: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a8b0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
a8c0: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
a8d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
a8e0: 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50  ailed to send AP
a8f0: 44 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72  DU to card (SCar
a900: 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73  dTransmit() = %s
a910: 2f 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%lx)", CACKEY_D
a920: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
a930: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
a940: 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69  xmit_ret), (unsi
a950: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64  gned long) scard
a960: 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43  _xmit_ret);....C
a970: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a980: 54 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74  TF("Marking slot
a990: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
a9a0: 72 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65  reset");...cacke
a9b0: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
a9c0: 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
a9d0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d  scard_xmit_ret =
a9e0: 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
a9f0: 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
aa00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
aa10: 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
aa20: 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
aa30: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
aa40: 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
aa50: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
aa60: 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
aa70: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
aa80: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f  ROTOCOL_T1, &pro
aa90: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28  tocol);.....if (
aaa0: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
aab0: 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
aac0: 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70  ESS) {...../* Up
aad0: 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  date protocol */
aae0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  .....slot->proto
aaf0: 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
ab00: 09 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74  ....switch (slot
ab10: 2d 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09  ->protocol) {...
ab20: 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52  ...case SCARD_PR
ab30: 4f 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09  OTOCOL_T0:......
ab40: 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43  .pioSendPci = SC
ab50: 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09  ARD_PCI_T0;.....
ab60: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
ab70: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
ab80: 4f 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T1:.......pio
ab90: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
aba0: 50 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62  PCI_T1;........b
abb0: 72 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75  reak;......defau
abc0: 6c 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  lt:.......CACKEY
abd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
abe0: 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20  nvalid protocol 
abf0: 66 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c  found, but too l
ac00: 61 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  ate to do anythi
ac10: 6e 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20  ng about it now 
ac20: 2d 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79  -- trying anyway
ac30: 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  .");........brea
ac40: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
ac50: 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72   Re-establish tr
ac60: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74  ansaction, if it
ac70: 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a   was present */.
ac80: 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
ac90: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
aca0: 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74  > 0) {......slot
acb0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
acc0: 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74  pth--;......slot
acd0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
ace0: 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
acf0: 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69  .....cackey_begi
ad00: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
ad10: 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ot);.....}......
ad20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ad30: 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65  NTF("Reset succe
ad40: 73 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69  ssful, retransmi
ad50: 74 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65  tting");......re
ad60: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
ad70: 72 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73  recv_buf);.....s
ad80: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
ad90: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
ada0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
adb0: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
adc0: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
add0: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
ade0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  recv_len);......
adf0: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
ae00: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
ae10: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41  CCESS) {......CA
ae20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ae30: 46 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61  F("Retransmit fa
ae40: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
ae50: 69 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72  in failure after
ae60: 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74   disconnecting t
ae70: 68 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72  he card (SCardTr
ae80: 61 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29  ansmit = %s/%li)
ae90: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
aea0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
aeb0: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
aec0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
aed0: 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09  rd_xmit_ret);...
aee0: 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
aef0: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
af00: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
af10: 5f 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f  _CARD);......slo
af20: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
af30: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
af40: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
af50: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
af60: 2f 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  /......slot->tra
af70: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
af80: 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f   1;......cackey_
af90: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
afa0: 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74  slot);.......ret
afb0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
afc0: 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
afd0: 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
afe0: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
aff0: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
b000: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
b010: 0a 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f  ......SCardDisco
b020: 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nnect(slot->pcsc
b030: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
b040: 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c  VE_CARD);.....sl
b050: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
b060: 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09  nnected = 0;....
b070: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b080: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b090: 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  /.....slot->tran
b0a0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
b0b0: 31 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e  1;.....cackey_en
b0c0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b0d0: 6f 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ot);......CACKEY
b0e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b0f0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b100: 75 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72  ure");.....retur
b110: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b120: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
b130: 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
b140: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b150: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
b160: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
b170: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
b180: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
b190: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
b1a0: 44 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73  D);....slot->pcs
b1b0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
b1c0: 20 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64   = 0;...../* End
b1d0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b1e0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f  action */....slo
b1f0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
b200: 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63  epth = 1;....cac
b210: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b220: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43  ion(slot);.....C
b230: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b240: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
b250: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72   failure");....r
b260: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b270: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
b280: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  ;...}..}...CACKE
b290: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
b2a0: 28 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65  ("Returned Value
b2b0: 3a 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65  :", recv_buf, re
b2c0: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72  cv_len);...if (r
b2d0: 65 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09  ecv_len < 2) {..
b2e0: 09 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70  ./* Minimal resp
b2f0: 6f 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32  onse length is 2
b300: 20 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e   bytes, returnin
b310: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  g in failure */.
b320: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b330: 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
b340: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
b350: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
b360: 28 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29  (recv_len = %lu)
b370: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
b380: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  g) recv_len);...
b390: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b3a0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b3b0: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b3c0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b3d0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b3e0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
b3f0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
b400: 6d 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65  mine result code
b410: 20 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20   */..major_rc = 
b420: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
b430: 6e 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72  n - 2];..minor_r
b440: 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63  c = recv_buf[rec
b450: 76 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20  v_len - 1];..if 
b460: 28 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a  (respcode) {...*
b470: 72 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f  respcode = (majo
b480: 72 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e  r_rc << 8) | min
b490: 6f 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41  or_rc;..}.../* A
b4a0: 64 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75  djust message bu
b4b0: 66 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65  ffer */..recv_le
b4c0: 6e 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64  n -= 2;.../* Add
b4d0: 20 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e   bytes to return
b4e0: 20 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72   value */..tmp_r
b4f0: 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b  espdata_len = 0;
b500: 0a 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26  ..if (respdata &
b510: 26 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20  & respdata_len) 
b520: 7b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  {...tmp_respdata
b530: 5f 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61  _len = *respdata
b540: 5f 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74  _len;....bytes_t
b550: 6f 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61  o_copy = *respda
b560: 74 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72  ta_len;....if (r
b570: 65 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f  ecv_len < bytes_
b580: 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79  to_copy) {....by
b590: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65  tes_to_copy = re
b5a0: 63 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43  cv_len;...}....C
b5b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b5c0: 54 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20  TF("Copying %lu 
b5d0: 62 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66  bytes to the buf
b5e0: 66 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20  fer (recv'd %lu 
b5f0: 62 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20  bytes, but only 
b600: 25 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69  %lu bytes left i
b610: 6e 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20  n our buffer)", 
b620: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b630: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28  bytes_to_copy, (
b640: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
b650: 65 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e  ecv_len, (unsign
b660: 65 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61  ed long) *respda
b670: 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63  ta_len);....memc
b680: 70 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63  py(respdata, rec
b690: 76 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f  v_buf, bytes_to_
b6a0: 63 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74  copy);...respdat
b6b0: 61 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  a += bytes_to_co
b6c0: 70 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61  py;....*respdata
b6d0: 5f 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f  _len = bytes_to_
b6e0: 63 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70  copy;...tmp_resp
b6f0: 64 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65  data_len -= byte
b700: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c  s_to_copy;..} el
b710: 73 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f  se {...if (recv_
b720: 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  len != 0) {....C
b730: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b740: 54 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61  TF("Throwing awa
b750: 79 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77  y %lu bytes, now
b760: 68 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d  here to put them
b770: 21 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  !", (unsigned lo
b780: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09  ng) recv_len);..
b790: 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f  .}..}...if (majo
b7a0: 72 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a  r_rc == 0x61) {.
b7b0: 09 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20  ../* We need to 
b7c0: 52 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59  READ */...CACKEY
b7d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
b7e0: 75 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69  uffer read requi
b7f0: 72 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69  red");....if (mi
b800: 6e 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20  nor_rc == 0x00) 
b810: 7b 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  {....minor_rc = 
b820: 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b  CACKEY_APDU_MTU;
b830: 0a 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74  ...}....pcsc_get
b840: 72 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65  resp_ret = cacke
b850: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
b860: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
b870: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
b880: 54 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c  TR_GET_RESPONSE,
b890: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20   0x00, 0x00, 0, 
b8a0: 4e 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20  NULL, minor_rc, 
b8b0: 72 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61  respcode, respda
b8c0: 74 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74  ta, &tmp_respdat
b8d0: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70  a_len);....if (p
b8e0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20  csc_getresp_ret 
b8f0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
b900: 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
b910: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42  _DEBUG_PRINTF("B
b920: 75 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65  uffer read faile
b930: 64 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  d!  Returning in
b940: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
b950: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b960: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b970: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b980: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b990: 0a 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65  .....if (pcsc_ge
b9a0: 74 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43  tresp_ret == CAC
b9b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
b9c0: 29 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ) {.....return(C
b9d0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
b9e0: 52 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  RY);....}.....re
b9f0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
ba00: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d  _E_GENERIC);...}
ba10: 0a 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61  ....if (respdata
ba20: 5f 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70  _len) {....*resp
ba30: 64 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f  data_len += tmp_
ba40: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09  respdata_len;...
ba50: 7d 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  }..../* End Smar
ba60: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
ba70: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
ba80: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
ba90: 6f 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ot);....CACKEY_D
baa0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
bab0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
bac0: 73 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63  s (buffer read c
bad0: 6f 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65  omplete)");...re
bae0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
baf0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  _S_OK);..}.../* 
bb00: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
bb10: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
bb20: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
bb30: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66  tion(slot);...if
bb40: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78   (major_rc == 0x
bb50: 39 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65  90) {.../* Succe
bb60: 73 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ss */...CACKEY_D
bb70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
bb80: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
bb90: 73 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78  s (major_rc = 0x
bba0: 39 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  90)");....return
bbb0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
bbc0: 4b 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  K);..}....CACKEY
bbd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
bbe0: 50 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20  PDU Returned an 
bbf0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67  error, returning
bc00: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
bc10: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
bc20: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
bc30: 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  }..static unsign
bc40: 65 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f  ed char *cackey_
bc50: 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28  read_bertlv_tag(
bc60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bc70: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62  uffer, size_t *b
bc80: 75 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73  uffer_len_p, uns
bc90: 69 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20  igned char tag, 
bca0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
bcb0: 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74  utbuffer, size_t
bcc0: 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f   *outbuffer_len_
bcd0: 70 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  p) {..unsigned c
bce0: 68 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  har *buffer_p;..
bcf0: 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72  size_t outbuffer
bd00: 5f 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e  _len, buffer_len
bd10: 3b 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a  ;..size_t size;.
bd20: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
bd30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bd40: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
bd50: 20 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d   (buffer_len_p =
bd60: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
bd70: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
bd80: 22 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73  "buffer_len_p is
bd90: 20 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e   NULL.  Returnin
bda0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b  g in failure.");
bdb0: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
bdc0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75  ;..}...if (outbu
bdd0: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55  ffer_len_p == NU
bde0: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
bdf0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74  EBUG_PRINTF("out
be00: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20  buffer_len_p is 
be10: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67  NULL.  Returning
be20: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a   in failure.");.
be30: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
be40: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e  ..}...buffer_len
be50: 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65   = *outbuffer_le
be60: 6e 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f  n_p;..outbuffer_
be70: 6c 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72  len = *outbuffer
be80: 5f 6c 65 6e 5f 70 3b 0a 0a 09 62 75 66 66 65 72  _len_p;...buffer
be90: 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66  _p = buffer;..if
bea0: 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d   (buffer_p[0] !=
beb0: 20 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59   tag) {...CACKEY
bec0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
bed0: 61 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74  ag found was not
bee0: 20 74 61 67 20 65 78 70 65 63 74 65 64 2e 20 20   tag expected.  
bef0: 54 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65  Tag = %02x, Expe
bf00: 63 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65  cted = %02x.  Re
bf10: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
bf20: 72 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  re.", (unsigned 
bf30: 69 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d  int) buffer_p[0]
bf40: 2c 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72  , tag);....retur
bf50: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
bf60: 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65  ffer_p++;..buffe
bf70: 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28  r_len--;...if ((
bf80: 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78  buffer_p[0] & 0x
bf90: 38 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09  80) == 0x80) {..
bfa0: 09 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78  .size = 0;...idx
bfb0: 20 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20   = (buffer_p[0] 
bfc0: 26 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28  & 0x7f);....if (
bfd0: 69 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e  idx > buffer_len
bfe0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
bff0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66  BUG_PRINTF("Malf
c000: 6f 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20  ormed BER value 
c010: 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  -- not enough by
c020: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  tes available to
c030: 20 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64   read length (id
c040: 78 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c  x = %i, buffer_l
c050: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c  en = %lu)", idx,
c060: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c070: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
c080: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
c090: 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64  ..}....for (; id
c0a0: 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a  x > 0; idx--) {.
c0b0: 09 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09  ...buffer_p++;..
c0c0: 09 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a  ..buffer_len--;.
c0d0: 0a 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a  ....size <<= 8;.
c0e0: 09 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65  ...size |= buffe
c0f0: 72 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65  r_p[0];...}..} e
c100: 6c 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62  lse {...size = b
c110: 75 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a  uffer_p[0];..}..
c120: 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75  .buffer_p++;..bu
c130: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66  ffer_len--;...if
c140: 20 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66   (size > outbuff
c150: 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  er_len) {...CACK
c160: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
c170: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20  "Unable to copy 
c180: 76 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20  value buffer to 
c190: 6f 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65  outbuffer, not e
c1a0: 6e 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c  nough room.  Val
c1b0: 75 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68  ue buffer length
c1c0: 20 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66   = %lu, out buff
c1d0: 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22  er length = %lu"
c1e0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c1f0: 29 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  ) size, (unsigne
c200: 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65  d long) outbuffe
c210: 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  r_len);....retur
c220: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f  n(NULL);..}...*o
c230: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d  utbuffer_len_p =
c240: 20 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62   size;..if (outb
c250: 75 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70  uffer) {...memcp
c260: 79 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66  y(outbuffer, buf
c270: 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09  fer_p, size);...
c280: 62 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65  buffer_p += size
c290: 3b 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d  ;...buffer_len -
c2a0: 3d 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66  = size;....*buff
c2b0: 65 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65  er_len_p = buffe
c2c0: 72 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59  r_len;....CACKEY
c2d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c2e0: 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73  "BER-TLV results
c2f0: 3a 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73  :", outbuffer, s
c300: 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ize);..} else {.
c310: 09 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72  ..memmove(buffer
c320: 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65  , buffer_p, size
c330: 29 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20  );...buffer_p = 
c340: 62 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45  buffer;....CACKE
c350: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
c360: 28 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74  ("BER-TLV result
c370: 73 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a  s:", buffer, siz
c380: 65 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  e);..}...CACKEY_
c390: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
c3a0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
c3b0: 73 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e  ss.  Size of con
c3c0: 74 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30  tents for tag %0
c3d0: 32 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73  2x is %lu", (uns
c3e0: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20  igned int) tag, 
c3f0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c400: 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  size);...return(
c410: 62 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a  buffer_p);.}../*
c420: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c430: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
c440: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
c450: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
c460: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
c470: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
c480: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20  e_t buffer_len, 
c490: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
c4a0: 64 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  d[3]);. *. * ARG
c4b0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
c4c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c4d0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
c4e0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
c4f0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
c500: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
c510: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
c520: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
c530: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
c540: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20  e_t buffer_len. 
c550: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
c560: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
c570: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
c580: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
c590: 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20  char oid[3]. *  
c5a0: 20 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49         3-byte OI
c5b0: 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a  D to read. *. *.
c5c0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
c5d0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
c5e0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
c5f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c600: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20   actually read, 
c610: 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a  or -1 on error..
c620: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
c630: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73     None. *. */.s
c640: 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
c650: 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74  ckey_get_data(st
c660: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
c670: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
c680: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
c690: 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e  ize_t buffer_len
c6a0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c6b0: 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67  oid[3]) {..unsig
c6c0: 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d  ned char cmd[] =
c6d0: 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78   {0x5C, 0x03, 0x
c6e0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b  00, 0x00, 0x00};
c6f0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
c700: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
c710: 5f 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c  _t init_buffer_l
c720: 65 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31  en, size;..uint1
c730: 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69  6_t respcode;..i
c740: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
c750: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c760: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
c770: 09 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e  .init_buffer_len
c780: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c790: 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d  .cmd[2] = oid[0]
c7a0: 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b  ;..cmd[3] = oid[
c7b0: 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69  1];..cmd[4] = oi
c7c0: 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74  d[2];.../* 256 t
c7d0: 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c  o indicate the l
c7e0: 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73  argest message s
c7f0: 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72  ize -- not clear
c800: 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f   if this will wo
c810: 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73  rk with all mess
c820: 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  ages */..send_re
c830: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
c840: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
c850: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
c860: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49  NISTSP800_73_3_I
c870: 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30  NSTR_GET_DATA, 0
c880: 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f  x3F, 0xFF, sizeo
c890: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36  f(cmd), cmd, 256
c8a0: 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66  , &respcode, buf
c8b0: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
c8c0: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
c8d0: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
c8e0: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
c8f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c900: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
c910: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
c920: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
c930: 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
c940: 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20  _get_data(slot, 
c950: 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66  buffer, init_buf
c960: 66 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a  fer_len, oid));.
c970: 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  .}...if (send_re
c980: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
c990: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
c9a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c9b0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
c9c0: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
c9d0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
c9e0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c9f0: 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
ca00: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
ca10: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
ca20: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66  ZE_MAX..if (buff
ca30: 65 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  er_len > _POSIX_
ca40: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
ca50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ca60: 54 46 28 22 52 65 61 64 20 62 79 74 65 73 20 28  TF("Read bytes (
ca70: 62 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65  buffer_len) exce
ca80: 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
ca90: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
caa0: 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
cab0: 25 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20  %li, buffer_len 
cac0: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
cad0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
cae0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
caf0: 29 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a  ) buffer_len);..
cb00: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
cb10: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
cb20: 0a 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  ...if (buffer_le
cb30: 6e 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45  n < 2) {...CACKE
cb40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cb50: 41 50 44 55 20 47 45 54 20 44 41 54 41 20 72 65  APDU GET DATA re
cb60: 74 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73  turned %lu bytes
cb70: 2c 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73  , which is too s
cb80: 68 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54  hort for a BER-T
cb90: 4c 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75  LV response", (u
cba0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
cbb0: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
cbc0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73  turn(-1);..}...s
cbd0: 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  ize = buffer_len
cbe0: 3b 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61  ;..buffer_p = ca
cbf0: 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
cc00: 5f 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75  _tag(buffer, &bu
cc10: 66 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20  ffer_len, 0x53, 
cc20: 4e 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09  NULL, &size);...
cc30: 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20  if (buffer_p == 
cc40: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
cc50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
cc60: 61 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c  ag decoding fail
cc70: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
cc80: 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65   error.");....re
cc90: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43  turn(-1);..}...C
cca0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ccb0: 54 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72  TBUF("GET DATA r
ccc0: 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20  esult", buffer, 
ccd0: 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  size);...CACKEY_
cce0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
ccf0: 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65  turning in succe
cd00: 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74  ss, read %lu byt
cd10: 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  es", (unsigned l
cd20: 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65  ong) size);...re
cd30: 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  turn(size);.}../
cd40: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
cd50: 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63       ssize_t cac
cd60: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
cd70: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
cd80: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
cd90: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
cda0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
cdb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
cdc0: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
cdd0: 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a  ial_offset);. *.
cde0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
cdf0: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
ce00: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
ce10: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
ce20: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
ce30: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
ce40: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
ce50: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
ce60: 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20  ] Buffer. *. *  
ce70: 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a     size_t count.
ce80: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
ce90: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74  r of bytes to at
cea0: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a  tempt to read. *
ceb0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
cec0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20   char t_or_v. * 
ced0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74          Select t
cee0: 68 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29  he T-buffer (01)
cef0: 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32   or V-buffer (02
cf00: 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20  ) to read from. 
cf10: 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65   . *. *     size
cf20: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
cf30: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65  t. *         Spe
cf40: 63 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20  cify the offset 
cf50: 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61  to begin the rea
cf60: 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20  d from. *. *. * 
cf70: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
cf80: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
cf90: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
cfa0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
cfb0: 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20  tually read, or 
cfc0: 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  -1 on error.. *.
cfd0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
cfe0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
cff0: 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
d000: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74  y_read_buffer(st
d010: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d020: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d030: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
d040: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73  ize_t count, uns
d050: 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f  igned char t_or_
d060: 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61  v, size_t initia
d070: 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73  l_offset) {..uns
d080: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74  igned char *init
d090: 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74  _buffer;..size_t
d0a0: 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69   init_count;..si
d0b0: 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61  ze_t init_initia
d0c0: 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65  l_offset;...size
d0d0: 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d  _t offset = 0, m
d0e0: 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63  ax_offset, max_c
d0f0: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
d100: 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69  char cmd[2];..ui
d110: 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b  nt16_t respcode;
d120: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d130: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d140: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d150: 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20  ;...init_buffer 
d160: 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f  = buffer;..init_
d170: 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09  count = count;..
d180: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
d190: 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66  set = initial_of
d1a0: 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73  fset;...max_offs
d1b0: 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78  et = count;..max
d1c0: 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f  _count = CACKEY_
d1d0: 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28  APDU_MTU;...if (
d1e0: 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74  t_or_v != 1 && t
d1f0: 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09  _or_v != 2) {...
d200: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d210: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f  NTF("Invalid T o
d220: 72 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70  r V parameter sp
d230: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
d240: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d250: 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d260: 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f  .}...cmd[0] = t_
d270: 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31  or_v;...while (1
d280: 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74  ) {...if (offset
d290: 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20   >= max_offset) 
d2a0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
d2b0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
d2c0: 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75   too small, retu
d2d0: 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f  rning what we go
d2e0: 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61  t...");.....brea
d2f0: 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20  k;...}....count 
d300: 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f  = max_offset - o
d310: 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75  ffset;...if (cou
d320: 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20  nt > max_count) 
d330: 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  {....count = max
d340: 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63  _count;...}....c
d350: 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a  md[1] = count;..
d360: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d370: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d380: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d390: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
d3a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41   GSCIS_INSTR_REA
d3b0: 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74  D_BUFFER, ((init
d3c0: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d3d0: 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66  set) >> 8) & 0xf
d3e0: 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  f, (initial_offs
d3f0: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30  et + offset) & 0
d400: 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xff, sizeof(cmd)
d410: 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65  , cmd, 0x00, &re
d420: 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b  spcode, buffer +
d430: 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29   offset, &count)
d440: 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  ;....if (send_re
d450: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
d460: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43  _E_RETRY) {....C
d470: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d480: 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
d490: 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e   failed, retryin
d4a0: 67 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b  g read buffer");
d4b0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b  .....return(cack
d4c0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
d4d0: 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72  lot, init_buffer
d4e0: 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f  , init_count, t_
d4f0: 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69  or_v, init_initi
d500: 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d  al_offset));...}
d510: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
d520: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
d530: 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72  S_OK) {....if (r
d540: 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  espcode == 0x6A8
d550: 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78  6) {.....if (max
d560: 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09  _count == 1) {..
d570: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
d580: 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20  ......max_count 
d590: 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b  = max_count / 2;
d5a0: 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
d5b0: 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
d5c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
d5d0: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29  ckey_send_apdu()
d5e0: 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69   failed, returni
d5f0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
d600: 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
d610: 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b  ...}....offset +
d620: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28  = count;....if (
d630: 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e  count < max_coun
d640: 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
d650: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f  EBUG_PRINTF("Sho
d660: 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74  rt read -- count
d670: 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20   = %i, cmd[1] = 
d680: 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74  %i", (int) count
d690: 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b  , (int) cmd[1]);
d6a0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
d6b0: 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
d6c0: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
d6d0: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
d6e0: 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74  _MAX..if (offset
d6f0: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
d700: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
d710: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
d720: 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  fset exceeds max
d730: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
d740: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d750: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66  . (max = %li, of
d760: 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  fset = %lu)", (l
d770: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
d780: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
d790: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
d7a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d7b0: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
d7c0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
d7d0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
d7e0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
d7f0: 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20  ead %lu bytes", 
d800: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d810: 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72  offset);...retur
d820: 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  n(offset);.}../*
d830: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d840: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
d850: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
d860: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
d870: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d880: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
d890: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
d8a0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
d8b0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
d8c0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d8d0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
d8e0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
d8f0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
d900: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d910: 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42  aid. *         B
d920: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
d930: 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65   Applet ID to se
d940: 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73  lect. *. *     s
d950: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a  ize_t aid_len. *
d960: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
d970: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
d980: 22 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44  "aid" (Applet ID
d990: 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20  ) parameter. *. 
d9a0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
d9b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
d9c0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
d9d0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
d9e0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
d9f0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
da00: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
da10: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
da20: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
da30: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
da40: 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20  t_applet(struct 
da50: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
da60: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
da70: 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69   *aid, size_t ai
da80: 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65  d_len) {..int se
da90: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
daa0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
dab0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b  alled.");...CACK
dac0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
dad0: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70  F("Selecting app
dae0: 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f  let:", aid, aid_
daf0: 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74  len);...send_ret
db00: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
db10: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
db20: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
db30: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
db40: 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53  T, GSCIS_PARAM_S
db50: 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78  ELECT_APPLET, 0x
db60: 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64  00, aid_len, aid
db70: 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
db80: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  LL, NULL);...if 
db90: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
dba0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
dbb0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
dbc0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
dbd0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
dbe0: 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20  retrying select 
dbf0: 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74  applet");....ret
dc00: 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63  urn(cackey_selec
dc10: 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61  t_applet(slot, a
dc20: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09  id, aid_len));..
dc30: 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  }...if (send_ret
dc40: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
dc50: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
dc60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
dc70: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70  ailed to open ap
dc80: 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
dc90: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
dca0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
dcb0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
dcc0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
dcd0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
dce0: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
dcf0: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
dd00: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
dd10: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
dd20: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
dd30: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
dd40: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
dd50: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
dd60: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
dd70: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
dd80: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
dd90: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
dda0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
ddb0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
ddc0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
ddd0: 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20   uint16_t ef. * 
dde0: 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61          Elementa
ddf0: 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74  l File to select
de00: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
de10: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
de20: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
de30: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
de40: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
de50: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
de60: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
de70: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
de80: 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65  selects an Eleme
de90: 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20  ntary File (EF) 
dea0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e  under the curren
deb0: 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20  tly selected. * 
dec0: 20 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69      Dedicated Fi
ded0: 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20  le (DF). *. *   
dee0: 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73    Typically this
def0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
df00: 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63   selecting the c
df10: 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75  orrect Applet (u
df20: 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b  sing. *     cack
df30: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
df40: 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20  ) for VM cards. 
df50: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
df60: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
df70: 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63  elect_file(struc
df80: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
df90: 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66  lot, uint16_t ef
dfa0: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
dfb0: 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09  ar fid_buf[2];..
dfc0: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
dfd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dfe0: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
dff0: 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c  ../* Open the el
e000: 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f  ementary file */
e010: 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28  ..fid_buf[0] = (
e020: 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  ef >> 8) & 0xff;
e030: 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65  ..fid_buf[1] = e
e040: 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  f & 0xff;...CACK
e050: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e060: 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a  "Selecting file:
e070: 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e   %04lx", (unsign
e080: 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09  ed long) ef);...
e090: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
e0a0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
e0b0: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
e0c0: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
e0d0: 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c  TR_SELECT, 0x02,
e0e0: 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69   0x0C, sizeof(fi
e0f0: 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c  d_buf), fid_buf,
e100: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
e110: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73  L, NULL);..if (s
e120: 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
e130: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
e140: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e150: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
e160: 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72  open file, retur
e170: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e180: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
e190: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
e1a0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
e1b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
e1c0: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65  uccessfully sele
e1d0: 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72  cted file");...r
e1e0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e1f0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
e200: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e210: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72    void cackey_fr
e220: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
e230: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e240: 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  *root);. *. * AR
e250: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
e260: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e270: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a  _entity *root. *
e280: 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66           Root of
e290: 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f   the TLV list to
e2a0: 20 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20   start freeing. 
e2b0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
e2c0: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
e2d0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e2e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
e2f0: 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e  rees the TLV lin
e300: 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72  ked listed retur
e310: 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20  ned from. *     
e320: 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  "cackey_read_tlv
e330: 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ". *. */.static 
e340: 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
e350: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
e360: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
e370: 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  oot) {..struct c
e380: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e390: 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a   *curr, *next;..
e3a0: 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c  .if (root == NUL
e3b0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
e3c0: 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20  }...for (curr = 
e3d0: 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72  root; curr; curr
e3e0: 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78   = next) {...nex
e3f0: 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b  t = curr->_next;
e400: 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72  ....switch (curr
e410: 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65  ->tag) {....case
e420: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
e430: 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53  ABLE:....case GS
e440: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
e450: 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72  ATE:.....if (cur
e460: 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09  r->value) {.....
e470: 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75  .free(curr->valu
e480: 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  e);.....}.....br
e490: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
e4a0: 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a  IS_TAG_CARDURL:.
e4b0: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
e4c0: 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09  lue_cardurl) {..
e4d0: 09 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76  ....free(curr->v
e4e0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09  alue_cardurl);..
e4f0: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
e500: 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72  ..}....free(curr
e510: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
e520: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
e530: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e540: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
e550: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
e560: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e570: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
e580: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
e590: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
e5a0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e5b0: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
e5c0: 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b  _tlv(struct cack
e5d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
e5e0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
e5f0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
e600: 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d  _entity, *root =
e610: 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e   NULL, *last = N
e620: 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ULL;..unsigned c
e630: 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c  har tlen_buf[2],
e640: 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c   tval_buf[1024],
e650: 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65   *tval;..unsigne
e660: 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b  d char vlen_buf[
e670: 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39  2], vval_buf[819
e680: 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69  2], *vval;..unsi
e690: 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75  gned char *tmpbu
e6a0: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
e6b0: 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73  g tmpbuflen;..ss
e6c0: 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e  ize_t tlen, vlen
e6d0: 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f  ;..ssize_t read_
e6e0: 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66  ret;..size_t off
e6f0: 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65  set_t = 0, offse
e700: 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e  t_v = 0;..unsign
e710: 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69  ed char tag;..si
e720: 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66  ze_t length;.#if
e730: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69  def HAVE_LIBZ..i
e740: 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  nt uncompress_re
e750: 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  t;.#endif...CACK
e760: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e770: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65  "Called.");...re
e780: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
e790: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
e7a0: 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , tlen_buf, size
e7b0: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c  of(tlen_buf), 1,
e7c0: 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20   offset_t);..if 
e7d0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
e7e0: 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(tlen_buf)) {
e7f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e800: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
e810: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
e820: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e830: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
e840: 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f  ...tlen = (tlen_
e850: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74  buf[1] << 8) | t
e860: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65  len_buf[0];...re
e870: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
e880: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
e890: 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65  , vlen_buf, size
e8a0: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c  of(vlen_buf), 2,
e8b0: 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20   offset_v);..if 
e8c0: 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a  (read_ret != siz
e8d0: 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b  eof(vlen_buf)) {
e8e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e8f0: 50 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69  PRINTF("Read fai
e900: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
e910: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e920: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
e930: 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f  ...vlen = (vlen_
e940: 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76  buf[1] << 8) | v
e950: 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41  len_buf[0];...CA
e960: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e970: 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20  F("Tag Length = 
e980: 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74  %lu, Value Lengt
e990: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
e9a0: 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20  ned long) tlen, 
e9b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e9c0: 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f  vlen);...offset_
e9d0: 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f  t += 2;..offset_
e9e0: 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c  v += 2;...if (tl
e9f0: 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c  en > sizeof(tval
ea00: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
ea10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ea20: 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f  Tag length is to
ea30: 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69  o large, returni
ea40: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
ea50: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
ea60: 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20  ;..}...if (vlen 
ea70: 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75  > sizeof(vval_bu
ea80: 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  f)) {...CACKEY_D
ea90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c  EBUG_PRINTF("Val
eaa0: 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ue length is too
eab0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
eac0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ead0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eae0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
eaf0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
eb00: 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62  fer(slot, tval_b
eb10: 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66  uf, tlen, 1, off
eb20: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
eb30: 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b  d_ret != tlen) {
eb40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
eb50: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
eb60: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d  o read entire T-
eb70: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
eb80: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
eb90: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eba0: 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ..}...read_ret =
ebb0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
ebc0: 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62  fer(slot, vval_b
ebd0: 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66  uf, vlen, 2, off
ebe0: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
ebf0: 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b  d_ret != vlen) {
ec00: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ec10: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
ec20: 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d  o read entire V-
ec30: 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e  buffer, returnin
ec40: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
ec50: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ec60: 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61  ..}...tval = tva
ec70: 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76  l_buf;..vval = v
ec80: 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20  val_buf;..while 
ec90: 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65  (tlen > 0 && vle
eca0: 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d  n > 0) {...tag =
ecb0: 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b   *tval;...tval++
ecc0: 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69  ;...tlen--;....i
ecd0: 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66  f (*tval == 0xff
ece0: 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20  ) {....length = 
ecf0: 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c  (tval[2] << 8) |
ed00: 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61   tval[1];....tva
ed10: 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20  l += 3;....tlen 
ed20: 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  -= 3;...} else {
ed30: 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76  ....length = *tv
ed40: 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09  al;....tval++;..
ed50: 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09  ..tlen--;...}...
ed60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ed70: 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25  INTF("Tag: %s (%
ed80: 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  02x)", CACKEY_DE
ed90: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
eda0: 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67  STR(tag), (unsig
edb0: 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09  ned int) tag);..
edc0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
edd0: 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c  INTBUF("Value:",
ede0: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
edf0: 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
ee00: 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20   NULL;...switch 
ee10: 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  (tag) {....case 
ee20: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52  GSCIS_TAG_CARDUR
ee30: 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  L:.....curr_enti
ee40: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
ee50: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
ee60: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
ee70: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
ee80: 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  l = malloc(sizeo
ee90: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  f(*curr_entity->
eea0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b  value_cardurl));
eeb0: 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ......memcpy(cur
eec0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
eed0: 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76  cardurl->rid, vv
eee0: 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72  al, 5);.....curr
eef0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
ef00: 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20  ardurl->apptype 
ef10: 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63  = vval[5];.....c
ef20: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ef30: 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
ef40: 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c  tid = (vval[6] <
ef50: 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a  < 8) | vval[7];.
ef60: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
ef70: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
ef80: 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d  appid = (vval[8]
ef90: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d   << 8) | vval[9]
efa0: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
efb0: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
efc0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
efd0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
efe0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
eff0: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
f000: 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f  TABLE:.....curr_
f010: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
f020: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
f030: 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75  ity));.....tmpbu
f040: 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74  f = malloc(lengt
f050: 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28  h);......memcpy(
f060: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
f070: 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72  ngth);......curr
f080: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
f090: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
f0a0: 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65  ity->length = le
f0b0: 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65  ngth;.....curr_e
f0c0: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74  ntity->value = t
f0d0: 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f  mpbuf;.....curr_
f0e0: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f0f0: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f100: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
f110: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
f120: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f130: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f140: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
f150: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49  ..#ifdef HAVE_LI
f160: 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e  BZ.....tmpbuflen
f170: 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09   = length * 2;..
f180: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
f190: 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a  oc(tmpbuflen);..
f1a0: 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72  ....uncompress_r
f1b0: 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28  et = uncompress(
f1c0: 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c  tmpbuf, &tmpbufl
f1d0: 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  en, vval, length
f1e0: 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d  );.....if (uncom
f1f0: 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f  press_ret != Z_O
f200: 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  K) {......CACKEY
f210: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
f220: 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72  ailed to decompr
f230: 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28  ess, uncompress(
f240: 29 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d  ) returned %i --
f250: 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69   resorting to di
f260: 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f  rect copy", unco
f270: 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09  mpress_ret);....
f280: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
f290: 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63  ength;......memc
f2a0: 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c  py(tmpbuf, vval,
f2b0: 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a   length);.....}.
f2c0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f2d0: 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f  G_PRINTBUF("Deco
f2e0: 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74  mpressed to:", t
f2f0: 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e  mpbuf, tmpbuflen
f300: 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43  );.#else.....CAC
f310: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f320: 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53  ("Missing ZLIB S
f330: 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72  upport, this cer
f340: 74 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65  tificate is like
f350: 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b  ly useless...");
f360: 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
f370: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65  = length;.....me
f380: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
f390: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64  l, length);.#end
f3a0: 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  if......curr_ent
f3b0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f3c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f3d0: 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66  >length = tmpbuf
f3e0: 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  len;.....curr_en
f3f0: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
f400: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
f410: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f420: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f430: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f440: 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63  AG_PKCS15:.....c
f450: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f460: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f470: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  _entity));......
f480: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f490: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f4a0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62  _entity->value_b
f4b0: 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09  yte = vval[0];..
f4c0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f4d0: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f4e0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
f4f0: 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b  .vval += length;
f500: 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74  ...vlen -= lengt
f510: 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65  h;....if (curr_e
f520: 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b  ntity != NULL) {
f530: 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20  ....if (root == 
f540: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74  NULL) {.....root
f550: 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a   = curr_entity;.
f560: 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73  ...}.....if (las
f570: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t != NULL) {....
f580: 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63  .last->_next = c
f590: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
f5a0: 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72  .....last = curr
f5b0: 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a  _entity;...}..}.
f5c0: 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a  ..return(root);.
f5d0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
f5e0: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f5f0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
f600: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
f610: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
f620: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
f630: 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
f640: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f650: 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
f660: 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
f670: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73  pcsc_identity *s
f680: 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75  tart, size_t cou
f690: 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61  nt, int free_sta
f6a0: 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64  rt) {..size_t id
f6b0: 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d  x;...if (start =
f6c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
f6d0: 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
f6e0: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
f6f0: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
f700: 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  f (start[idx].ce
f710: 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09  rtificate) {....
f720: 66 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e  free(start[idx].
f730: 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09  certificate);...
f740: 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  }..}...if (free_
f750: 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28  start) {...free(
f760: 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74  start);..}...ret
f770: 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  urn;.}..static s
f780: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f790: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b  c_identity *cack
f7a0: 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74  ey_copy_certs(st
f7b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f7c0: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c  _identity *dest,
f7d0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
f7e0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
f7f0: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
f800: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
f810: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
f820: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
f830: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
f840: 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20   (dest == NULL) 
f850: 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f  {...dest = mallo
f860: 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20  c(sizeof(*dest) 
f870: 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66  * count);..}...f
f880: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
f890: 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   < count; idx++)
f8a0: 20 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69   {...dest[idx].i
f8b0: 64 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69  d_type = start[i
f8c0: 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09  dx].id_type;....
f8d0: 73 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78  switch (dest[idx
f8e0: 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09  ].id_type) {....
f8f0: 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
f900: 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d  YPE_CAC:.....mem
f910: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  cpy(dest[idx].ca
f920: 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
f930: 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  tart[idx].card.c
f940: 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
f950: 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  f(dest[idx].card
f960: 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
f970: 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  ...dest[idx].car
f980: 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61  d.cac.file = sta
f990: 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  rt[idx].card.cac
f9a0: 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b  .file;.....break
f9b0: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
f9c0: 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
f9d0: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
f9e0: 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74  .piv.key_id = st
f9f0: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  art[idx].card.pi
fa00: 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 6d 65  v.key_id;.....me
fa10: 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63  mcpy(dest[idx].c
fa20: 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73  ard.piv.label, s
fa30: 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  tart[idx].card.p
fa40: 69 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  iv.label, sizeof
fa50: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
fa60: 70 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  piv.label));....
fa70: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
fa80: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
fa90: 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72  ERT_ONLY:.....br
faa0: 65 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b  eak;...}...dest[
fab0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fac0: 5f 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78  _len = start[idx
fad0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
fae0: 6e 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b  n;...dest[idx].k
faf0: 65 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69  eysize = start[i
fb00: 64 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09  dx].keysize;....
fb10: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
fb20: 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64  icate = malloc(d
fb30: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fb40: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d  cate_len);...mem
fb50: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  cpy(dest[idx].ce
fb60: 72 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74  rtificate, start
fb70: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fb80: 65 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  e, dest[idx].cer
fb90: 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
fba0: 7d 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29  }...return(dest)
fbb0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
fbc0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
fbd0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
fbe0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
fbf0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
fc00: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
fc10: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
fc20: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
fc30: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
fc40: 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79  identity *cackey
fc50: 5f 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75  _read_certs(stru
fc60: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
fc70: 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
fc80: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fc90: 79 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e  y *certs, unsign
fca0: 65 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20  ed long *count) 
fcb0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
fcc0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
fcd0: 63 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74  curr_id;..struct
fce0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
fcf0: 74 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63  ty *ccc_tlv, *cc
fd00: 63 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76  c_curr, *app_tlv
fd10: 2c 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e  , *app_curr;..un
fd20: 73 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f  signed char ccc_
fd30: 61 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41  aid[] = {GSCIS_A
fd40: 49 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64  ID_CCC}, piv_aid
fd50: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
fd60: 37 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09  73_3_PIV_AID};..
fd70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
fd80: 69 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f  iv_oid, piv_oid_
fd90: 70 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53  pivauth[] = {NIS
fda0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
fdb0: 50 49 56 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69  PIVAUTH}, piv_oi
fdc0: 64 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20  d_signature[] = 
fdd0: 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
fde0: 4f 49 44 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20  OID_SIGNATURE}, 
fdf0: 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d  piv_oid_keymgt[]
fe00: 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33   = {NISTSP800_73
fe10: 5f 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a  _3_OID_KEYMGT};.
fe20: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
fe30: 75 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73  urr_aid[7];..uns
fe40: 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65  igned char buffe
fe50: 72 5b 38 31 39 32 5d 2c 20 2a 62 75 66 66 65 72  r[8192], *buffer
fe60: 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  _p;..unsigned lo
fe70: 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09  ng outidx = 0;..
fe80: 63 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b  char *piv_label;
fe90: 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61  ..cackey_ret tra
fea0: 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73  nsaction_ret;..s
feb0: 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
fec0: 0a 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f  ..size_t buffer_
fed0: 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f  len;..int certs_
fee0: 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20  resizable;..int 
fef0: 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74  send_ret, select
ff00: 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b  _ret;..int piv_k
ff10: 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e  ey, piv = 0;..in
ff20: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
ff30: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
ff40: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
ff50: 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
ff60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ff70: 52 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20  RINTF("count is 
ff80: 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20  NULL, returning 
ff90: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
ffa0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
ffb0: 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d  }...if (certs !=
ffc0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a   NULL) {...if (*
ffd0: 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
ffe0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
fff0: 49 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20  INTF("Requested 
10000 77 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65  we return 0 obje
10010 63 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75  cts, short-circu
10020 69 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  it");.....return
10030 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10040 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f  ..if (!slot->slo
10050 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20  t_reset) {...if 
10060 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
10070 72 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65  rts) {....if (ce
10080 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  rts == NULL) {..
10090 09 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
100a0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
100b0 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   * slot->cached_
100c0 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  certs_count);...
100d0 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
100e0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
100f0 75 6e 74 3b 0a 0a 09 09 09 7d 20 65 6c 73 65 20  unt;.....} else 
10100 7b 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74  {.....if (*count
10110 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   > slot->cached_
10120 63 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  certs_count) {..
10130 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f  ....*count = slo
10140 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
10150 63 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09  count;.....}....
10160 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70  }.....cackey_cop
10170 79 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73  y_certs(certs, s
10180 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
10190 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  s, *count);.....
101a0 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09  return(certs);..
101b0 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  .}..}...if (slot
101c0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
101d0 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  {...cackey_free_
101e0 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68  certs(slot->cach
101f0 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ed_certs, slot->
10200 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
10210 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d  nt, 1);....slot-
10220 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  >cached_certs = 
10230 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65  NULL;..}.../* Be
10240 67 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20  gin a SmartCard 
10250 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
10260 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20  transaction_ret 
10270 3d 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  = cackey_begin_t
10280 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
10290 3b 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69  ;..if (transacti
102a0 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  on_ret != CACKEY
102b0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
102c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
102d0 4e 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69  NTF("Unable begi
102e0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
102f0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
10300 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
10310 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
10320 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20  (certs == NULL) 
10330 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c  {...certs = mall
10340 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  oc(sizeof(*certs
10350 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74  ) * 5);...*count
10360 20 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65   = 5;...certs_re
10370 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20  sizable = 1;..} 
10380 65 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72  else {...certs_r
10390 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d  esizable = 0;..}
103a0 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65  .../* Select the
103b0 20 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09   CCC Applet */..
103c0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
103d0 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
103e0 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73  slot, ccc_aid, s
103f0 69 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b  izeof(ccc_aid));
10400 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
10410 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
10420 4f 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50  OK) {.../* Try P
10430 49 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a  IV application *
10440 2f 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  /...send_ret = c
10450 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
10460 6c 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69  let(slot, piv_ai
10470 64 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69  d, sizeof(piv_ai
10480 64 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f  d));...if (send_
10490 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
104a0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
104b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
104c0 46 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56  F("We have a PIV
104d0 20 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69   card -- not usi
104e0 6e 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c  ng the CCC, pull
104f0 69 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64  ing pre-selected
10500 20 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76   keys");.....piv
10510 20 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b   = 1;...} else {
10520 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10530 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
10540 74 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70  to select CCC Ap
10550 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  plet, returning 
10560 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
10570 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53  ../* Terminate S
10580 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63  martCard Transac
10590 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
105a0 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
105b0 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74  n(slot);.....ret
105c0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09  urn(NULL);...}..
105d0 7d 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09  }...if (piv) {..
105e0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
105f0 64 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b  dx < 3; idx++) {
10600 0a 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29  ....switch (idx)
10610 20 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09   {.....case 0:..
10620 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69  ....piv_oid = pi
10630 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09  v_oid_pivauth;..
10640 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
10650 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
10660 5f 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70  _PIVAUTH;......p
10670 69 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68  iv_label = "Auth
10680 65 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09  entication";....
10690 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
106a0 65 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 1:......piv_oi
106b0 64 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e  d = piv_oid_sign
106c0 61 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f  ature;......piv_
106d0 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f  key = NISTSP800_
106e0 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55  78_3_KEY_SIGNATU
106f0 52 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62  RE;......piv_lab
10700 65 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22  el = "Signature"
10710 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
10720 09 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70  ..case 2:......p
10730 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
10740 5f 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69  _keymgt;......pi
10750 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30  v_key = NISTSP80
10760 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47  0_78_3_KEY_KEYMG
10770 54 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  T;......piv_labe
10780 6c 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d  l = "Key Managem
10790 65 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b  ent";......break
107a0 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f  ;....}.....read_
107b0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  ret = cackey_get
107c0 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66  _data(slot, buff
107d0 65 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65  er, sizeof(buffe
107e0 72 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09  r), piv_oid);...
107f0 09 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c  ..if (read_ret <
10800 3d 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69  = 0) {.....conti
10810 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75  nue;....}.....cu
10820 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f  rr_id = &certs[o
10830 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64  utidx];....outid
10840 78 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64  x++;.....curr_id
10850 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
10860 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74  ...curr_id->id_t
10870 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f  ype = CACKEY_ID_
10880 54 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72  TYPE_PIV;....cur
10890 72 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b  r_id->card.piv.k
108a0 65 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b  ey_id = piv_key;
108b0 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
108c0 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62  id->card.piv.lab
108d0 65 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73  el, piv_label, s
108e0 74 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29  trlen(piv_label)
108f0 20 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f   + 1);.....curr_
10900 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
10910 6c 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a  len = read_ret;.
10920 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10930 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63  ificate = malloc
10940 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
10950 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
10960 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a  buffer_len = siz
10970 65 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09  eof(buffer);....
10980 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65  buffer_p = cacke
10990 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61  y_read_bertlv_ta
109a0 67 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65  g(buffer, &buffe
109b0 72 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72  r_len, 0x70, cur
109c0 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
109d0 65 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72  e, &curr_id->cer
109e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
109f0 09 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20  ...if (buffer_p 
10a00 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  == NULL) {.....C
10a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10a20 54 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74  TF("Reading cert
10a30 69 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52  ificate from BER
10a40 2d 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61  -TLV response fa
10a50 69 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b  iled, skipping k
10a60 65 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 09 09  ey %i", idx);...
10a70 09 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e  ..free(curr_id->
10a80 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09  certificate);...
10a90 09 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09  ...outidx--;....
10aa0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10ab0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
10ac0 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65  ./* Read all the
10ad0 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68   applets from th
10ae0 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09  e CCC's TLV */..
10af0 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65  .ccc_tlv = cacke
10b00 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29  y_read_tlv(slot)
10b10 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  ;..../* Look for
10b20 20 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63   CARDURLs that c
10b30 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49  oorespond to PKI
10b40 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f   applets */...fo
10b50 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r (ccc_curr = cc
10b60 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b  c_tlv; ccc_curr;
10b70 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f   ccc_curr = ccc_
10b80 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09  curr->_next) {..
10b90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10ba0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67  RINTF("Found tag
10bb0 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b  : %s ... ", CACK
10bc0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
10bd0 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  G_TO_STR(ccc_cur
10be0 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66  r->tag));.....if
10bf0 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20   (ccc_curr->tag 
10c00 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  != GSCIS_TAG_CAR
10c10 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  DURL) {.....CACK
10c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10c30 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20  "  ... skipping 
10c40 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65  it (we only care
10c50 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29   about CARDURLs)
10c60 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
10c70 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
10c80 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10c90 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
10ca0 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  e & CACKEY_TLV_A
10cb0 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45  PP_PKI) != CACKE
10cc0 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b  Y_TLV_APP_PKI) {
10cd0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10ce0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
10cf0 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20  skipping it (we 
10d00 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20  only care about 
10d10 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69  PKI applets, thi
10d20 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74  s applet support
10d30 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41  s: %s/%02x)", CA
10d40 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
10d50 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63  APPTYPE_TO_STR(c
10d60 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
10d70 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29  ardurl->apptype)
10d80 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
10d90 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
10da0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
10db0 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e);......continu
10dc0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b  e;....}.....CACK
10dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
10de0 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75  F("RID:", ccc_cu
10df0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10e00 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63  l->rid, sizeof(c
10e10 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
10e20 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09  ardurl->rid));..
10e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
10e40 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25  RINTF("AppID = %
10e50 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59  s/%04lx", CACKEY
10e60 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49  _DEBUG_FUNC_OBJI
10e70 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  D_TO_STR(ccc_cur
10e80 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10e90 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67  ->appid), (unsig
10ea0 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75  ned long) ccc_cu
10eb0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10ec0 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41  l->appid);....CA
10ed0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10ee0 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73  F("ObjectID = %s
10ef0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
10f00 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
10f10 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10f20 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
10f30 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73  >objectid), (uns
10f40 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
10f50 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10f60 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a  url->objectid);.
10f70 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
10f80 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  aid, ccc_curr->v
10f90 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10fa0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
10fb0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10fc0 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72  l->rid));....cur
10fd0 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72  r_aid[sizeof(cur
10fe0 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63  r_aid) - 2] = (c
10ff0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
11000 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e  ardurl->appid >>
11010 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63   8) & 0xff;....c
11020 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
11030 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20  urr_aid) - 1] = 
11040 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
11050 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26  cardurl->appid &
11060 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65   0xff;...../* Se
11070 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65  lect found apple
11080 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65  t ... */....sele
11090 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
110a0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
110b0 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  ot, curr_aid, si
110c0 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b  zeof(curr_aid));
110d0 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72  ....if (select_r
110e0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
110f0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  C_S_OK) {.....CA
11100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11110 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c  F("Failed to sel
11120 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70  ect applet, skip
11130 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
11140 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
11150 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
11160 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e  ....}...../* ...
11170 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c   and object (fil
11180 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f  e) */....select_
11190 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
111a0 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63  ect_file(slot, c
111b0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
111c0 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64  ardurl->objectid
111d0 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
111e0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
111f0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
11200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11210 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
11220 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70  elect file, skip
11230 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20  ping processing 
11240 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29  of this object")
11250 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ;......continue;
11260 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f  ....}...../* Pro
11270 63 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73  cess this file's
11280 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   TLV looking for
11290 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
112a0 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61  ....app_tlv = ca
112b0 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c  ckey_read_tlv(sl
112c0 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61  ot);......for (a
112d0 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c  pp_curr = app_tl
112e0 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70  v; app_curr; app
112f0 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72  _curr = app_curr
11300 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43  ->_next) {.....C
11310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11320 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25  TF("Found tag: %
11330 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
11340 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
11350 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29  (app_curr->tag))
11360 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75  ;.....if (app_cu
11370 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
11380 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45  _TAG_CERTIFICATE
11390 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
113a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
113b0 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20  ... skipping it 
113c0 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62  (we only care ab
113d0 6f 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73  out CERTIFICATEs
113e0 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  )");.......conti
113f0 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
11400 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73  curr_id = &certs
11410 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75  [outidx];.....ou
11420 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72  tidx++;......cur
11430 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
11440 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
11450 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  AC;.....memcpy(c
11460 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11470 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69  .applet, curr_ai
11480 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69  d, sizeof(curr_i
11490 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
114a0 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69  et));.....curr_i
114b0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  d->card.cac.file
114c0 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   = ccc_curr->val
114d0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
114e0 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69  ctid;.....curr_i
114f0 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b  d->keysize = -1;
11500 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
11510 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69  UG_PRINTF("Filli
11520 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ng curr_id->card
11530 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29  .cac.applet (%p)
11540 20 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a   with %lu bytes:
11550 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  ", curr_id->card
11560 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e  .cac.applet, (un
11570 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
11580 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
11590 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
115a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
115b0 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22  _PRINTBUF("VAL:"
115c0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
115d0 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
115e0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
115f0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
11600 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
11610 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61  tificate_len = a
11620 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b  pp_curr->length;
11630 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
11640 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
11650 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  loc(curr_id->cer
11660 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09  tificate_len);..
11670 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
11680 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
11690 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c  app_curr->value,
116a0 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66   curr_id->certif
116b0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09  icate_len);.....
116c0 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a  .if (outidx >= *
116d0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66  count) {......if
116e0 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c   (certs_resizabl
116f0 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e  e) {.......*coun
11700 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 63 65  t *= 2;.......ce
11710 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65  rts = realloc(ce
11720 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72  rts, sizeof(*cer
11730 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b  ts) * (*count));
11740 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
11750 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
11760 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  .}.....}....}...
11770 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  ..cackey_free_tl
11780 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09  v(app_tlv);.....
11790 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
117a0 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61  ount) {.....brea
117b0 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63  k;....}...}....c
117c0 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63  ackey_free_tlv(c
117d0 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63  cc_tlv);..}...*c
117e0 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a  ount = outidx;..
117f0 09 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a  .if (certs_resiz
11800 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20  able) {...certs 
11810 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c  = realloc(certs,
11820 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20   sizeof(*certs) 
11830 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a  * (*count));..}.
11840 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
11850 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f  erts = cackey_co
11860 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63  py_certs(NULL, c
11870 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09  erts, *count);..
11880 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
11890 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e  ts_count = *coun
118a0 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74  t;.../* Terminat
118b0 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e  e SmartCard Tran
118c0 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b  saction */..cack
118d0 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
118e0 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75  on(slot);...retu
118f0 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a  rn(certs);.}../*
11900 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
11910 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
11920 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
11930 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
11940 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
11950 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
11960 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
11970 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
11980 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
11990 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
119a0 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63  lot *slot, struc
119b0 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
119c0 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
119d0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
119e0 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20   size_t buflen, 
119f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
11a00 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75  utbuf, size_t ou
11a10 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64  tbuflen, int pad
11a20 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64  Input, int unpad
11a30 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65  Output) {..cacke
11a40 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69  y_pcsc_id_type i
11a50 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65  d_type;..unsigne
11a60 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f  d char dyn_auth_
11a70 74 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a 09 75  template[10];..u
11a80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d  nsigned char *tm
11a90 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c  pbuf, *tmpbuf_s,
11aa0 20 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74   *outbuf_s, *out
11ab0 62 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_p;..unsigned
11ac0 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
11ad0 65 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a  end, p1, class;.
11ae0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
11af0 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65  locktype;..cacke
11b00 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
11b10 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
11b20 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74  de;..ssize_t ret
11b30 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66  val = 0, unpadof
11b40 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d  fset;..size_t tm
11b50 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c  pbuflen, padlen,
11b60 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f   tmpoutbuflen, o
11b70 75 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20  utbuf_len;..int 
11b80 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
11b90 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b  ..int le;...CACK
11ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11bb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
11bc0 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (slot == NULL) 
11bd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11be0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11bf0 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b   slot is NULL");
11c00 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11c10 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20  .}...if (buf == 
11c20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11c30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11c40 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55  rror.  buf is NU
11c50 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
11c60 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75  -1);..}...if (ou
11c70 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tbuf == NULL) {.
11c80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11c90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f  RINTF("Error.  o
11ca0 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b  utbuf is NULL");
11cb0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11cc0 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  .}...if (identit
11cd0 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
11ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11cf0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
11d00 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tity is NULL");.
11d10 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11d20 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
11d30 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
11d40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
11d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11d60 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
11d70 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11d80 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09  y is NULL");....
11d90 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
11da0 09 69 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74  .id_type = ident
11db0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
11dc0 74 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66  ty->id_type;..if
11dd0 20 28 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43   (id_type == CAC
11de0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
11df0 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45  _ONLY) {...CACKE
11e00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11e10 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
11e20 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
11e30 69 73 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  is CACKEY_ID_TYP
11e40 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69  E_CERT_ONLY, whi
11e50 63 68 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  ch cannot be use
11e60 64 20 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79  d for sign/decry
11e70 70 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  pt");....return(
11e80 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  -1);..}...switch
11e90 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
11ea0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
11eb0 50 45 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43  PE_PIV:...case C
11ec0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
11ed0 43 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  C:....break;...d
11ee0 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
11ef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11f00 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79  Error.  identity
11f10 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ->pcsc_identity 
11f20 69 73 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74  is not a support
11f30 65 64 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69  ed value. Type i
11f40 73 3a 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20  s: 0x%lx (PIV = 
11f50 30 78 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25  0x%lx, CAC = 0x%
11f60 6c 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lx)", (unsigned 
11f70 6c 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28  long) id_type, (
11f80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43  unsigned long) C
11f90 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
11fa0 56 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  V, (unsigned lon
11fb0 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  g) CACKEY_ID_TYP
11fc0 45 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75  E_CAC);.....retu
11fd0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  rn(-1);..}.../* 
11fe0 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69  Determine identi
11ff0 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  ty Key size */..
12000 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
12010 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12020 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64  size < 0) {...id
12030 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12040 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d  ntity->keysize =
12050 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65   x509_to_keysize
12060 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f  (identity->pcsc_
12070 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
12080 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d  icate, identity-
12090 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
120a0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
120b0 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65  ;..}.../* Pad me
120c0 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a  ssage to key siz
120d0 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70  e */..if (padInp
120e0 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ut) {...if (iden
120f0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12100 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30  ity->keysize > 0
12110 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65  ) {....if (bufle
12120 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  n != identity->p
12130 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
12140 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20  ysize) {.....if 
12150 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74  (buflen > (ident
12160 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12170 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29  ty->keysize + 3)
12180 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
12190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
121a0 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73  ror.  Message is
121b0 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69   too large to si
121c0 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
121d0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
121e0 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75  ....}......tmpbu
121f0 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  flen = identity-
12200 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12210 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70  keysize;.....tmp
12220 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
12230 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65  buflen);.....fre
12240 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09  e_tmpbuf = 1;...
12250 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62  ...padlen = tmpb
12260 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d  uflen - buflen -
12270 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20   3;....../* RSA 
12280 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53  PKCS#1 EMSA-PKCS
12290 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a  1-v1_5 Padding *
122a0 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20  /.....tmpbuf[0] 
122b0 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62  = 0x00;.....tmpb
122c0 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09  uf[1] = 0x01;...
122d0 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66  ..memset(&tmpbuf
122e0 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65  [2], 0xFF, padle
122f0 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70  n);.....tmpbuf[p
12300 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30  adlen + 2]= 0x00
12310 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d  ;.....memcpy(&tm
12320 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d  pbuf[padlen + 3]
12330 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
12340 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12350 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61  G_PRINTBUF("Unpa
12360 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66  dded:", buf, buf
12370 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59  len);.....CACKEY
12380 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
12390 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75  "Padded:", tmpbu
123a0 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09  f, tmpbuflen);..
123b0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74  ..} else {.....t
123c0 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09  mpbuf = buf;....
123d0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
123e0 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d  len;.....free_tm
123f0 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61  pbuf = 0;.....pa
12400 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  dlen = 0;....}..
12410 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
12420 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12430 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65  ("Unable to dete
12440 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20  rmine key size, 
12450 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61  hoping the messa
12460 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70  ge is properly p
12470 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d  added!");.....tm
12480 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74  pbuf = buf;....t
12490 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
124a0 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75  n;....free_tmpbu
124b0 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e  f = 0;....padlen
124c0 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73   = 0;...}..} els
124d0 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62  e {...tmpbuf = b
124e0 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20  uf;...tmpbuflen 
124f0 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65  = buflen;...free
12500 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70  _tmpbuf = 0;...p
12510 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09  adlen = 0;..}...
12520 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63  /* Begin transac
12530 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
12540 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
12550 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65  n(slot);.../* Se
12560 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70  lect correct app
12570 6c 65 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  let */..switch (
12580 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
12590 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
125a0 5f 43 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f  _CAC:....CACKEY_
125b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
125c0 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66  lecting applet f
125d0 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c  ound at %p ...",
125e0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
125f0 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63  identity->card.c
12600 61 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63  ac.applet);....c
12610 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
12620 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  let(slot, identi
12630 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12640 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
12650 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74  et, sizeof(ident
12660 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12670 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  ty->card.cac.app
12680 6c 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65  let));...../* Se
12690 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c  lect correct fil
126a0 65 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73  e */....cackey_s
126b0 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
126c0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
126d0 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63  identity->card.c
126e0 61 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65  ac.file);....bre
126f0 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ak;...case CACKE
12700 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
12710 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12720 61 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09  ate[0] = 0x7C;..
12730 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12740 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09  ate[1] = 0x82;..
12750 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
12760 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75  ate[2] = ((tmpbu
12770 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66  flen + 6) & 0xff
12780 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e  00) >> 8;....dyn
12790 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33  _auth_template[3
127a0 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b  ] = (tmpbuflen +
127b0 20 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09   6) & 0x00ff;...
127c0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
127d0 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[4] = 0x82;...
127e0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
127f0 74 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09  te[5] = 0x00;...
12800 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12810 74 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09  te[6] = 0x81;...
12820 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12830 74 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[7] = 0x82;...
12840 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12850 74 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c  te[8] = (tmpbufl
12860 65 6e 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  en & 0xff00) >> 
12870 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  8;....dyn_auth_t
12880 65 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70  emplate[9] = tmp
12890 62 75 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b  buflen & 0x00ff;
128a0 0a 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  .....send_ret = 
128b0 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
128c0 28 73 6c 6f 74 2c 20 30 78 31 30 2c 20 4e 49 53  (slot, 0x10, NIS
128d0 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54  TSP800_73_3_INST
128e0 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53  R_GENAUTH, NISTS
128f0 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
12900 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79  SA2048, identity
12910 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12920 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
12930 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74  , sizeof(dyn_aut
12940 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79 6e  h_template), dyn
12950 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20  _auth_template, 
12960 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
12970 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 62 72 65 61  , NULL);....brea
12980 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
12990 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
129a0 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  LY:....break;..}
129b0 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d  ...tmpbuf_s = tm
129c0 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20  pbuf;..outbuf_s 
129d0 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65  = outbuf;..while
129e0 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09   (tmpbuflen) {..
129f0 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20  .tmpoutbuflen = 
12a00 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69 66  outbuflen;....if
12a10 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
12a20 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
12a30 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e  ....bytes_to_sen
12a40 64 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  d = CACKEY_APDU_
12a50 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  MTU;...} else {.
12a60 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
12a70 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
12a80 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  }....send_ret = 
12a90 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
12aa0 4e 45 52 49 43 3b 0a 09 09 73 77 69 74 63 68 20  NERIC;...switch 
12ab0 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  (id_type) {....c
12ac0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
12ad0 50 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 20 28  PE_CAC:.....if (
12ae0 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b  tmpbuflen > CACK
12af0 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09  EY_APDU_MTU) {..
12b00 09 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09  ....p1 = 0x80;..
12b10 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09  ....le = 0x00;..
12b20 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
12b30 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  .p1 = 0x00;.....
12b40 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09  .le = 0x00;.....
12b50 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20  }......send_ret 
12b60 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
12b70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
12b80 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54  LASS_GLOBAL_PLAT
12b90 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54  FORM, GSCIS_INST
12ba0 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70  R_SIGNDECRYPT, p
12bb0 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74  1, 0x00, bytes_t
12bc0 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
12bd0 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
12be0 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
12bf0 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b  flen);.....break
12c00 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
12c10 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
12c20 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20  ..if (tmpbuflen 
12c30 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  > CACKEY_APDU_MT
12c40 55 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20  U) {......class 
12c50 3d 20 30 78 31 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x10;......le 
12c60 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c  = 0x00;.....} el
12c70 73 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20  se {......class 
12c80 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
12c90 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 20 3d  O7816;......le =
12ca0 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   256;.....}.....
12cb0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
12cc0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
12cd0 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50  t, class, NISTSP
12ce0 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
12cf0 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30  ENAUTH, NISTSP80
12d00 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32  0_78_3_ALGO_RSA2
12d10 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  048, identity->p
12d20 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12d30 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 62  rd.piv.key_id, b
12d40 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d  ytes_to_send, tm
12d50 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63  pbuf, le, &respc
12d60 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d  ode, outbuf, &tm
12d70 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09  poutbuflen);....
12d80 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
12d90 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
12da0 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72  ERT_ONLY:.....br
12db0 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
12dc0 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
12dd0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
12de0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12df0 50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e  PRINTF("ADPU Sen
12e00 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72  ding Failed -- r
12e10 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
12e20 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72  r.");.....if (fr
12e30 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09  ee_tmpbuf) {....
12e40 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
12e50 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75  ......free(tmpbu
12e60 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  f_s);.....}....}
12e70 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e  ...../* End tran
12e80 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
12e90 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
12ea0 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
12eb0 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20  if (respcode == 
12ec0 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41  0x6982) {.....CA
12ed0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12ee0 46 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74  F("Security stat
12ef0 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65  us not satisifie
12f00 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45  d.  Returning NE
12f10 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09  EDLOGIN");......
12f20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
12f30 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09  _reset(slot);...
12f40 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c  ..slot->token_fl
12f50 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
12f60 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72  REQUIRED;......r
12f70 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
12f80 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a  C_E_NEEDLOGIN);.
12f90 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e  ...}.....if (sen
12fa0 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
12fb0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
12fc0 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  NT) {.....CACKEY
12fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
12fe0 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65  oken absent.  Re
12ff0 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53  turning TOKENABS
13000 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b  ENT");......cack
13010 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
13020 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72  et(slot);......r
13030 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
13040 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
13050 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
13060 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d  n(-1);...}....tm
13070 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f  pbuf += bytes_to
13080 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c  _send;...tmpbufl
13090 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73  en -= bytes_to_s
130a0 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b  end;....outbuf +
130b0 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
130c0 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74  ..outbuflen -= t
130d0 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72  mpoutbuflen;...r
130e0 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62  etval += tmpoutb
130f0 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28  uflen;..}...if (
13100 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
13110 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b  .if (tmpbuf_s) {
13120 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f  ....free(tmpbuf_
13130 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74  s);...}..}...out
13140 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a  buf = outbuf_s;.
13150 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63  ../* End transac
13160 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
13170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
13180 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43  slot);..#ifdef C
13190 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23  ACKEY_PARANOID.#
131a0 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53    ifdef _POSIX_S
131b0 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75  SIZE_MAX..if (ou
131c0 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58  tbuflen > _POSIX
131d0 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
131e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
131f0 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65  NTF("Outbuflen e
13200 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
13210 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
13220 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
13230 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65   = %li, outbufle
13240 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67  n = %lu)", (long
13250 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  ) _POSIX_SSIZE_M
13260 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  AX, (unsigned lo
13270 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  ng) outbuflen);.
13280 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
13290 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
132a0 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72  f.../* We must r
132b0 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74  emove the "7C" t
132c0 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65  ag to get to the
132d0 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73   signature */..s
132e0 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20  witch (id_type) 
132f0 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  {...case CACKEY_
13300 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
13310 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74  outbuf_len = ret
13320 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70  val;....outbuf_p
13330 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
13340 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66  ertlv_tag(outbuf
13350 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30  , &outbuf_len, 0
13360 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74  x7C, NULL,  &out
13370 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20  buf_len);....if 
13380 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c  (outbuf_p == NUL
13390 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
133a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
133b0 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20  sponse from PIV 
133c0 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54  for GENERATE AUT
133d0 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20  HENTICATION was 
133e0 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20  not a 0x7C tag, 
133f0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
13400 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74  lure");......ret
13410 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09  urn(-1);....}...
13420 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75  ..retval = outbu
13430 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75  f_len;.....outbu
13440 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a  f_len = retval;.
13450 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61  ...outbuf_p = ca
13460 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
13470 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75  _tag(outbuf, &ou
13480 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20  tbuf_len, 0x82, 
13490 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c  NULL,  &outbuf_l
134a0 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62  en);....if (outb
134b0 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  uf_p == NULL) {.
134c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
134d0 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
134e0 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47  e from PIV for G
134f0 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49  ENERATE AUTHENTI
13500 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61  CATION was not a
13510 20 30 78 38 32 20 77 69 74 68 20 74 68 65 6e 20   0x82 with then 
13520 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e  0x7C tag, return
13530 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
13540 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
13550 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76  );....}.....retv
13560 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b  al = outbuf_len;
13570 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  .....break;...ca
13580 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
13590 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41  E_CAC:...case CA
135a0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
135b0 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b  T_ONLY:....break
135c0 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20  ;..}.../* Unpad 
135d0 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e  reply */..if (un
135e0 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69  padOutput) {...i
135f0 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b  f (retval < 3) {
13600 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13610 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69  _PRINTF("Reply i
13620 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20  s too small, we 
13630 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20  are not able to 
13640 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67  unpad -- passing
13650 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
13660 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
13670 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
13680 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
13690 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
136a0 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
136b0 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
136c0 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
136d0 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
136e0 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20  ..if (outbuf[0] 
136f0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41  != 0x00) {....CA
13700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13710 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20  F("Unrecognized 
13720 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d  padding scheme -
13730 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
13740 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
13750 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
13760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13770 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
13780 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
13790 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
137a0 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
137b0 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
137c0 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b  l);...}....block
137d0 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d  type = outbuf[1]
137e0 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20  ;...unpadoffset 
137f0 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  = 0;....switch (
13800 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09  blocktype) {....
13810 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f  case 0x00:...../
13820 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
13830 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f   1, the first no
13840 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74  n-zero byte is t
13850 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61  he start of data
13860 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70   */.....for (unp
13870 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e  adoffset = 2; un
13880 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76  padoffset < retv
13890 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b  al; unpadoffset+
138a0 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75  +) {......if (ou
138b0 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
138c0 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
138d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
138e0 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
138f0 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a  ;....case 0x01:.
13900 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53  ..../* Padding S
13910 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74  cheme 2, pad byt
13920 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c  es are 0xFF foll
13930 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a  owed by 0x00 */.
13940 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
13950 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
13960 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
13970 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
13980 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
13990 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
139a0 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69   0xFF) {.......i
139b0 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
139c0 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
139d0 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66  {........unpadof
139e0 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09  fset++;.........
139f0 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65  break;.......} e
13a00 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43  lse {........CAC
13a10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13a20 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
13a30 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
13a40 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
13a50 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
13a60 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20  been 0x00 found 
13a70 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
13a80 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
13a90 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
13aa0 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
13ab0 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
13ac0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41   else {.......CA
13ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13ae0 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
13af0 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
13b00 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
13b10 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
13b20 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64   been 0xFF found
13b30 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
13b40 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
13b50 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
13b60 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
13b70 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
13b80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
13b90 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50  e 0x02:...../* P
13ba0 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c  adding Scheme 3,
13bb0 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e   pad bytes are n
13bc0 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65  on-zero first ze
13bd0 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73  ro byte found is
13be0 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62   the seperator b
13bf0 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  yte */.....for (
13c00 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
13c10 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
13c20 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
13c30 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
13c40 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
13c50 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
13c60 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65  ......unpadoffse
13c70 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t++;........brea
13c80 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
13c90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
13ca0 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65  ..if (unpadoffse
13cb0 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09  t > retval) {...
13cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13cd0 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65  INTF("Offset gre
13ce0 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20  ater than reply 
13cf0 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20  size, aborting. 
13d00 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
13d10 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  %lu, retval = %l
13d20 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
13d30 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74  ong) unpadoffset
13d40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13d50 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  ) retval);.....r
13d60 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
13d70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13d80 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
13d90 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
13da0 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d  l);....retval -=
13db0 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09   unpadoffset;...
13dc0 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
13dd0 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66  outbuf + unpadof
13de0 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  fset, retval);..
13df0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13e00 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65  RINTBUF("Unpadde
13e10 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
13e20 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b  val);..}....CACK
13e30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13e40 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
13e50 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20  ccess, retval = 
13e60 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c  %li (bytes)", (l
13e70 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ong) retval);...
13e80 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
13e90 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
13ea0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
13eb0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
13ec0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
13ed0 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
13ee0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
13ef0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
13f00 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
13f10 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67  y_ret cackey_log
13f20 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  in(struct cackey
13f30 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
13f40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c  igned char *pin,
13f50 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70   unsigned long p
13f60 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69  in_len, int *tri
13f70 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
13f80 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
13f90 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
13fa0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
13fb0 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
13fc0 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78  cac_pin[8] = {0x
13fd0 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
13fe0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
13ff0 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09  , 0xFF, 0xFF};..
14000 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75  unsigned long nu
14010 6d 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36  m_certs;..uint16
14020 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
14030 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
14040 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
14050 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f  d_ret;..int key_
14060 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30  reference = 0x00
14070 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20  ;.../* Indicate 
14080 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b  that we do not k
14090 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61  now about how ma
140a0 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d  ny tries are rem
140b0 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74  aining */..if (t
140c0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
140d0 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d  ) {...*tries_rem
140e0 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09  aining_p = -1;..
140f0 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  }.../* Apparentl
14100 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
14110 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
14120 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
14130 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
14140 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
14150 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
14160 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
14170 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
14180 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
14190 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
141a0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63  );..}.../* Rejec
141b0 74 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65  t PINs which are
141c0 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69   too short */..i
141d0 66 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20  f (pin_len < 5) 
141e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
141f0 5f 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69  _PRINTF("Rejecti
14200 6e 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20  ng PIN which is 
14210 74 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74  too short (lengt
14220 68 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65  h = %lu, must be
14230 20 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69   atleast 5)", pi
14240 6e 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  n_len);....retur
14250 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
14260 42 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a  BADPIN);..}.../*
14270 20 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74   PIV authenticat
14280 69 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f  ion uses a "key_
14290 72 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78  reference" of 0x
142a0 38 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e  80 */..pcsc_iden
142b0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
142c0 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c  read_certs(slot,
142d0 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
142e0 73 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72  s);..if (num_cer
142f0 74 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69  ts > 0 && pcsc_i
14300 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
14310 4c 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70  L) {...switch (p
14320 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30  csc_identities[0
14330 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09  ].id_type) {....
14340 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
14350 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43  YPE_PIV:.....CAC
14360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14370 28 22 57 65 20 72 65 63 65 6e 74 6c 79 20 68 61  ("We recently ha
14380 64 20 61 20 50 49 56 20 63 61 72 64 2c 20 73 6f  d a PIV card, so
14390 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74   we will attempt
143a0 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65   to authenticate
143b0 20 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41   using the PIV A
143c0 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72  pplication key r
143d0 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09  eference");.....
143e0 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d  .key_reference =
143f0 20 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b   0x80;.....break
14400 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
14410 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a  ..break;...}..}.
14420 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56  ../* Issue PIN V
14430 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72  erify */..send_r
14440 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
14450 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
14460 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
14470 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
14480 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  IFY, 0x00, key_r
14490 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
144a0 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
144b0 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
144c0 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
144d0 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
144e0 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
144f0 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
14500 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64  f ((response_cod
14510 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30  e & 0x63C0) == 0
14520 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65  x63C0) {....trie
14530 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72  s_remaining = (r
14540 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30  esponse_code & 0
14550 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  xF);.....CACKEY_
14560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
14570 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66  N Verification f
14580 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20  ailed, %i tries 
14590 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65  remaining", trie
145a0 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09  s_remaining);...
145b0 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
145c0 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a  ining_p) {.....*
145d0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
145e0 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  p = tries_remain
145f0 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  ing;....}.....re
14600 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14610 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a  _E_BADPIN);...}.
14620 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f  ...if (response_
14630 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20  code == 0x6983) 
14640 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
14650 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
14660 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65  rification faile
14670 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63  d, device is loc
14680 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ked");.....retur
14690 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
146a0 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09  LOCKED);...}....
146b0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
146c0 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
146d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
146e0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
146f0 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65  ification succee
14700 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ded");...return(
14710 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
14720 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
14730 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
14740 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
14750 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14760 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
14770 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
14780 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
14790 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
147a0 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
147b0 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74  token_present(st
147c0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
147d0 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
147e0 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65  y_ret pcsc_conne
147f0 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72  ct_ret;..DWORD r
14800 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73  eader_len = 0, s
14810 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63  tate = 0, protoc
14820 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b  ol = 0, atr_len;
14830 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41  ..BYTE atr[MAX_A
14840 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20  TR_SIZE];..LONG 
14850 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72  status_ret, scar
14860 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  d_reconn_ret;...
14870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14880 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
14890 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65  ..if (slot->inte
148a0 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59  rnal) {...CACKEY
148b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
148c0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70  eturning token p
148d0 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c  resent (internal
148e0 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65   token)");....re
148f0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14900 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
14910 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  ;..}...pcsc_conn
14920 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
14930 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
14940 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  ot);..if (pcsc_c
14950 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
14960 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
14970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14980 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
14990 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
149a0 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
149b0 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
149c0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
149d0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
149e0 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
149f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14a00 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75  lling SCardStatu
14a10 73 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  s() to determine
14a20 20 63 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a   card status");.
14a30 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
14a40 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73  of(atr);..status
14a50 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
14a60 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
14a70 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
14a80 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
14a90 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
14aa0 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  atr_len);...if (
14ab0 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43  status_ret == SC
14ac0 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
14ad0 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59  NDLE) {...CACKEY
14ae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
14af0 43 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74  CardStatus() ret
14b00 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e  urned SCARD_E_IN
14b10 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61  VALID_HANDLE, ma
14b20 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72  rking is not alr
14b30 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61  eady connected a
14b40 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22  nd trying again"
14b50 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
14b60 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
14b70 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65  );....pcsc_conne
14b80 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
14b90 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
14ba0 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63  t);...if (pcsc_c
14bb0 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
14bc0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
14bd0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
14be0 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
14bf0 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
14c00 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
14c10 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
14c20 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14c30 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
14c40 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ENT);...}....CAC
14c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14c60 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53  ("Calling SCardS
14c70 74 61 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b  tatus() again");
14c80 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69  ....atr_len = si
14c90 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61  zeof(atr);...sta
14ca0 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53  tus_ret = SCardS
14cb0 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63  tatus(slot->pcsc
14cc0 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65  _card, NULL, &re
14cd0 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65  ader_len, &state
14ce0 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72  , &protocol, atr
14cf0 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a  , &atr_len);..}.
14d00 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
14d10 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
14d20 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ESS) {...cackey_
14d30 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
14d40 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74  slot);....if (st
14d50 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  atus_ret == SCAR
14d60 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
14d70 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
14d80 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
14d90 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
14da0 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
14db0 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
14dc0 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
14dd0 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
14de0 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
14df0 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
14e00 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  L_T1, &protocol)
14e10 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72  ;....if (scard_r
14e20 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  econn_ret == SCA
14e30 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
14e40 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72  ..../* Update pr
14e50 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c  otocol */.....sl
14e60 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70  ot->protocol = p
14e70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a  rotocol;....../*
14e80 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72   Re-establish tr
14e90 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74  ansaction, if it
14ea0 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a   was present */.
14eb0 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
14ec0 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
14ed0 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74  > 0) {......slot
14ee0 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
14ef0 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74  pth--;......slot
14f00 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
14f10 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a  ed_hw_lock = 1;.
14f20 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69  .....cackey_begi
14f30 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
14f40 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ot);.....}......
14f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14f60 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65  NTF("Reset succe
14f70 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e  ssful, requeryin
14f80 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f  g");.....status_
14f90 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75  ret = SCardStatu
14fa0 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  s(slot->pcsc_car
14fb0 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72  d, NULL, &reader
14fc0 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70  _len, &state, &p
14fd0 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61  rotocol, atr, &a
14fe0 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20  tr_len);.....if 
14ff0 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53  (status_ret != S
15000 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
15010 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
15020 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c  BUG_PRINTF("Stil
15030 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72  l unable to quer
15040 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72  y card status, r
15050 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
15060 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61  bsent.  SCardSta
15070 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43  tus() = %s", CAC
15080 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
15090 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
150a0 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09  tatus_ret));....
150b0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
150c0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
150d0 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ENT);.....}....}
150e0 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
150f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15100 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e  "Unable to recon
15110 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
15120 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
15130 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f  sent.  SCardReco
15140 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43  nnect() = %s", C
15150 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
15160 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
15170 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  (scard_reconn_re
15180 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  t));......return
15190 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
151a0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
151b0 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
151c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
151d0 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71  NTF("Unable to q
151e0 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73  uery card status
151f0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15200 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
15210 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20  Status() = %s", 
15220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
15230 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
15240 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a  R(status_ret));.
15250 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
15260 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
15270 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  SENT);...}..}...
15280 69 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41  if ((state & SCA
15290 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43  RD_ABSENT) == SC
152a0 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09  ARD_ABSENT) {...
152b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
152c0 4e 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73  NTF("Card is abs
152d0 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ent, returning t
152e0 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
152f0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15300 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15310 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
15320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15330 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70  eturning token p
15340 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74  resent.");...ret
15350 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
15360 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
15370 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
15380 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
15390 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
153a0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
153b0 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
153c0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
153d0 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
153e0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
153f0 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  e_t cackey_pcsc_
15400 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
15410 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  l(struct cackey_
15420 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
15430 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
15440 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75  d char *label_bu
15450 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  f, unsigned long
15460 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20   label_buf_len) 
15470 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
15480 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
15490 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61  ;..void *label_a
154a0 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74  sn1;..void *cert
154b0 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35  ificate;..int x5
154c0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63  09_read_ret;...c
154d0 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65  ertificate = ide
154e0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
154f0 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65  te;..certificate
15500 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  _len = identity-
15510 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
15520 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63  ;...if (certific
15530 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09  ate_len < 0) {..
15540 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
15550 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
15560 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
15570 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
15580 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
15590 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c  (void **) &label
155a0 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30  _asn1);..if (x50
155b0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
155c0 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
155d0 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
155e0 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f  et = x509_dn_to_
155f0 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e  string(label_asn
15600 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
15610 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c  , (char *) label
15620 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f  _buf, label_buf_
15630 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20  len, "CN");..if 
15640 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
15650 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65  = 0) {...x509_re
15660 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e  ad_ret = x509_dn
15670 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c  _to_string(label
15680 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64  _asn1, x509_read
15690 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c  _ret, (char *) l
156a0 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f  abel_buf, label_
156b0 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a  buf_len, NULL);.
156c0 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
156d0 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09  _ret <= 0) {....
156e0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
156f0 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
15700 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
15710 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
15720 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72  _MAX..if (x509_r
15730 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58  ead_ret > _POSIX
15740 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09  _SSIZE_MAX) {...
15750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15760 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72  NTF("x509_read_r
15770 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d  et exceeds maxim
15780 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e  um value, return
15790 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20  ing in failure. 
157a0 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39  (max = %li, x509
157b0 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29  _read_ret = %lu)
157c0 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
157d0 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
157e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39  igned long) x509
157f0 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72  _read_ret);....r
15800 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
15810 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
15820 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64  return(x509_read
15830 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  _ret);.}../* Ret
15840 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
15850 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
15860 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65  cackey_mutex_cre
15870 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78  ate(void **mutex
15880 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
15890 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
158a0 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
158b0 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
158c0 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
158d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
158e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
158f0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
15900 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
15910 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
15920 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
15930 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
15940 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63  d_mutex = malloc
15950 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64  (sizeof(*pthread
15960 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28  _mutex));...if (
15970 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20  !pthread_mutex) 
15980 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
15990 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
159a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
159b0 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  ory.");.....retu
159c0 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70  rn(-1);...}....p
159d0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
159e0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e  pthread_mutex_in
159f0 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  it(pthread_mutex
15a00 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70  , NULL);...if (p
15a10 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
15a20 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
15a30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
15a40 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
15a50 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
15a60 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
15a70 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
15a80 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
15a90 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65  ..*mutex = pthre
15aa0 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73  ad_mutex;..} els
15ab0 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
15ac0 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
15ad0 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
15ae0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
15af0 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28  rgs.CreateMutex(
15b00 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
15b10 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
15b20 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
15b30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b40 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
15b50 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65  CreateMutex() re
15b60 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
15b70 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
15b80 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
15b90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15ba0 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
15bb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15bc0 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
15bd0 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
15be0 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
15bf0 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
15c00 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
15c10 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
15c20 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  _lock(void *mute
15c30 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
15c40 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
15c50 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
15c60 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
15c70 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
15c80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15c90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15ca0 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
15cb0 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
15cc0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
15cd0 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
15ce0 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
15cf0 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
15d00 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
15d10 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
15d20 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64  tex_lock(pthread
15d30 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
15d40 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
15d50 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
15d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
15d70 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b  hread_mutex_lock
15d80 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
15d90 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61  r (%i).", pthrea
15da0 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72  d_retval);.....r
15db0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
15dc0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
15dd0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
15de0 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
15df0 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
15e00 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
15e10 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
15e20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
15e30 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
15e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15e50 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
15e60 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  .LockMutex() ret
15e70 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
15e80 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
15e90 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
15ea0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
15eb0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
15ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15ed0 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
15ee0 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
15ef0 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
15f00 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
15f10 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
15f20 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
15f30 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  unlock(void *mut
15f40 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
15f50 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
15f60 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
15f70 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
15f80 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
15f90 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15fa0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
15fb0 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
15fc0 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
15fd0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
15fe0 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
15ff0 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
16000 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
16010 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
16020 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
16030 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72  utex_unlock(pthr
16040 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
16050 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
16060 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
16070 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16080 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75  "pthread_mutex_u
16090 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  nlock() returned
160a0 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
160b0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
160c0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
160d0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
160e0 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
160f0 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09  UnlockMutex) {..
16100 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
16110 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  = cackey_args.Un
16120 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29  lockMutex(mutex)
16130 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
16140 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
16150 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
16160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
16170 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
16180 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
16190 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
161a0 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
161b0 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
161c0 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
161d0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
161e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
161f0 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
16200 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
16210 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43  (0);.}..static C
16220 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
16230 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
16240 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f  butes(CK_OBJECT_
16250 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73  CLASS objectclas
16260 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  s, struct cackey
16270 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
16280 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
16290 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
162a0 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  _num, CK_ULONG_P
162b0 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
162c0 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20  static CK_BBOOL 
162d0 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74  ck_true = 1;..st
162e0 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
162f0 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61  _false = 0;..sta
16300 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f  tic CK_TRUST ck_
16310 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55  trusted = CK_TRU
16320 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a  STED_DELEGATOR;.
16330 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74  .CK_ULONG numatt
16340 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63  rs = 0, retval_c
16350 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42  ount;..CK_ATTRIB
16360 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74  UTE_TYPE curr_at
16370 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54  tr_type;..CK_ATT
16380 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72  RIBUTE curr_attr
16390 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56  , *retval;..CK_V
163a0 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a  OID_PTR pValue;.
163b0 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75  .CK_ULONG ulValu
163c0 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54  eLen;..CK_OBJECT
163d0 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74  _CLASS ck_object
163e0 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54  _class;..CK_CERT
163f0 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f  IFICATE_TYPE ck_
16400 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
16410 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63  ;..CK_KEY_TYPE c
16420 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f  k_key_type;..CK_
16430 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75  UTF8CHAR ucTmpBu
16440 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f  f[1024];..SHA1Co
16450 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a  ntext sha1_ctx;.
16460 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78  .MD5_CTX md5_ctx
16470 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f  ;..uint8_t sha1_
16480 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a  hash[SHA1HashSiz
16490 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35  e];..uint8_t md5
164a0 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a  _hash[MD5HashSiz
164b0 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  e];..unsigned ch
164c0 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b  ar *certificate;
164d0 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66  ..ssize_t certif
164e0 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20  icate_len = -1, 
164f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
16500 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b  int pValue_free;
16510 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16520 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28  PRINTF("Called (
16530 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c  objectClass = %l
16540 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20  u, identity_num 
16550 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
16560 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74  ned long) object
16570 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f  class, identity_
16580 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e  num);...*pulCoun
16590 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a  t = 0;...if (obj
165a0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
165b0 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
165c0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
165d0 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20  O_PUBLIC_KEY && 
165e0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
165f0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26  KO_PRIVATE_KEY &
16600 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
16610 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
16620 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  UST) {...CACKEY_
16630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16640 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
16650 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
16660 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29  d object class")
16670 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
16680 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43  );..}.../* Get C
16690 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ert */..if (iden
166a0 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tity == NULL) {.
166b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
166c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
166d0 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
166e0 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74  ), invalid ident
166f0 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a  iy provided");..
16700 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
16710 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  .}...certificate
16720 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
16730 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
16740 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
16750 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
16760 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
16770 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d  rtificate_len ==
16780 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61   -1 || certifica
16790 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
167a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
167b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
167c0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
167d0 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64   this identity d
167e0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
167f0 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
16800 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
16810 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f  h it and will no
16820 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74  t work");....ret
16830 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
16840 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63  /* Verify that c
16850 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53  ertificate is AS
16860 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30  N.1 encoded X.50
16870 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  9 certificate */
16880 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65  ..if (x509_to_se
16890 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
168a0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
168b0 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a  n, NULL) < 0) {.
168c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
168d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
168e0 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
168f0 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72  ), the X.509 cer
16900 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
16910 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64  ted with this id
16920 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61  entity is not va
16930 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lid");....return
16940 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74  (NULL);..}...ret
16950 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a  val_count = 64;.
16960 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63  .retval = malloc
16970 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20  (retval_count * 
16980 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
16990 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74  ;...for (curr_at
169a0 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72  tr_type = 0; cur
169b0 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78  r_attr_type < 0x
169c0 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61  ce5363bf; curr_a
169d0 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  ttr_type++) {...
169e0 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79  if (curr_attr_ty
169f0 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09  pe == 0x800) {..
16a00 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ..curr_attr_type
16a10 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09   = 0xce536300;..
16a20 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65  .}....pValue_fre
16a30 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20  e = 0;...pValue 
16a40 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75  = NULL;...ulValu
16a50 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
16a60 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28   -1;....switch (
16a70 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20  curr_attr_type) 
16a80 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c  {....case CKA_CL
16a90 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASS:.....CACKEY_
16aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16ab0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
16ac0 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78  te CKA_CLASS (0x
16ad0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
16ae0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16af0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16b00 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  ...ck_object_cla
16b10 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73  ss = objectclass
16b20 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
16b30 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  &ck_object_class
16b40 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16b50 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a   = sizeof(ck_obj
16b60 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09  ect_class);.....
16b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16b80 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16b90 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
16ba0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
16bb0 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54  ng) *((CK_OBJECT
16bc0 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65  _CLASS *) pValue
16bd0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
16be0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
16bf0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
16c00 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
16c10 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45  TOKEN:.....CACKE
16c20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16c30 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16c40 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28  bute CKA_TOKEN (
16c50 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
16c60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
16c70 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
16c80 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
16c90 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
16ca0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
16cb0 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
16cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16cd0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
16ce0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
16cf0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16d00 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
16d10 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16d20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16d30 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16d40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16d50 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a  se CKA_PRIVATE:.
16d60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16d70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
16d80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
16d90 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38  A_PRIVATE (0x%08
16da0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16db0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16dc0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
16dd0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
16de0 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  != CKO_NETSCAPE_
16df0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
16e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16e10 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
16e20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16e30 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
16e40 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
16e50 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
16e60 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16e70 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
16e80 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
16e90 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
16ea0 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
16eb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16ec0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
16ed0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
16ee0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16ef0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
16f00 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
16f10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16f20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
16f30 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
16f40 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
16f50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16f60 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16f70 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16f80 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78  TRUSTED (0x%08lx
16f90 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
16fa0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
16fb0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
16fc0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
16fd0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
16fe0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
16ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17000 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17010 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17020 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
17030 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
17040 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
17050 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75  ....}......pValu
17060 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
17070 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17080 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
17090 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
170a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
170b0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
170c0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
170d0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
170e0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
170f0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17100 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17110 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17120 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
17130 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  IFIABLE:.....CAC
17140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17150 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
17160 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46  ribute CKA_MODIF
17170 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20  IABLE (0x%08lx) 
17180 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17190 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
171a0 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
171b0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
171c0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
171d0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
171e0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
171f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17200 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
17210 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
17220 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
17230 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
17240 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
17250 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17260 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17270 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
17280 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45  LABEL:.....CACKE
17290 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
172a0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
172b0 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28  bute CKA_LABEL (
172c0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
172d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
172e0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
172f0 0a 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
17300 79 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41  y->id_type == CA
17310 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
17320 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
17330 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  = identity->card
17340 2e 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09  .piv.label;.....
17350 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74  .ulValueLen = st
17360 72 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09  rlen(pValue);...
17370 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
17380 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70  ulValueLen = snp
17390 72 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75  rintf((char *) u
173a0 63 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28  cTmpBuf, sizeof(
173b0 75 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e  ucTmpBuf), "Iden
173c0 74 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73  tity #%lu", (uns
173d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
173e0 74 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09  tity_num);......
173f0 70 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75  pValue = ucTmpBu
17400 66 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56  f;.......if (ulV
17410 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f  alueLen >= sizeo
17420 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09  f(ucTmpBuf)) {..
17430 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17440 3d 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75  = 0;.......pValu
17450 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
17460 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
17470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17480 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
17490 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
174a0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
174b0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
174c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
174d0 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09  ase CKA_VALUE:..
174e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
174f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
17500 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
17510 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29  _VALUE (0x%08lx)
17520 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
17530 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17540 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69  _type);......swi
17550 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  tch (objectclass
17560 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ) {......case CK
17570 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09  O_PRIVATE_KEY:..
17580 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17590 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
175a0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
175b0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
175c0 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22   a private key."
175d0 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
175e0 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e  ......case CKO_N
175f0 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09  ETSCAPE_TRUST:..
17600 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17610 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
17620 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
17630 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
17640 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
17650 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
17660 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
17670 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  ase CKO_PUBLIC_K
17680 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65  EY:.......if (ce
17690 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
176a0 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30   0) {........x50
176b0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
176c0 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74  9_to_pubkey(cert
176d0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
176e0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
176f0 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78  e);........if (x
17700 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
17710 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61  ) { .........pVa
17720 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
17730 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
17740 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17750 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
17760 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d  .......}.......}
17770 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
17780 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52  ....case CKO_CER
17790 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09  TIFICATE:.......
177a0 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69  pValue = certifi
177b0 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61  cate;.......ulVa
177c0 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69  lueLen = certifi
177d0 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09  cate_len;.......
177e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
177f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17800 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
17810 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
17820 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17830 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17840 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17850 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53  ....case CKA_ISS
17860 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  UER:.....CACKEY_
17870 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17880 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17890 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30  te CKA_ISSUER (0
178a0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
178b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
178c0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
178d0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
178e0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
178f0 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
17900 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
17910 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
17920 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17930 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17940 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17950 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17960 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
17970 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72  e or Netscape tr
17980 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
17990 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
179a0 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
179b0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
179c0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
179d0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69  _ret = x509_to_i
179e0 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74  ssuer(certificat
179f0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
17a00 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
17a10 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
17a20 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
17a30 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
17a40 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
17a50 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17a60 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
17a70 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
17a80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17a90 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
17aa0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
17ab0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17ac0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17ad0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17ae0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52  ....case CKA_SER
17af0 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09  IAL_NUMBER:.....
17b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17b10 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
17b20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45  attribute CKA_SE
17b30 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25  RIAL_NUMBER (0x%
17b40 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17b50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17b60 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17b70 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17b80 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
17b90 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
17ba0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
17bb0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
17bc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17bd0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
17be0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
17bf0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
17c00 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
17c10 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
17c20 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
17c30 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
17c40 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
17c50 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
17c60 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
17c70 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72  et = x509_to_ser
17c80 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
17c90 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
17ca0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
17cb0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
17cc0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
17cd0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
17ce0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
17cf0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17d00 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
17d10 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
17d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17d30 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17d40 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
17d50 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17d60 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17d70 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17d80 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42  ....case CKA_SUB
17d90 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  JECT:.....CACKEY
17da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17db0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17dc0 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20  ute CKA_SUBJECT 
17dd0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17de0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17df0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17e00 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17e10 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
17e20 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
17e30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17e40 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17e50 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17e60 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
17e70 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22 29   a certificate")
17e80 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
17e90 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
17ea0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
17eb0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
17ec0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
17ed0 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
17ee0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
17ef0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
17f00 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
17f10 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
17f20 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
17f30 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
17f40 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
17f50 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
17f60 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
17f70 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17f80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17f90 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
17fa0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
17fb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17fc0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17fd0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17fe0 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59  A_ID:.....CACKEY
17ff0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18000 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18010 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30  ute CKA_ID (0x%0
18020 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18030 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18040 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18050 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18060 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18070 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18090 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
180a0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
180b0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
180c0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
180d0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
180e0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63  k;.....}......uc
180f0 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64  TmpBuf[0] = ((id
18100 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20  entity_num + 1) 
18110 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
18120 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20  ..ucTmpBuf[1] = 
18130 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b   (identity_num +
18140 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09   1) & 0xff;.....
18150 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70  .pValue = &ucTmp
18160 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  Buf;.....ulValue
18170 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41  Len = 2;......CA
18180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18190 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
181a0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
181b0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
181c0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
181d0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
181e0 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43  ase CKA_CERTIFIC
181f0 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41  ATE_TYPE:.....CA
18200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18210 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18220 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
18230 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78  IFICATE_TYPE (0x
18240 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18250 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18260 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18270 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
18280 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
18290 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
182a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
182b0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
182c0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
182d0 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
182e0 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a  certificate.");.
182f0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18300 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
18310 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63  ly support one c
18320 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20  ertificate type 
18330 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66  */.....ck_certif
18340 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43  icate_type = CKC
18350 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61  _X_509;......pVa
18360 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66  lue = &ck_certif
18370 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09  icate_type;.....
18380 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18390 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61  eof(ck_certifica
183a0 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43  te_type);......C
183b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
183c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
183d0 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c  ng CKC_X_509 (%l
183e0 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
183f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18400 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
18410 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
18420 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18430 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18440 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18450 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45  ;....case CKA_KE
18460 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  Y_TYPE:.....CACK
18470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18480 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18490 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59  ibute CKA_KEY_TY
184a0 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  PE (0x%08lx) ...
184b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
184c0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
184d0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
184e0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
184f0 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
18500 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
18510 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
18520 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18530 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18540 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18550 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18560 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a   not a key.");..
18570 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18580 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
18590 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65  y support one ke
185a0 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  y type */.....ck
185b0 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f  _key_type = CKK_
185c0 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  RSA;......pValue
185d0 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b   = &ck_key_type;
185e0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
185f0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f  = sizeof(ck_key_
18600 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  type);......CACK
18610 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18620 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18630 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25  CKK_RSA (%lu) (%
18640 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
18650 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43  ed long) *((CK_C
18660 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
18670 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18680 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18690 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
186a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
186b0 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09  case CKA_SIGN:..
186c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
186d0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
186e0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
186f0 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20  _SIGN (0x%08lx) 
18700 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
18710 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
18720 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
18730 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18740 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
18750 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18760 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18770 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18780 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18790 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
187a0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
187b0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
187c0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
187d0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
187e0 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09  PRIVATE_KEY) {..
187f0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18800 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
18810 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18820 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
18830 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
18840 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
18850 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18860 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
18870 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
18880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18890 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
188a0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
188b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
188c0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
188d0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
188e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
188f0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18900 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18910 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f  se CKA_SIGN_RECO
18920 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  VER:.....CACKEY_
18930 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18940 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
18950 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f  te CKA_SIGN_RECO
18960 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  VER (0x%08lx) ..
18970 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
18980 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
18990 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
189a0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
189b0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
189c0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
189d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
189e0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
189f0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
18a00 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
18a10 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
18a20 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18a30 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72  }....../* We cur
18a40 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70  rently only supp
18a50 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41  ort "Sign with A
18a60 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09  ppendix" */.....
18a70 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
18a80 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
18a90 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
18aa0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
18ab0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18ac0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18ad0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
18ae0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
18af0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
18b00 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
18b10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18b20 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18b30 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18b40 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
18b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18b60 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18b70 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44   attribute CKA_D
18b80 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29  ECRYPT (0x%08lx)
18b90 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18ba0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18bb0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18bc0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
18bd0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18be0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18c00 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
18c10 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
18c20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
18c30 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
18c40 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
18c50 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
18c60 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
18c70 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20  _PRIVATE_KEY || 
18c80 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18c90 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
18ca0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18cb0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
18cc0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18cd0 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
18ce0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
18cf0 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
18d00 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
18d10 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
18d20 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
18d30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18d40 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
18d50 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
18d60 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
18d70 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
18d80 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18d90 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18da0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18db0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18dc0 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49  case CKA_SENSITI
18dd0 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  VE:.....CACKEY_D
18de0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18df0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18e00 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20  e CKA_SENSITIVE 
18e10 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18e20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18e30 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18e40 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18e50 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
18e60 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
18e70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18e80 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18e90 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
18ea0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
18eb0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
18ec0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
18ed0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18ee0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
18ef0 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
18f00 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56  E_KEY) {......pV
18f10 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
18f20 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18f30 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
18f40 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  e);.....} else {
18f50 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18f60 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75  ck_false;......u
18f70 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18f80 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09  of(ck_false);...
18f90 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
18fa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18fb0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
18fc0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
18fd0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
18fe0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
18ff0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
19000 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19010 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19020 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
19030 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
19040 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19050 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19060 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19070 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25  EXTRACTABLE (0x%
19080 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19090 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
190a0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
190b0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
190c0 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
190d0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
190e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
190f0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19100 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19110 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
19120 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
19130 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
19140 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
19150 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
19160 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
19170 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  Y) {......pValue
19180 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
19190 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
191a0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
191b0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
191c0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
191d0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
191e0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
191f0 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a  k_false);.....}.
19200 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19210 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19220 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
19230 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
19240 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
19250 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
19260 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
19270 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
19280 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
19290 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ....case CKA_MOD
192a0 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  ULUS:.....CACKEY
192b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
192c0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
192d0 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20  ute CKA_MODULUS 
192e0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
192f0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19300 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19310 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19320 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
19330 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
19340 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19350 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19360 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19370 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19380 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
19390 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
193a0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
193b0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
193c0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
193d0 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
193e0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75  t = x509_to_modu
193f0 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65 2c  lus(certificate,
19400 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19410 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
19420 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
19430 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
19440 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19450 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19460 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19470 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
19480 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
19490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
194a0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
194b0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
194c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
194d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
194e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
194f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42  ....case CKA_PUB
19500 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09  LIC_EXPONENT:...
19510 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19520 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
19530 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
19540 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20  PUBLIC_EXPONENT 
19550 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
19560 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19570 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
19580 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19590 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
195a0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
195b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
195c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
195d0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
195e0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
195f0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
19600 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
19610 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
19620 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
19630 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
19640 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
19650 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f  t = x509_to_expo
19660 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65  nent(certificate
19670 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
19680 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
19690 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
196a0 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
196b0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
196c0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
196d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
196e0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
196f0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
19700 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19710 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19720 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
19730 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
19740 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
19750 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
19760 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  ;....case CKA_TR
19770 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e  UST_DIGITAL_SIGN
19780 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43  ATURE:....case C
19790 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50  KA_TRUST_NON_REP
197a0 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73  UDIATION:....cas
197b0 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
197c0 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09  ENCIPHERMENT:...
197d0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
197e0 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e  DATA_ENCIPHERMEN
197f0 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
19800 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45  RUST_KEY_AGREEME
19810 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
19820 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53  TRUST_KEY_CERT_S
19830 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  IGN:....case CKA
19840 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a  _TRUST_CRL_SIGN:
19850 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
19860 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a  ST_SERVER_AUTH:.
19870 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
19880 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09  T_CLIENT_AUTH:..
19890 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
198a0 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09  _CODE_SIGNING:..
198b0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
198c0 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f  _EMAIL_PROTECTIO
198d0 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  N:.....CACKEY_DE
198e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
198f0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19900 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28   CKA_TRUST_... (
19910 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19920 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19930 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19940 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
19950 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75  k_trusted;.....u
19960 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
19970 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a  of(ck_trusted);.
19980 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19990 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
199a0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
199b0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
199c0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52  d long) *((CK_TR
199d0 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  UST *) pValue), 
199e0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
199f0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
19a00 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
19a10 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
19a20 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09  T_SHA1_HASH:....
19a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19a40 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
19a50 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
19a60 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30  ERT_SHA1_HASH (0
19a70 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19a80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19a90 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19aa0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
19ab0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
19ac0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
19ad0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19ae0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19af0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19b00 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
19b10 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  t a Netscape tru
19b20 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
19b30 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
19b40 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28 26  .....SHA1Reset(&
19b50 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53  sha1_ctx);.....S
19b60 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63  HA1Input(&sha1_c
19b70 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
19b80 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19b90 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c  );.....SHA1Resul
19ba0 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61  t(&sha1_ctx, sha
19bb0 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56  1_hash);......pV
19bc0 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68  alue = sha1_hash
19bd0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19be0 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68   = sizeof(sha1_h
19bf0 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ash);......CACKE
19c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19c10 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
19c20 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
19c30 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19c40 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19c50 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19c60 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41   CKA_CERT_MD5_HA
19c70 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
19c80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19c90 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19ca0 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48  e CKA_CERT_MD5_H
19cb0 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASH (0x%08lx) ..
19cc0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19cd0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19ce0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
19cf0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
19d00 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
19d10 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
19d20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19d30 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
19d40 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
19d50 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
19d60 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
19d70 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
19d80 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e  ....}......MD5In
19d90 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09  it(&md5_ctx);...
19da0 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35  ..MD5Update(&md5
19db0 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74  _ctx, certificat
19dc0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
19dd0 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61  en);.....MD5Fina
19de0 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35  l(md5_hash, &md5
19df0 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c  _ctx);......pVal
19e00 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09  ue = md5_hash;..
19e10 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19e20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29  sizeof(md5_hash)
19e30 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
19e40 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19e50 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
19e60 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
19e70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
19e80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
19e90 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a  eak;....default:
19ea0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19eb0 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  LL;.....ulValueL
19ec0 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
19ed0 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  1;.....break;...
19ee0 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f  }....if (((CK_LO
19ef0 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20  NG) ulValueLen) 
19f00 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  != ((CK_LONG) -1
19f10 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20  )) {..../* Push 
19f20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74  curr_attr onto t
19f30 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63  he stack */....c
19f40 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20  urr_attr.type = 
19f50 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
19f60 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  ...curr_attr.ulV
19f70 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
19f80 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61  eLen;.....curr_a
19f90 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  ttr.pValue = mal
19fa0 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c  loc(curr_attr.ul
19fb0 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65  ValueLen);....me
19fc0 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70  mcpy(curr_attr.p
19fd0 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63  Value, pValue, c
19fe0 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
19ff0 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56  Len);.....if (pV
1a000 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61  alue_free && pVa
1a010 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28  lue) {.....free(
1a020 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09  pValue);....}...
1a030 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e  ..if (numattrs >
1a040 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20  = retval_count) 
1a050 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72  {.....retval = r
1a060 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
1a070 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
1a080 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
1a090 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28  ...}.....memcpy(
1a0a0 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73  &retval[numattrs
1a0b0 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73  ], &curr_attr, s
1a0c0 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29  izeof(curr_attr)
1a0d0 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b  );....numattrs++
1a0e0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e  ;...}..}...if (n
1a0f0 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a  umattrs != 0) {.
1a100 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
1a110 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74   numattrs;...ret
1a120 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
1a130 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
1a140 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
1a150 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  val));..} else {
1a160 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b  ...free(retval);
1a170 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c  ....retval = NUL
1a180 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e  L;..}...*pulCoun
1a190 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09  t = numattrs;...
1a1a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a1b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
1a1c0 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e  lu objects (%p).
1a1d0 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f  ", numattrs, (vo
1a1e0 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a  id *) retval);..
1a1f0 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
1a200 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1a210 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
1a220 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61  tities(struct ca
1a230 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
1a240 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67  dentities, unsig
1a250 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
1a260 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b  ies_count) {..CK
1a270 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
1a280 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _attr;..unsigned
1a290 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74   long id_idx, at
1a2a0 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64  tr_idx;...if (id
1a2b0 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c  entities == NULL
1a2c0 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63   || identities_c
1a2d0 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72  ount == 0) {...r
1a2e0 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
1a2f0 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f  (id_idx = 0; id_
1a300 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73  idx < identities
1a310 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b  _count; id_idx++
1a320 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
1a330 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1a340 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f  ributes) {....fo
1a350 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  r (attr_idx = 0;
1a360 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e   attr_idx < iden
1a370 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a380 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
1a390 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
1a3a0 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
1a3b0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1a3c0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74  x].attributes[at
1a3d0 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66  tr_idx];......if
1a3e0 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61   (curr_attr->pVa
1a3f0 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
1a400 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1a410 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ue);.....}....}.
1a420 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  ....if (identiti
1a430 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1a440 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65  butes) {.....fre
1a450 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  e(identities[id_
1a460 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29  idx].attributes)
1a470 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  ;....}.....cacke
1a480 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 65  y_free_certs(ide
1a490 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1a4a0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31  pcsc_identity, 1
1a4b0 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66  , 1);...}..}...f
1a4c0 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b  ree(identities);
1a4d0 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .}..static unsig
1a4e0 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
1a4f0 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1a500 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
1a510 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1a520 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
1a530 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65   long num_dod_ce
1a540 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  rts) {..unsigned
1a550 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20   long cert_idx, 
1a560 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66  id_idx = 0;...if
1a570 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20   (identities == 
1a580 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
1a590 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a  (num_dod_certs *
1a5a0 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63   3);..}...for (c
1a5b0 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
1a5c0 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f  t_idx < num_dod_
1a5d0 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b  certs; cert_idx+
1a5e0 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65  +) {...identitie
1a5f0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1a600 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
1a610 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1a620 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1a630 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1a640 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54  ributes(CKO_CERT
1a650 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f  IFICATE, &extra_
1a660 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1a670 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1a680 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1a690 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a6a0 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1a6b0 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
1a6c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1a6d0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1a6e0 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1a6f0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a700 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1a710 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50  attributes(CKO_P
1a720 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72  UBLIC_KEY, &extr
1a730 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78  a_certs[cert_idx
1a740 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74  ], 0xf000 | cert
1a750 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
1a760 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a770 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69  utes_count);...i
1a780 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e  d_idx++;....iden
1a790 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1a7a0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
1a7b0 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
1a7c0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a7d0 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1a7e0 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
1a7f0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c  _NETSCAPE_TRUST,
1a800 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65   &extra_certs[ce
1a810 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20  rt_idx], 0xf000 
1a820 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  | cert_idx, &ide
1a830 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1a840 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1a850 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09  );...id_idx++;..
1a860 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64  }...return(id_id
1a870 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  x);.}..static st
1a880 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1a890 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
1a8a0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  d_identities(str
1a8b0 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
1a8c0 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
1a8d0 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29  long *ids_found)
1a8e0 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
1a8f0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1a900 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1a910 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
1a920 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1a930 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
1a940 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69   long num_ids, i
1a950 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74  d_idx, curr_id_t
1a960 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ype;..unsigned l
1a970 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e  ong num_certs, n
1a980 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65  um_dod_certs, ce
1a990 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63  rt_idx;..int inc
1a9a0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1a9b0 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
1a9c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a9d0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64  led.");...if (id
1a9e0 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29  s_found == NULL)
1a9f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1aa00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1aa10 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e    ids_found is N
1aa20 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
1aa30 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64  (NULL);..}..#ifd
1aa40 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53  ef CACKEY_CARD_S
1aa50 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52  LOT_INCLUDE_EXTR
1aa60 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65  A_CERTS..include
1aa70 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
1aa80 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67  ;.#endif...if (g
1aa90 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f  etenv("CACKEY_DO
1aaa0 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
1aab0 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
1aac0 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
1aad0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a  _certs = 1;..}..
1aae0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1aaf0 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53  KEY_NO_DOD_CERTS
1ab00 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
1ab10 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1ab20 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1ab30 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 0;..}...if (ge
1ab40 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1ab50 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1ab60 20 4e 55 4c 4c 29 20 7b 0a 09 09 6e 75 6d 5f 64   NULL) {...num_d
1ab70 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  od_certs = 0;..}
1ab80 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f   else {...num_do
1ab90 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66  d_certs = sizeof
1aba0 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20  (extra_certs) / 
1abb0 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72  sizeof(extra_cer
1abc0 74 73 5b 30 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20  ts[0]);..}...if 
1abd0 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
1abe0 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63   {...num_ids = c
1abf0 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1ac00 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20  dentities(NULL, 
1ac10 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1ac20 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21  ...if (num_ids !
1ac30 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69  = 0) {....identi
1ac40 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1ac50 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1ac60 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1ac70 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1ac80 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1ac90 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64  ntities, num_dod
1aca0 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73  _certs);...} els
1acb0 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65  e {....identitie
1acc0 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  s = NULL;...}...
1acd0 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75  .*ids_found = nu
1ace0 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e  m_ids;....return
1acf0 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d  (identities);..}
1ad00 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
1ad10 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1ad20 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
1ad30 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
1ad40 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
1ad50 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
1ad60 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d  ../* Convert num
1ad70 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20  ber of Certs to 
1ad80 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
1ad90 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  s */...num_ids =
1ada0 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45   (CKO_PRIVATE_KE
1adb0 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  Y - CKO_CERTIFIC
1adc0 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63  ATE + 1) * num_c
1add0 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63  erts;....if (inc
1ade0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1adf0 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b  ) {....num_ids +
1ae00 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  = cackey_read_do
1ae10 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c  d_identities(NUL
1ae20 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  L, num_dod_certs
1ae30 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69  );...}....identi
1ae40 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1ae50 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1ae60 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1ae70 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63  ./* Add certific
1ae80 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79  ates, public key
1ae90 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b  s, and private k
1aea0 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61  eys from the sma
1aeb0 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69  rtcard */...id_i
1aec0 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
1aed0 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
1aee0 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
1aef0 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
1af00 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
1af10 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
1af20 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
1af30 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
1af40 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
1af50 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
1af60 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1af70 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1af80 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1af90 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
1afa0 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
1afb0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1afc0 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1afd0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1afe0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1aff0 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1b000 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b010 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
1b020 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1b030 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b040 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  identity));.....
1b050 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
1b060 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1b070 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69  dentity, &pcsc_i
1b080 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1b090 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65  dx], sizeof(*ide
1b0a0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b0b0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
1b0c0 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1b0d0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b0e0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1b0f0 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ate = malloc(pcs
1b100 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1b110 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
1b120 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
1b130 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69  cpy(identities[i
1b140 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1b150 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
1b160 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
1b170 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1b180 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
1b190 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1b1a0 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
1b1b0 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64  len);......id_id
1b1c0 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  x++;....}...}...
1b1d0 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74  .if (include_ext
1b1e0 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43  ra_certs) {....C
1b1f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b200 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53  TF("Including US
1b210 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74   Government Cert
1b220 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64  ificates on hard
1b230 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09  ware slot");....
1b240 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1b250 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1b260 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c  tities + id_idx,
1b270 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1b280 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
1b290 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
1b2a0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
1b2b0 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64  erts, 1);....*id
1b2c0 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64  s_found = num_id
1b2d0 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65  s;....return(ide
1b2e0 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09  ntities);..}....
1b2f0 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a  *ids_found = 0;.
1b300 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
1b310 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1b320 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1b330 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  itialize)(CK_VOI
1b340 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29  D_PTR pInitArgs)
1b350 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   {..CK_C_INITIAL
1b360 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20  IZE_ARGS CK_PTR 
1b370 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20  args;..uint32_t 
1b380 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f  idx, highest_slo
1b390 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e  t;..int mutex_in
1b3a0 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  it_ret;...CACKEY
1b3b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1b3c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1b3d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b3e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b3f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b400 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69  or.  Already ini
1b410 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1b420 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1b430 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54  OKI_ALREADY_INIT
1b440 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1b450 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20  f (pInitArgs != 
1b460 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d  NULL) {...args =
1b470 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65   pInitArgs;...me
1b480 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67  mcpy(&cackey_arg
1b490 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28  s, args, sizeof(
1b4a0 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a  cackey_args));..
1b4b0 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61  ..if (args->Crea
1b4c0 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  teMutex == NULL 
1b4d0 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79  || args->Destroy
1b4e0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1b4f0 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78   args->LockMutex
1b500 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
1b510 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d  ->UnlockMutex ==
1b520 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
1b530 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65  args->CreateMute
1b540 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1b550 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  s->DestroyMutex 
1b560 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1b570 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55  >LockMutex != NU
1b580 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f  LL || args->Unlo
1b590 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29  ckMutex != NULL)
1b5a0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
1b5b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b5c0 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74  r. Some, but not
1b5d0 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70   All threading p
1b5e0 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
1b5f0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
1b600 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1b610 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  _BAD);....}...}.
1b620 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
1b630 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75  ey_args.CreateMu
1b640 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
1b650 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f  ckey_args.Destro
1b660 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  yMutex = NULL;..
1b670 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63  .cackey_args.Loc
1b680 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1b690 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  .cackey_args.Unl
1b6a0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1b6b0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66  ...cackey_args.f
1b6c0 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66  lags = 0;..}...f
1b6d0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1b6e0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1b6f0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1b700 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1b710 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1b720 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  ) {...cackey_ses
1b730 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
1b740 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20  e = 0;..}...for 
1b750 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1b760 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1b770 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1b780 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1b790 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63  ; idx++) {...cac
1b7a0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
1b7b0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63  ctive = 0;...cac
1b7c0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1b7d0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1b7e0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1b7f0 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1b800 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
1b810 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1b820 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
1b830 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
1b840 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b850 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  dx].slot_reset =
1b860 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1b870 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c  ts[idx].token_fl
1b880 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ags = 0;...cacke
1b890 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
1b8a0 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  el = NULL;...cac
1b8b0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1b8c0 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a  nternal = 0;..}.
1b8d0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1b8e0 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45  CKEY_NO_EXTRA_CE
1b8f0 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  RTS") != NULL) {
1b900 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b910 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f  PRINTF("Asked no
1b920 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44  t to include DoD
1b930 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b   certificates");
1b940 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67  ..} else {...hig
1b950 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a  hest_slot = (siz
1b960 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1b970 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b980 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31  y_slots[0])) - 1
1b990 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1b9a0 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64  G_PRINTF("Includ
1b9b0 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e  ing DoD certs in
1b9c0 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73   slot %lu", (uns
1b9d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68  igned long) high
1b9e0 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61  est_slot);....ca
1b9f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1ba00 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20  st_slot].active 
1ba10 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
1ba20 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1ba30 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a  ].internal = 1;.
1ba40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1ba50 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62  ighest_slot].lab
1ba60 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  el = (unsigned c
1ba70 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65 72  har *) "US Gover
1ba80 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74  nment Certificat
1ba90 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  es";...cackey_sl
1baa0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1bab0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1bac0 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b  "CACKey";...cack
1bad0 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1bae0 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  _slot].token_fla
1baf0 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63  gs = 0;..}...cac
1bb00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20  key_initialized 
1bb10 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  = 1;...if (!cack
1bb20 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29  ey_biglock_init)
1bb30 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f   {...mutex_init_
1bb40 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  ret = cackey_mut
1bb50 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65  ex_create(&cacke
1bb60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69  y_biglock);....i
1bb70 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  f (mutex_init_re
1bb80 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
1bb90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bba0 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20  ("Error.  Mutex 
1bbb0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
1bbc0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65  ailed.");.....re
1bbd0 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f  turn(CKR_CANT_LO
1bbe0 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  CK);...}....cack
1bbf0 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20  ey_biglock_init 
1bc00 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66  = 1;..}.../* Def
1bc10 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ine a command to
1bc20 20 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f 72   prompt user for
1bc30 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65 66   a PIN */.#ifdef
1bc40 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
1bc50 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61 63  AND_DEFAULT..cac
1bc60 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1bc70 3d 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  = CACKEY_PIN_COM
1bc80 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54  MAND_DEFAULT_XST
1bc90 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  R(CACKEY_PIN_COM
1bca0 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29 3b 0a 23  MAND_DEFAULT);.#
1bcb0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 43 41 43  endif.#ifdef CAC
1bcc0 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f  KEY_PIN_COMMAND_
1bcd0 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63  XONLY_DEFAULT..c
1bce0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1bcf0 64 5f 78 6f 6e 6c 79 20 3d 20 43 41 43 4b 45 59  d_xonly = CACKEY
1bd00 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46  _PIN_COMMAND_DEF
1bd10 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59  AULT_XSTR(CACKEY
1bd20 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1bd30 4c 59 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65 6e  LY_DEFAULT);.#en
1bd40 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
1bd50 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e  ("DISPLAY") != N
1bd60 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1bd70 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 63 61  pin_command = ca
1bd80 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1bd90 5f 78 6f 6e 6c 79 3b 0a 09 7d 0a 0a 09 69 66 20  _xonly;..}...if 
1bda0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1bdb0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c  PIN_COMMAND_XONL
1bdc0 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67  Y") != NULL && g
1bdd0 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29  etenv("DISPLAY")
1bde0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   != NULL) {...ca
1bdf0 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1be00 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45   = getenv("CACKE
1be10 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f  Y_PIN_COMMAND_XO
1be20 4e 4c 59 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NLY");..}...if (
1be30 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1be40 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20  IN_COMMAND") != 
1be50 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1be60 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67  _pin_command = g
1be70 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1be80 4e 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a 09 7d 0a  N_COMMAND");..}.
1be90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bea0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1beb0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1bec0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1bed0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1bee0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bef0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
1bf00 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
1bf10 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
1bf20 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
1bf30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bf40 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1bf50 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
1bf60 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1bf70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bf80 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
1bf90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1bfa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1bfb0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1bfc0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1bfd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1bfe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bff0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1c000 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1c010 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1c020 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1c030 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
1c040 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1c050 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1c060 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1c070 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1c080 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1c090 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1c0a0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1c0b0 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
1c0c0 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1c0d0 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
1c0e0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1c0f0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
1c100 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1c110 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c120 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1c130 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1c140 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1c150 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c160 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1c170 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1c180 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1c190 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1c1a0 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
1c1b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1c1c0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
1c1d0 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1c1e0 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1c1f0 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
1c200 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1c210 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1c220 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  x].cached_certs,
1c230 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64   cackey_slots[id
1c240 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  x].cached_certs_
1c250 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63  count, 1);.....c
1c260 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1c270 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  .cached_certs = 
1c280 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  NULL;...}..}...c
1c290 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1c2a0 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65  nnect();...cacke
1c2b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
1c2c0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1c2d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1c2e0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1c2f0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1c300 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1c310 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1c320 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49  ON(CK_RV, C_GetI
1c330 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52  nfo)(CK_INFO_PTR
1c340 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
1c350 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
1c360 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
1c370 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
1c380 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
1c390 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44  TF8CHAR libraryD
1c3a0 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
1c3b0 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45  CACKey";...CACKE
1c3c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c3d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c3e0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
1c3f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c400 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c410 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
1c420 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c430 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1c440 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1c450 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c480 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c4a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1c4b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1c4c0 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1c4d0 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1c4e0 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1c4f0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1c500 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1c510 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
1c520 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
1c530 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
1c540 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
1c550 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d  > 8) & 0xff;...m
1c560 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
1c570 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
1c580 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1c590 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
1c5a0 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1c5b0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1c5c0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
1c5d0 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
1c5e0 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
1c5f0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30  pInfo->flags = 0
1c600 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  x00;...memset(pI
1c610 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
1c620 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
1c630 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  zeof(pInfo->libr
1c640 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29  aryDescription))
1c650 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1c660 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
1c670 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63  ion, libraryDesc
1c680 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
1c690 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
1c6a0 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  on) - 1);...pInf
1c6b0 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
1c6c0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1c6d0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1c6e0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1c6f0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
1c700 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
1c710 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
1c720 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
1c730 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c740 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c750 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1c760 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1c770 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  (CKR_OK);.}../*.
1c780 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20   * Process list 
1c790 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20  of readers, and 
1c7a0 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62  create mapping b
1c7b0 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61  etween reader na
1c7c0 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20  me and slot ID. 
1c7d0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
1c7e0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1c7f0 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42  etSlotList)(CK_B
1c800 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e  BOOL tokenPresen
1c810 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  t, CK_SLOT_ID_PT
1c820 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f  R pSlotList, CK_
1c830 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
1c840 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e  nt) {..static in
1c850 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31  t first_call = 1
1c860 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1c870 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  val;..int pcsc_c
1c880 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f  onnect_ret;..CK_
1c890 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f  ULONG count, slo
1c8a0 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72  t_count = 0, cur
1c8b0 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b  rslot, slot_idx;
1c8c0 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
1c8d0 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
1c8e0 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
1c8f0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70  ders_e;..DWORD p
1c900 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
1c910 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73  ..LONG scard_lis
1c920 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73  treaders_ret;..s
1c930 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65  ize_t curr_reade
1c940 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74  r_len;..int slot
1c950 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59  _reset;...CACKEY
1c960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1c970 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1c980 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
1c990 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c9a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c9b0 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55  . pulCount is NU
1c9c0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1c9d0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c9e0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1c9f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1ca00 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1ca10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ca20 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1ca30 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1ca40 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1ca50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1ca60 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ca70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ca80 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1ca90 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1caa0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1cab0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cac0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cad0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1cae0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1caf0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1cb00 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20  ;..}.../* Clear 
1cb10 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f  list of slots */
1cb20 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ..slot_reset = 0
1cb30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ;..if (pSlotList
1cb40 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f  ) {...if (first_
1cb50 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74  call) {....first
1cb60 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73  _call = 0;.....s
1cb70 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
1cb80 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20  .}..../* If any 
1cb90 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76  of the slots hav
1cba0 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68 65  e been reset the
1cbb0 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f  n purge all info
1cbc0 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63  rmation and chec
1cbd0 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72  k again */...for
1cbe0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
1cbf0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1cc00 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1cc10 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1cc20 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1cc30 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66  rslot++) {....if
1cc40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1cc50 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1cc60 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  l) {.....continu
1cc70 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
1cc80 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1cc90 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1cca0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
1ccb0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63  ...}.....if (cac
1ccc0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1ccd0 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ot].slot_reset) 
1cce0 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74  {.....slot_reset
1ccf0 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b   = 1;......break
1cd00 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
1cd10 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
1cd20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cd30 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20  PRINTF("Purging 
1cd40 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  all slot informa
1cd50 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20  tion.");...../* 
1cd60 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
1cd70 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
1cd80 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
1cd90 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
1cda0 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
1cdb0 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
1cdc0 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
1cdd0 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20  _all();.....for 
1cde0 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63  (currslot = 0; c
1cdf0 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1ce00 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1ce10 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1ce20 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
1ce30 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66  slot++) {.....if
1ce40 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1ce50 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1ce60 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e  l) {......contin
1ce70 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ue;.....}......i
1ce80 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1ce90 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1cea0 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72  eader) {......fr
1ceb0 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1cec0 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1ced0 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61  eader);.......ca
1cee0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1cef0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1cf00 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a   = NULL;.....}..
1cf10 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1cf20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1cf30 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65  abel) {......fre
1cf40 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  e(cackey_slots[c
1cf50 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b  urrslot].label);
1cf60 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1cf70 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
1cf80 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  bel = NULL;.....
1cf90 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  }......cackey_sl
1cfa0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1cfb0 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  tive = 0;....}..
1cfc0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09  .} else {.......
1cfd0 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
1cfe0 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ine list of read
1cff0 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e  ers */..pcsc_con
1d000 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
1d010 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
1d020 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
1d030 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
1d040 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
1d050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d060 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
1d070 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
1d080 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c  , assuming no sl
1d090 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63  ots");....slot_c
1d0a0 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  ount = 0;..} els
1d0b0 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65  e {...pcsc_reade
1d0c0 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73  rs_len = 0;....s
1d0d0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1d0e0 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1d0f0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1d100 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1d110 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
1d120 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09  eaders_len);....
1d130 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1d140 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1d150 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29  RD_F_COMM_ERROR)
1d160 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1d170 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d180 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  . SCardListReade
1d190 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  rs() returned SC
1d1a0 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1d1b0 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65  , assuming Conne
1d1c0 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77  ction to PC/SC w
1d1d0 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e  ent away. Reconn
1d1e0 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63  ecting.");.....c
1d1f0 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1d200 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b  nnect();....cack
1d210 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
1d220 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
1d230 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
1d240 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  ng SCardListRead
1d250 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09  ers() again");..
1d260 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
1d270 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
1d280 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
1d290 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
1d2a0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
1d2b0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
1d2c0 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
1d2d0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d2e0 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
1d2f0 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64  ESS && pcsc_read
1d300 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a  ers_len != 0) {.
1d310 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
1d320 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65  = malloc(pcsc_re
1d330 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70  aders_len);....p
1d340 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20  csc_readers_s = 
1d350 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09  pcsc_readers;...
1d360 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
1d370 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
1d380 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
1d390 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
1d3a0 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65  NULL, pcsc_reade
1d3b0 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  rs, &pcsc_reader
1d3c0 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73  s_len);....if (s
1d3d0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1d3e0 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
1d3f0 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70  SUCCESS) {.....p
1d400 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20  csc_readers_e = 
1d410 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70  pcsc_readers + p
1d420 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
1d430 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
1d440 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
1d450 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
1d460 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
1d470 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  ..../* Bug 59491
1d480 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
1d490 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
1d4a0 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
1d4b0 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72  94911 */.....cur
1d4c0 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73  rslot = 1;.....s
1d4d0 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  lot_count = 0;..
1d4e0 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72  ...while (pcsc_r
1d4f0 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65  eaders < pcsc_re
1d500 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09  aders_e) {......
1d510 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61  /* Find next ava
1d520 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09  ilable slot */..
1d530 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73  ....for (; currs
1d540 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1d550 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1d560 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d570 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
1d580 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  ++) {.......if (
1d590 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1d5a0 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1d5b0 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  {........break;.
1d5c0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a  ......}......}..
1d5d0 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72  .....curr_reader
1d5e0 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63  _len = strlen(pc
1d5f0 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09  sc_readers);....
1d600 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61  ...if ((pcsc_rea
1d610 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64  ders + curr_read
1d620 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72  er_len) > pcsc_r
1d630 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1d640 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1d650 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72  ......if (curr_r
1d660 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20  eader_len == 0) 
1d670 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
1d680 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
1d690 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a  currslot >= (siz
1d6a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d6b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d6c0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1d6d0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1d6e0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1d6f0 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68   more readers th
1d700 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  an slots are ava
1d710 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09  ilable!");......
1d720 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1d730 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1d740 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1d750 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63   reader: %s", pc
1d760 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09  sc_readers);....
1d770 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1d780 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1d790 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1d7a0 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b  tually being ask
1d7b0 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ed supply the sl
1d7c0 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
1d7d0 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74  /......if (pSlot
1d7e0 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66  List) {.......if
1d7f0 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
1d800 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d810 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1d820 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09  tive = 1;.......
1d830 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1d840 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
1d850 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
1d860 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1d870 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
1d880 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65  = strdup(pcsc_re
1d890 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63  aders);........c
1d8a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d8b0 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
1d8c0 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
1d8d0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1d8e0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61  ts[currslot].tra
1d8f0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
1d900 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
1d910 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1d920 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
1d930 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
1d940 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d950 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f  ots[currslot].to
1d960 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
1d970 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
1d980 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d990 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
1d9a0 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  bel = NULL;.....
1d9b0 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
1d9c0 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
1d9d0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d9e0 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  t]);.......}....
1d9f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1da00 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79  ./* Artificially
1da10 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75   increase the nu
1da20 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
1da30 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c  lots by what wil
1da40 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20  l become active 
1da50 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f  */.......slot_co
1da60 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09  unt++;......}...
1da70 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
1da80 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
1da90 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
1daa0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
1dab0 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
1dac0 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
1dad0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1dae0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1daf0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1db00 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1db10 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b   {......if (cack
1db20 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1db30 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1db40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1db50 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
1db60 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20  tive slot %lu", 
1db70 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1db80 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  currslot);......
1db90 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
1dba0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
1dbb0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
1dbc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dbd0 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
1dbe0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1dbf0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
1dc00 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
1dc10 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
1dc20 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
1dc30 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1dc40 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
1dc50 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1dc60 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
1dc70 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
1dc80 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1dc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dca0 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
1dcb0 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
1dcc0 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
1dcd0 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
1dce0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
1dcf0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
1dd00 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1dd10 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
1dd20 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1dd30 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  et);...}..}...mu
1dd40 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1dd50 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1dd60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1dd70 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1dd80 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1dd90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1dda0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1ddb0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ddc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1ddd0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1dde0 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
1ddf0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
1de00 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
1de10 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
1de20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1de30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1de40 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
1de50 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74  readers, but not
1de60 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53   storing IDs (pS
1de70 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
1de80 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1de90 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1dea0 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
1deb0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1dec0 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e  count = *pulCoun
1ded0 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  t;..if (count < 
1dee0 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  slot_count) {...
1def0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1df00 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
1df10 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
1df20 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68  ntries, but we h
1df30 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e  ave %lu entries.
1df40 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  ", count, slot_c
1df50 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  ount);....CACKEY
1df60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1df70 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
1df80 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b  FER_TOO_SMALL");
1df90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
1dfa0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
1dfb0 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  ;...}...mutex_re
1dfc0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1dfd0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1dfe0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1dff0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1e000 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e010 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e020 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1e030 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e040 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1e050 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64  R);..}...slot_id
1e060 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
1e070 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72  rslot = 0; (curr
1e080 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1e090 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1e0a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1e0b0 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c  ts[0]))); currsl
1e0c0 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  ot++) {...if (!c
1e0d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1e0e0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1e0f0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1e100 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78  ....if (slot_idx
1e110 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09   >= count) {....
1e120 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e130 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
1e140 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
1e150 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a  ntries, but we j
1e160 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69  ust tried to wri
1e170 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e  te to the %lu in
1e180 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22  dex -- ignoring"
1e190 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64  , count, slot_id
1e1a0 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  x);.....continue
1e1b0 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69  ;...}....pSlotLi
1e1c0 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63  st[slot_idx] = c
1e1d0 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f  urrslot;...slot_
1e1e0 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  idx++;..}...mute
1e1f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e200 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1e210 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e220 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1e230 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1e240 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e250 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1e260 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1e270 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1e280 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1e290 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
1e2a0 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
1e2b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e2c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1e2d0 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
1e2e0 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
1e2f0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
1e300 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
1e310 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1e320 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
1e330 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
1e340 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
1e350 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
1e360 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
1e370 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e380 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
1e390 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1e3a0 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
1e3b0 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1e3c0 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
1e3d0 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
1e3e0 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
1e3f0 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
1e400 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1e410 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
1e420 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e430 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1e440 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1e450 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e470 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1e480 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e490 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e4a0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1e4b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1e4c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1e4d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e4e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1e4f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1e500 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1e510 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1e520 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1e530 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1e540 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1e550 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1e560 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1e570 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1e580 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e590 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1e5a0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1e5b0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1e5c0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1e5d0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1e5e0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1e5f0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1e600 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e610 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e620 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e630 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e640 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e660 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1e670 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e680 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e690 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1e6a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1e6b0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1e6c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e6d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e6e0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1e6f0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1e700 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1e710 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1e720 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1e730 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e740 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e750 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1e760 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1e770 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
1e780 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
1e790 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1e7a0 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e  s[slotID].intern
1e7b0 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  al) {...pInfo->f
1e7c0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f  lags |= CKF_REMO
1e7d0 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d  VABLE_DEVICE;..}
1e7e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
1e7f0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
1e800 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1e810 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
1e820 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
1e830 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
1e840 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
1e850 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79  PRESENT;..}...by
1e860 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74  tes_to_copy = st
1e870 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74  rlen(cackey_slot
1e880 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
1e890 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a  eader);..if (siz
1e8a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1e8b0 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74  acturerID) < byt
1e8c0 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
1e8d0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
1e8e0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1e8f0 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09  nufacturerID);..
1e900 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  }..memcpy(pInfo-
1e910 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1e920 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
1e930 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
1e940 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  r, bytes_to_copy
1e950 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
1e960 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e970 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e980 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1e990 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1e9a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e9b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e9c0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1e9d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e9e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1e9f0 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74  OR);..}...memset
1ea00 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
1ea10 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
1ea20 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  zeof(pInfo->slot
1ea30 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
1ea40 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c  memcpy(pInfo->sl
1ea50 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
1ea60 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1ea70 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72  sizeof(slotDescr
1ea80 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
1ea90 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1eaa0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1eab0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1eac0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1ead0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
1eae0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
1eaf0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1eb00 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1eb10 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1eb20 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1eb30 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
1eb40 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1eb50 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
1eb60 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1eb70 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
1eb80 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
1eb90 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1eba0 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59  = 0x00;...CACKEY
1ebb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ebc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1ebd0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1ebe0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ebf0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1ec00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1ec10 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43  _GetTokenInfo)(C
1ec20 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1ec30 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f  , CK_TOKEN_INFO_
1ec40 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1ec50 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1ec60 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b   manufacturerID[
1ec70 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e  ] = "U.S. Govern
1ec80 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43  ment";..static C
1ec90 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75  K_UTF8CHAR defau
1eca0 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b  ltLabel[] = "Unk
1ecb0 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  nown Token";..st
1ecc0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1ecd0 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20   model[] = "CAC 
1ece0 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20  Token";..struct 
1ecf0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1ed00 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
1ed10 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
1ed20 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
1ed30 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f  ..ssize_t label_
1ed40 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
1ed50 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65  retval;..int use
1ed60 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a  _default_label;.
1ed70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ed90 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1eda0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1edb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1edc0 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1edd0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ede0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1edf0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ee00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ee10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ee20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ee30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ee40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ee50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ee60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ee70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1ee80 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1ee90 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1eea0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1eeb0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1eec0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1eed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eee0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1eef0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1ef00 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1ef10 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1ef20 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1ef30 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1ef40 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1ef50 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ef60 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1ef70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1ef80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1ef90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1efa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1efb0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1efc0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1efd0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1efe0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1eff0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f000 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1f010 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f020 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f030 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1f040 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1f050 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1f060 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1f070 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1f080 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1f090 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1f0a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1f0b0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1f0c0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
1f0d0 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
1f0e0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f0f0 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
1f100 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
1f110 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f120 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b  G_PRINTF("No tok
1f130 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  en is present in
1f140 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20   slotID = %lu", 
1f150 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1f160 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f170 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f180 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ....return(CKR_T
1f190 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54  OKEN_NOT_PRESENT
1f1a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1f1b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f1c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f1d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1f1e0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1f1f0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1f200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f210 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1f220 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f230 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f240 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1f250 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20  Determine token 
1f260 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69  label from certi
1f270 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73  ficates */..mems
1f280 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  et(pInfo->label,
1f290 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1f2a0 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73  fo->label));..us
1f2b0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
1f2c0 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  = 1;...if (cacke
1f2d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1f2e0 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  label == NULL) {
1f2f0 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
1f300 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1f310 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73  _certs(&cackey_s
1f320 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55  lots[slotID], NU
1f330 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
1f340 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e  ...if (pcsc_iden
1f350 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
1f360 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72  {....if (num_cer
1f370 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61  ts > 0) {.....la
1f380 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  bel_ret = cackey
1f390 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
1f3a0 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65  o_label(pcsc_ide
1f3b0 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e  ntities, pInfo->
1f3c0 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
1f3d0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09  nfo->label));...
1f3e0 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20  ..if (label_ret 
1f3f0 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f  > 0) {......use_
1f400 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1f410 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
1f420 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1f430 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  bel = malloc(siz
1f440 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1f450 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79  ));.......memcpy
1f460 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1f470 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e  otID].label, pIn
1f480 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
1f490 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1f4a0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
1f4b0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1f4c0 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
1f4d0 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
1f4e0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
1f4f0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
1f500 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73  >label, cackey_s
1f510 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1f520 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1f530 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73  ->label));....us
1f540 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
1f550 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  = 0;..}...if (us
1f560 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
1f570 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
1f580 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
1f590 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
1f5a0 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
1f5b0 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
1f5c0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1f5d0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
1f5e0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1f5f0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
1f600 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
1f610 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
1f620 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
1f630 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
1f640 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
1f650 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
1f660 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1f670 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
1f680 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
1f690 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
1f6a0 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
1f6b0 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
1f6c0 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
1f6d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
1f6e0 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
1f6f0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
1f700 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
1f710 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
1f720 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
1f730 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
1f740 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1f750 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1f760 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1f770 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1f780 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
1f790 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1f7a0 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
1f7b0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1f7c0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
1f7d0 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
1f7e0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1f7f0 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
1f800 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
1f810 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
1f820 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
1f830 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
1f840 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
1f850 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  | cackey_slots[s
1f860 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
1f870 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  gs;...if (cackey
1f880 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20  _pin_command != 
1f890 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  NULL) {...pInfo-
1f8a0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52  >flags |= CKF_PR
1f8b0 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49  OTECTED_AUTHENTI
1f8c0 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a  CATION_PATH;..}.
1f8d0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65  ..pInfo->ulMaxSe
1f8e0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69  ssionCount = (si
1f8f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1f900 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1f910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1f920 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d  ])) - 1;..pInfo-
1f930 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  >ulSessionCount 
1f940 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1f950 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1f960 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73  Info->ulMaxRwSes
1f970 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  sionCount = 0;..
1f980 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69  pInfo->ulRwSessi
1f990 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41  onCount = CK_UNA
1f9a0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1f9b0 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1f9c0 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b  MaxPinLen = 128;
1f9d0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69  ..pInfo->ulMinPi
1f9e0 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  nLen = 0;..pInfo
1f9f0 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d  ->ulTotalPublicM
1fa00 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
1fa10 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1fa20 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72  ON;..pInfo->ulFr
1fa30 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d  eePublicMemory =
1fa40 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1fa50 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1fa60 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76  nfo->ulTotalPriv
1fa70 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
1fa80 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1fa90 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1faa0 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d  ulFreePrivateMem
1fab0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1fac0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1fad0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1fae0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1faf0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1fb00 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1fb10 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1fb20 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1fb30 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46  N(CK_RV, C_WaitF
1fb40 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f  orSlotEvent)(CK_
1fb50 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f  FLAGS flags, CK_
1fb60 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
1fb70 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52  tID, CK_VOID_PTR
1fb80 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43   pReserved) {..C
1fb90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fba0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1fbb0 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21  .if (pReserved !
1fbc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1fbd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fbe0 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65  "Error. pReserve
1fbf0 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  d is not NULL.")
1fc00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fc10 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1fc20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1fc30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1fc40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fc50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1fc60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1fc70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1fc80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1fc90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1fca0 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49  ./* XXX: TODO: I
1fcb0 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e  mplement this...
1fcc0 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55   */..CACKEY_DEBU
1fcd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1fce0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1fcf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1fd00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1fd10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1fd20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1fd30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1fd40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1fd50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1fd60 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
1fd70 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f  nismList)(CK_SLO
1fd80 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1fd90 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50  MECHANISM_TYPE_P
1fda0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  TR pMechanismLis
1fdb0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1fdc0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43  pulCount) {..CAC
1fdd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fde0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1fdf0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1fe00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1fe10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fe20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1fe30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1fe40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1fe50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1fe60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
1fe70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
1fe80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fe90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fea0 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55    pulCount is NU
1feb0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1fec0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1fed0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
1fee0 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20  echanismList == 
1fef0 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f  NULL) {...*pulCo
1ff00 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b  unt = 1;....CACK
1ff10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ff20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ff30 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ff40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ff50 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70  OK);..}...if (*p
1ff60 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09  ulCount < 1) {..
1ff70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ff80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75  INTF("Error.  Bu
1ff90 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22  ffer too small."
1ffa0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ffb0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1ffc0 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e  L);..}...pMechan
1ffd0 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d  ismList[0] = CKM
1ffe0 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c  _RSA_PKCS;..*pul
1fff0 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43  Count = 1;...CAC
20000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20010 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20020 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
20030 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20040 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
20050 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20060 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  , C_GetMechanism
20070 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
20080 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48   slotID, CK_MECH
20090 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c  ANISM_TYPE type,
200a0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e   CK_MECHANISM_IN
200b0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
200c0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
200d0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
200e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
200f0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
20100 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
20110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20120 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
20130 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
20140 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
20150 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
20160 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20170 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20190 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
201a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
201b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
201c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
201d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
201e0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
201f0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
20200 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
20210 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20220 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
20230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20240 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
20250 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
20260 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
20270 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
20280 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
20290 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
202a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
202b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
202c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
202d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
202e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
202f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20310 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20320 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20330 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20340 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20350 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
20360 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
20370 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20380 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20390 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
203a0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
203b0 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
203c0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
203d0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
203e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
203f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20400 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
20410 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
20420 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
20430 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
20440 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
20450 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20460 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20470 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20480 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20490 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
204a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
204b0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
204c0 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
204d0 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65   (type) {...case
204e0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
204f0 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65  ..pInfo->ulMinKe
20500 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09  ySize = 512;....
20510 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53  pInfo->ulMaxKeyS
20520 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70  ize = 8192;....p
20530 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
20540 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59  F_HW | CKF_ENCRY
20550 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54  PT | CKF_DECRYPT
20560 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b   | CKF_SIGN | CK
20570 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65  F_VERIFY;....bre
20580 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ak;..}...CACKEY_
20590 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
205a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
205b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
205c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
205d0 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20  .}../* We don't 
205e0 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74  support this met
205f0 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  hod. */.CK_DEFIN
20600 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20610 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43  , C_InitToken)(C
20620 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
20630 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
20640 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
20650 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54   ulPinLen, CK_UT
20660 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65  F8CHAR_PTR pLabe
20670 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  l) {..CACKEY_DEB
20680 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20690 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
206a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
206b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
206c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
206d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
206e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
206f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20700 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20710 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20720 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20730 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
20740 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
20750 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
20760 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
20770 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
20780 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
20790 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  ED);.}../* We do
207a0 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
207b0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
207c0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
207d0 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29  K_RV, C_InitPIN)
207e0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
207f0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
20800 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
20810 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
20820 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nLen) {..CACKEY_
20830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20840 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
20850 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
20860 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
20870 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20880 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
20890 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
208a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
208b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
208c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
208d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
208e0 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f  rning CKR_TOKEN_
208f0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
20900 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e  (%i)", CKR_TOKEN
20910 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20920 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20930 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
20940 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  ECTED);.}../* We
20950 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
20960 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
20970 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
20980 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49  N(CK_RV, C_SetPI
20990 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  N)(CK_SESSION_HA
209a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
209b0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
209c0 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  OldPin, CK_ULONG
209d0 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b   ulOldPinLen, CK
209e0 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e  _UTF8CHAR_PTR pN
209f0 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ewPin, CK_ULONG 
20a00 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09  ulNewPinLen) {..
20a10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20a20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20a30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20a40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20a60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20a70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20a80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20a90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20aa0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
20ab0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20ac0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20ad0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20ae0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
20af0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20b00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
20b10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
20b20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
20b30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
20b40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
20b50 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b  _OpenSession)(CK
20b60 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
20b70 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c   CK_FLAGS flags,
20b80 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70   CK_VOID_PTR pAp
20b90 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f  plication, CK_NO
20ba0 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f  TIFY notify, CK_
20bb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50  SESSION_HANDLE_P
20bc0 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a  TR phSession) {.
20bd0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
20be0 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
20bf0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e  etval;..int foun
20c00 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a  d_session = 0;..
20c10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20c20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20c30 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20  ...if ((flags & 
20c40 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49  CKF_SERIAL_SESSI
20c50 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41  ON) != CKF_SERIA
20c60 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72  L_SESSION) {...r
20c70 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
20c80 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53  N_PARALLEL_NOT_S
20c90 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09  UPPORTED);..}...
20ca0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20cb0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20cd0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20ce0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20cf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20d00 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20d10 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
20d20 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
20d30 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
20d40 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
20d50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20d60 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
20d70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20d80 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
20d90 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
20da0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
20db0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
20dc0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
20dd0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
20de0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
20df0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
20e00 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
20e10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20e20 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20e30 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20e40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20e50 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
20e60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20e70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20e80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20e90 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
20ea0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
20eb0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
20ec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20ed0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
20ee0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
20ef0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
20f00 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
20f10 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
20f20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20f30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20f40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
20f50 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
20f60 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
20f70 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73  that the card is
20f80 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65   actually in the
20f90 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58   slot. */../* XX
20fa0 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  X: Check to make
20fb0 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e   sure this is in
20fc0 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65   the PKCS#11 spe
20fd0 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69  cification */..i
20fe0 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
20ff0 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
21000 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
21010 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
21020 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
21030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21040 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43  RINTF("Error.  C
21050 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e  ard not present.
21060 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f    Returning CKR_
21070 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29  DEVICE_REMOVED")
21080 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
21090 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
210a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
210b0 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52  urn(CKR_DEVICE_R
210c0 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  EMOVED);..}...fo
210d0 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20  r (idx = 1; idx 
210e0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
210f0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
21100 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21110 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
21120 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
21130 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
21140 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e  ctive) {....foun
21150 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a  d_session = 1;..
21160 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20  ...*phSession = 
21170 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  idx;.....cackey_
21180 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
21190 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63  tive = 1;....cac
211a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
211b0 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49  ].slotID = slotI
211c0 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  D;....cackey_ses
211d0 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65  sions[idx].state
211e0 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
211f0 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63  _SESSION;....cac
21200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21210 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ].flags = flags;
21220 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21230 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63  ons[idx].ulDevic
21240 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63  eError = 0;....c
21250 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21260 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e  dx].pApplication
21270 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b   = pApplication;
21280 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21290 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20  ons[idx].Notify 
212a0 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61  = notify;.....ca
212b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
212c0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  x].identities = 
212d0 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f  NULL;....cackey_
212e0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
212f0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
21300 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
21310 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61  essions[idx].sea
21320 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
21330 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21340 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63  ons[idx].sign_ac
21350 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
21360 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
21370 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  x].decrypt_activ
21380 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
21390 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
213a0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
213b0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
213c0 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ies(&cackey_slot
213d0 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b  s[slotID], &cack
213e0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
213f0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
21400 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  t);......break;.
21410 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
21420 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21430 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21440 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21450 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21460 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21480 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21490 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
214a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
214b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
214c0 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e   (!found_session
214d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
214e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
214f0 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e  ning CKR_SESSION
21500 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b  _COUNT (%i)", CK
21510 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29  R_SESSION_COUNT)
21520 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21530 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
21540 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21550 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21560 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
21570 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
21580 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
21590 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
215a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
215b0 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53  eSession)(CK_SES
215c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
215d0 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  sion) {..int mut
215e0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
215f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21600 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21610 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21620 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21630 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21640 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21650 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21660 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21670 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21680 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
21690 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
216a0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
216b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
216c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
216d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
216e0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
216f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21700 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
21710 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
21720 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21730 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21740 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21750 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21760 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21770 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21780 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21790 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
217a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
217b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
217c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
217d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
217e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
217f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21800 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
21810 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
21820 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21830 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21840 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21850 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21860 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21870 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21880 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21890 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
218a0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
218b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
218c0 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f  ve = 0;..cackey_
218d0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
218e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
218f0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
21900 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
21910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21920 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
21930 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
21940 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21950 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21960 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21970 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21980 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21990 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
219a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
219b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
219c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
219d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
219e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
219f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
21a00 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
21a10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
21a20 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21a30 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21a40 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
21a50 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  s)(CK_SLOT_ID sl
21a60 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f  otID) {..uint32_
21a70 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  t idx;..int mute
21a80 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
21a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21aa0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
21ab0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
21ac0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
21ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21ae0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
21af0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
21b00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
21b10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
21b20 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
21b30 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
21b40 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
21b50 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
21b60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
21b70 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21b80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21b90 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
21ba0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
21bb0 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
21bc0 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
21bd0 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
21be0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
21bf0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
21c00 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21c10 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
21c20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21c30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21c40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21c60 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21c70 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21c80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21c90 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21ca0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
21cb0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
21cc0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21ce0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
21cf0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
21d00 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
21d10 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
21d20 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
21d30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21d40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
21d50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
21d60 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
21d70 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
21d80 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
21d90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
21da0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
21db0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
21dc0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
21dd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21de0 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
21df0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
21e00 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
21e10 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09   != slotID) {...
21e20 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
21e30 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
21e40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21e50 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43  biglock);....C_C
21e60 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
21e70 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
21e80 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
21e90 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  glock);...}..}..
21ea0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21eb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21ec0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21ed0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21ee0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21ef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21f00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
21f10 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
21f20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21f30 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
21f40 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21f50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21f60 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21f70 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21f80 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21f90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21fa0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
21fb0 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f  SessionInfo)(CK_
21fc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
21fd0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53  Session, CK_SESS
21fe0 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  ION_INFO_PTR pIn
21ff0 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  fo) {..int mutex
22000 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
22010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22020 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22030 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
22040 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22050 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22060 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
22070 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22080 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
22090 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
220a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
220b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
220c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
220d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
220e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
220f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
22100 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
22110 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
22120 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
22130 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
22140 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
22150 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
22160 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
22170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22180 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
22190 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
221a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
221b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
221c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
221d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
221e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
221f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22200 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22210 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22220 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22230 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
22240 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22250 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22260 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22270 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22280 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22290 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
222a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
222b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
222c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
222d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
222e0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
222f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
22300 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
22310 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
22320 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73  );..}...pInfo->s
22330 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
22340 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22350 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f  ].slotID;..pInfo
22360 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79  ->state = cackey
22370 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22380 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66  on].state;..pInf
22390 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65  o->flags = cacke
223a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
223b0 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e  ion].flags;..pIn
223c0 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f  fo->ulDeviceErro
223d0 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  r = cackey_sessi
223e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c  ons[hSession].ul
223f0 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d  DeviceError;...m
22400 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22410 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22420 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22430 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
22440 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
22450 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22460 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
22470 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
22480 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22490 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
224a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
224b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
224c0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
224d0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
224e0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
224f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22500 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70  N(CK_RV, C_GetOp
22510 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
22520 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22530 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
22540 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
22550 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  State, CK_ULONG_
22560 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e  PTR pulOperation
22570 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43  StateLen) {..CAC
22580 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22590 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
225a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
225b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
225c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
225d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
225e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
225f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22600 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22610 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22620 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22630 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22640 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22650 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
22660 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22670 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22680 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22690 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
226a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
226b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
226c0 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29  tOperationState)
226d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
226e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
226f0 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74  BYTE_PTR pOperat
22700 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f  ionState, CK_ULO
22710 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  NG ulOperationSt
22720 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ateLen, CK_OBJEC
22730 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70  T_HANDLE hEncryp
22740 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45  tionKey, CK_OBJE
22750 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65  CT_HANDLE hAuthe
22760 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a  nticationKey) {.
22770 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22780 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22790 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
227a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
227b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
227c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
227d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
227e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
227f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22800 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22820 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22830 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22840 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
22850 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22860 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
22870 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
22880 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22890 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
228a0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
228b0 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53  C_Login)(CK_SESS
228c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
228d0 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50  ion, CK_USER_TYP
228e0 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55  E userType, CK_U
228f0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
22900 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
22910 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  Len) {..CK_SLOT_
22920 49 44 20 73 6c 6f 74 49 44 3b 0a 09 46 49 4c 45  ID slotID;..FILE
22930 20 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a   *pinfd;..char *
22940 70 69 6e 63 6d 64 2c 20 70 69 6e 62 75 66 5b 36  pincmd, pinbuf[6
22950 34 5d 2c 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a  4], *fgets_ret;.
22960 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
22970 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  l;..int tries_re
22980 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f  maining;..int lo
22990 67 69 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63  gin_ret;..int pc
229a0 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  lose_ret;...CACK
229b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
229c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
229d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
229e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
229f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22a00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22a10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22a20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22a30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22a40 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
22a50 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
22a60 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
22a70 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
22a80 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
22a90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
22aa0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
22ab0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22ac0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
22ad0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
22ae0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
22af0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
22b00 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75  LID);..}...if (u
22b10 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55  serType != CKU_U
22b20 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  SER) {...CACKEY_
22b30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22b40 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75  ror.  We only su
22b50 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c  pport USER mode,
22b60 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d   asked for %lu m
22b70 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  ode.", (unsigned
22b80 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29   long) userType)
22b90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55  ....return(CKR_U
22ba0 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  SER_TYPE_INVALID
22bb0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
22bc0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
22bd0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
22be0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
22bf0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
22c00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22c10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22c20 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22c30 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22c40 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22c50 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
22c60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22c70 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
22c80 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
22c90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22ca0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
22cb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22cc0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
22cd0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
22ce0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
22cf0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
22d00 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
22d10 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
22d20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22d30 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
22d40 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
22d50 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
22d60 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
22d70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
22d80 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
22d90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22da0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
22db0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
22dc0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
22dd0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
22de0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
22df0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22e00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
22e10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22e20 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
22e30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22e40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22e50 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
22e60 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
22e70 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
22e80 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
22e90 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
22ea0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22eb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22ec0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22ed0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22ee0 70 69 6e 63 6d 64 20 3d 20 63 61 63 6b 65 79 5f  pincmd = cackey_
22ef0 70 69 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09 69 66  pin_command;..if
22f00 20 28 70 69 6e 63 6d 64 20 21 3d 20 4e 55 4c 4c   (pincmd != NULL
22f10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22f20 55 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45  UG_PRINTF("CACKE
22f30 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20  Y_PIN_COMMAND = 
22f40 25 73 22 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09  %s", pincmd);...
22f50 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c  .if (pPin != NUL
22f60 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
22f70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
22f80 74 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63  tected authentic
22f90 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66  ation path in ef
22fa0 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f  fect and PIN pro
22fb0 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a  vided !?");...}.
22fc0 0a 09 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e  ...pinfd = popen
22fd0 28 70 69 6e 63 6d 64 2c 20 22 72 22 29 3b 0a 09  (pincmd, "r");..
22fe0 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55  .if (pinfd == NU
22ff0 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
23000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23010 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65  ror.  %s: Unable
23020 20 74 6f 20 72 75 6e 22 2c 20 70 69 6e 63 6d 64   to run", pincmd
23030 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  );.....cackey_mu
23040 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23050 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
23060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23070 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23080 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23090 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
230a0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
230b0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
230c0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
230d0 0a 09 09 7d 0a 0a 09 09 66 67 65 74 73 5f 72 65  ...}....fgets_re
230e0 74 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66  t = fgets(pinbuf
230f0 2c 20 73 69 7a 65 6f 66 28 70 69 6e 62 75 66 29  , sizeof(pinbuf)
23100 2c 20 70 69 6e 66 64 29 3b 0a 09 09 69 66 20 28  , pinfd);...if (
23110 66 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c  fgets_ret == NUL
23120 4c 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 30  L) {....pinbuf[0
23130 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09  ] = '\0';...}...
23140 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63  .pclose_ret = pc
23150 6c 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 09 69  lose(pinfd);...i
23160 66 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d  f (pclose_ret !=
23170 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
23180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23190 72 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64  ror.  %s: exited
231a0 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
231b0 74 61 74 75 73 20 6f 66 20 25 69 22 2c 20 70 69  tatus of %i", pi
231c0 6e 63 6d 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74  ncmd, pclose_ret
231d0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75  );.....cackey_mu
231e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
231f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
23200 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23210 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23220 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23230 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b   (%i)", (int) CK
23240 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
23250 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
23260 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
23270 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6c  ...}....if (strl
23280 65 6e 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20  en(pinbuf) < 1) 
23290 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
232a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
232b0 20 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20 6e    %s: returned n
232c0 6f 20 64 61 74 61 22 2c 20 70 69 6e 63 6d 64 29  o data", pincmd)
232d0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  ;.....cackey_mut
232e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
232f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
23300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23310 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23320 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20  R_PIN_INCORRECT 
23330 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52  (%i)", (int) CKR
23340 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
23350 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23360 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
23370 09 09 7d 0a 0a 09 09 69 66 20 28 70 69 6e 62 75  ..}....if (pinbu
23380 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29  f[strlen(pinbuf)
23390 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b   - 1] == '\n') {
233a0 0a 09 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65  ....pinbuf[strle
233b0 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d  n(pinbuf) - 1] =
233c0 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 50   '\0';...}....pP
233d0 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41  in = (CK_UTF8CHA
233e0 52 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09  R_PTR) pinbuf;..
233f0 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c  .ulPinLen = strl
23400 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a  en(pinbuf);..}..
23410 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63  .login_ret = cac
23420 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65  key_login(&cacke
23430 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
23440 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c   pPin, ulPinLen,
23450 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   &tries_remainin
23460 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72  g);..if (login_r
23470 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
23480 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b  C_S_OK) {...cack
23490 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
234a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
234b0 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  ....if (login_re
234c0 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
234d0 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09  _E_LOCKED) {....
234e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
234f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b  NTF("Error.  Tok
23500 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b  en is locked.");
23510 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
23520 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
23530 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45  flags |= CKF_USE
23540 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09  R_PIN_LOCKED;...
23550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23560 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
23570 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20   CKR_PIN_LOCKED 
23580 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52  (%i)", (int) CKR
23590 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09  _PIN_LOCKED);...
235a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
235b0 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c  _LOCKED);...} el
235c0 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  se if (login_ret
235d0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
235e0 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43  E_BADPIN) {....C
235f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23600 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61  TF("Error.  Inva
23610 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09  lid PIN.");.....
23620 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23630 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
23640 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
23650 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09  _COUNT_LOW;.....
23660 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
23670 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09  ing == 1) {.....
23680 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23690 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
236a0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
236b0 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d  _FINAL_TRY;....}
236c0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
236d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
236e0 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  ing CKR_PIN_INCO
236f0 52 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e  RRECT (%i)", (in
23700 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  t) CKR_PIN_INCOR
23710 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72  RECT);.....retur
23720 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
23730 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ECT);...}....CAC
23740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23750 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77  ("Error.  Unknow
23760 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64  n error returned
23770 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67   from cackey_log
23780 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69  in() (%i)", logi
23790 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
237a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
237b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ROR);..}...cacke
237c0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
237d0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e  token_flags &= ~
237e0 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f  (CKF_USER_PIN_LO
237f0 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  CKED | CKF_USER_
23800 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20  PIN_COUNT_LOW | 
23810 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
23820 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
23830 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09  N_FINAL_TRY);...
23840 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23850 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20  hSession].state 
23860 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55  = CKS_RO_USER_FU
23870 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78  NCTIONS;...mutex
23880 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23890 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
238a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
238b0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
238c0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
238d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
238e0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
238f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
23900 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
23910 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
23920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23930 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23940 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
23950 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
23960 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
23970 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23980 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43  _RV, C_Logout)(C
23990 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
239a0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
239b0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
239c0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
239d0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
239e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
239f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23a00 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23a10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23a20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23a30 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23a40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23a50 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23a60 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23a70 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
23a80 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
23a90 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
23aa0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
23ab0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23ac0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
23ad0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ae0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23af0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
23b00 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23b10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23b20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23b30 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
23b40 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
23b50 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
23b60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
23b70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
23b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23ba0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
23bb0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23bc0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
23bd0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
23be0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
23bf0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
23c00 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
23c10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23c20 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
23c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23c40 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
23c50 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
23c60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
23c70 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
23c80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  LID);..}...slotI
23c90 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
23ca0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
23cb0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
23cc0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
23cd0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
23ce0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
23cf0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
23d00 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
23d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23d20 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23d30 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23d40 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
23d50 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
23d60 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
23d70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23d80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
23d90 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23da0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
23db0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23dc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
23dd0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
23de0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
23df0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
23e00 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
23e10 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
23e20 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23e30 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
23e40 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23e50 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63  ERROR);..}...cac
23e60 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23e70 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
23e80 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53  KS_RO_PUBLIC_SES
23e90 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c  SION;..cackey_sl
23ea0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
23eb0 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
23ec0 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09  GIN_REQUIRED;...
23ed0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23ee0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23ef0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23f00 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
23f10 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23f20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23f30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
23f40 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23f50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23f60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23f70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23f80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23f90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
23fa0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
23fb0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
23fc0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23fd0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61  ON(CK_RV, C_Crea
23fe0 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  teObject)(CK_SES
23ff0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24000 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
24010 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
24020 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
24030 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
24040 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
24050 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
24060 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24070 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24080 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24090 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
240a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
240b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
240c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
240d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
240e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
240f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
24100 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24110 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
24120 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
24130 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
24140 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24150 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24160 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24170 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24180 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24190 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63  _RV, C_CopyObjec
241a0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
241b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
241c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
241d0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
241e0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
241f0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
24200 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
24210 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65  _HANDLE_PTR phNe
24220 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  wObject) {..CACK
24230 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24240 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24250 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24260 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24280 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24290 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
242a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
242b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
242c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
242d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
242e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
242f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24300 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24310 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24320 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24330 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24340 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24350 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24360 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73  ION(CK_RV, C_Des
24370 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  troyObject)(CK_S
24380 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24390 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
243a0 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
243b0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
243c0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
243d0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
243e0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
243f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24400 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24410 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24420 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24430 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24440 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24450 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24460 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24470 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
24480 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
24490 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
244a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
244b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
244c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
244d0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
244e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
244f0 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  RV, C_GetObjectS
24500 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ize)(CK_SESSION_
24510 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24520 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
24530 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c  E hObject, CK_UL
24540 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29  ONG_PTR pulSize)
24550 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24560 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24570 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24580 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24590 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
245a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
245b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
245c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
245d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
245e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
245f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24600 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24610 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24620 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
24630 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
24640 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24650 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
24660 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24670 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
24680 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24690 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75 74  V, C_GetAttribut
246a0 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49  eValue)(CK_SESSI
246b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
246c0 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
246d0 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
246e0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
246f0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
24700 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
24710 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
24720 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20  r_attr;..struct 
24730 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
24740 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69  *identity;..unsi
24750 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
24760 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  ty_idx, attr_idx
24770 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c  , sess_attr_idx,
24780 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d   num_ids;..int m
24790 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  utex_retval;..CK
247a0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
247b0 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  _OK;..CK_VOID_PT
247c0 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c  R pValue;..CK_UL
247d0 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  ONG ulValueLen;.
247e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
247f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24800 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24810 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24830 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24840 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24850 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24860 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24870 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24880 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
24890 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
248a0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
248b0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
248c0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
248d0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
248e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
248f0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
24900 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
24910 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24920 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24930 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24940 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20  .if (hObject == 
24950 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24960 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24970 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
24980 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  e out of range."
24990 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
249a0 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
249b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
249c0 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30  if (ulCount == 0
249d0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
249e0 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
249f0 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
24a00 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
24a10 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
24a20 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59  tely */...CACKEY
24a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24a40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
24a50 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
24a60 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
24a70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
24a80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  );..}...if (pTem
24a90 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  plate == NULL) {
24aa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24ab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24ac0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c  pTemplate is NUL
24ad0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
24ae0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
24af0 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
24b00 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20  y_idx = hObject 
24b10 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  - 1;...mutex_ret
24b20 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24b30 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24b40 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24b50 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
24b60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24b70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24b80 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
24b90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24ba0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
24bb0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
24bc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24bd0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
24be0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24bf0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24c00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
24c10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24c20 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
24c30 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
24c40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
24c50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
24c60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d  VALID);..}...num
24c70 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ids = cackey_se
24c80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24c90 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
24ca0 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  t;...if (identit
24cb0 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73  y_idx >= num_ids
24cc0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
24cd0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24ce0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
24cf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24d00 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
24d10 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
24d20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79  range.  identity
24d30 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f  _idx = %lu, num_
24d40 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e  ids = %lu.", (un
24d50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
24d60 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69  ntity_idx, (unsi
24d70 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69  gned long) num_i
24d80 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ds);....return(C
24d90 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
24da0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24db0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
24dc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24dd0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
24de0 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a  [identity_idx];.
24df0 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20  ..for (attr_idx 
24e00 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20  = 0; attr_idx < 
24e10 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  ulCount; attr_id
24e20 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74  x++) {...curr_at
24e30 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b  tr = &pTemplate[
24e40 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56  attr_idx];....pV
24e50 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
24e60 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
24e70 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43  LONG) -1;....CAC
24e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24e90 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74  ("Looking for at
24ea0 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
24eb0 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e  (identity:%lu) .
24ec0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
24ed0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e  ong) curr_attr->
24ee0 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  type, (unsigned 
24ef0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
24f00 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73  dx);....for (ses
24f10 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
24f20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
24f30 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
24f40 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
24f50 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
24f60 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
24f70 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
24f80 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
24f90 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
24fa0 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  e) {.....CACKEY_
24fb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
24fc0 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61  .. found it, pVa
24fd0 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75  lue = %p, ulValu
24fe0 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65  eLen = %lu", ide
24ff0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
25000 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
25010 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74  .pValue, identit
25020 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
25030 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
25040 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09  alueLen);.......
25050 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e  ...pValue = iden
25060 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
25070 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
25080 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61  pValue;.....ulVa
25090 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74  lueLen = identit
250a0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
250b0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
250c0 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09  alueLen;....}...
250d0 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74  }....if (curr_at
250e0 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56  tr->pValue && pV
250f0 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63  alue) {....if (c
25100 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
25110 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c  eLen >= ulValueL
25120 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79  en) {.....memcpy
25130 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
25140 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61  ue, pValue, ulVa
25150 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  lueLen);....} el
25160 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65  se {.....ulValue
25170 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
25180 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  -1;......retval 
25190 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
251a0 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d  _SMALL;....}...}
251b0 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75  ....curr_attr->u
251c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
251d0 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74  lueLen;..}...mut
251e0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
251f0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25200 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25210 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25220 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25240 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
25250 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25260 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25270 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25280 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
25290 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
252a0 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09  PE_INVALID) {...
252b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
252c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
252d0 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  KR_ATTRIBUTE_TYP
252e0 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c  E_INVALID (%i)",
252f0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
25300 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
25310 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  al == CKR_BUFFER
25320 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
25330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25340 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25350 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
25360 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29  ALL (%i)", (int)
25370 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
25380 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  e if (retval == 
25390 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
253a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
253b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
253c0 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  K (%i)", (int) r
253d0 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
253e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
253f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
25400 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
25410 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tval);..}...retu
25420 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
25430 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
25440 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74  N(CK_RV, C_SetAt
25450 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
25460 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25470 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
25480 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
25490 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
254a0 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
254b0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
254c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
254d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
254e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
254f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
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 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
25530 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
25540 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
25550 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
25560 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25570 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25580 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
25590 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
255a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
255b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
255c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
255d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
255e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
255f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
25600 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
25610 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  sInit)(CK_SESSIO
25620 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
25630 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
25640 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
25650 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
25660 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73   {..CK_SLOT_ID s
25670 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  lotID;..CK_ULONG
25680 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
25690 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
256a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
256b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
256c0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
256d0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
256e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
256f0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
25700 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
25710 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25720 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25730 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
25740 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
25750 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
25760 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25770 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
25780 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
25790 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
257a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
257b0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
257c0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
257d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
257e0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
257f0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
25800 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25810 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
25820 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25830 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25840 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25860 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
25870 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
25880 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
25890 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
258a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
258b0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
258c0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
258d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
258e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
258f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25900 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
25910 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
25920 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25930 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25940 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25950 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
25960 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25970 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
25980 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
25990 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
259a0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
259b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
259c0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72  ror.  Search alr
259d0 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a  eady active.");.
259e0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
259f0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
25a00 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
25a10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25a20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
25a30 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
25a40 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
25a50 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
25a60 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
25a70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
25a80 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
25a90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25aa0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
25ab0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
25ac0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
25ad0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
25ae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25af0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
25b00 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
25b10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
25b20 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
25b30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b40 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
25b50 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
25b60 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
25b70 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
25b80 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
25b90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
25ba0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
25bb0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
25bc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25bd0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
25be0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
25bf0 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  D].slot_reset) {
25c00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25c10 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74  PRINTF("The slot
25c20 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20   has been reset 
25c30 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f  since we last lo
25c40 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74  oked for identit
25c50 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e  ies -- rescannin
25c60 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  g");....if (cack
25c70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25c80 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
25c90 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   != NULL) {....c
25ca0 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
25cb0 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
25cc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25cd0 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
25ce0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25cf0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
25d00 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63  _count);.....cac
25d10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25d20 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25d30 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
25d40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25d50 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25d60 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d  s_count = 0;...}
25d70 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
25d80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
25d90 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el != NULL) {...
25da0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
25db0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
25dc0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
25dd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
25de0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
25df0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
25e00 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73  _reset(&cackey_s
25e10 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09  lots[slotID]);..
25e20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
25e30 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
25e40 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63   = 0;..}...if (c
25e50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25e60 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
25e70 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
25e80 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25e90 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
25ea0 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
25eb0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
25ec0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
25ed0 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
25ee0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25ef0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
25f00 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  t);..}...if (pTe
25f10 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20  mplate != NULL) 
25f20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
25f30 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
25f40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25f50 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
25f60 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e  y_count = ulCoun
25f70 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  t;....cackey_ses
25f80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25f90 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d  search_query = m
25fa0 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20  alloc(ulCount * 
25fb0 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
25fc0 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  e));.....memcpy(
25fd0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25fe0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
25ff0 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74  _query, pTemplat
26000 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  e, ulCount * siz
26010 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
26020 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20  ;....for (idx = 
26030 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  0; idx < ulCount
26040 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  ; idx++) {.....i
26050 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  f (pTemplate[idx
26060 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ].ulValueLen == 
26070 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79  0) {......cackey
26080 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26090 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
260a0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e  [idx].pValue = N
260b0 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  ULL;.......conti
260c0 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
260d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
260e0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
260f0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
26100 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d  ue = malloc(pTem
26110 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
26120 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20  ueLen);......if 
26130 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26140 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26150 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
26160 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  lue) {......memc
26170 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
26180 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26190 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
261a0 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
261b0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
261c0 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
261d0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a  alueLen);.....}.
261e0 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
261f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26200 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26210 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
26220 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 0;....cackey_s
26230 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26240 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
26250 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c   NULL;...}..} el
26260 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  se {...if (ulCou
26270 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
26280 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26290 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
262a0 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
262b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
262c0 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72 79  r.  Search query
262d0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
262e0 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f  LL, but number o
262f0 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f  f query terms no
26300 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  t specified as 0
26310 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
26320 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
26330 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  D);...}....cacke
26340 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26350 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
26360 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63  y_count = 0;...c
26370 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26380 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26390 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  query = NULL;..}
263a0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
263b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
263c0 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  rch_active = 1;.
263d0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
263e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
263f0 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a  h_curr_id = 0;..
26400 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
26410 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26420 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26430 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
26440 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
26450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
26470 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
26480 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26490 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
264a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
264b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
264c0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
264d0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
264e0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
264f0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
26500 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
26510 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f  e_attributes(CK_
26520 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b  ATTRIBUTE *a, CK
26530 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b  _ATTRIBUTE *b) {
26540 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
26550 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67  *smallbuf, *larg
26560 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d  ebuf;..size_t sm
26570 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67  allbuf_len, larg
26580 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  ebuf_len;...if (
26590 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79  a->type != b->ty
265a0 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30  pe) {...return(0
265b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
265c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
265d0 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68   ... found match
265e0 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a  ing type ...");.
265f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26600 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e  RINTBUF("    ...
26610 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d   our value:", a-
26620 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61  >pValue, a->ulVa
26630 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62  lueLen);...if (b
26640 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
26650 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26660 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
26670 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64    ... found wild
26680 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09  card match");...
26690 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
266a0 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d  .if (a->pValue =
266b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
266c0 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20  rn(0);..}.. .if 
266d0 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  (b->ulValueLen =
266e0 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  = a->ulValueLen 
266f0 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61  && memcmp(a->pVa
26700 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20  lue, b->pValue, 
26710 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d  b->ulValueLen) =
26720 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
26740 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
26750 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
26760 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
26770 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65  .switch (a->type
26780 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ) {...case CKA_M
26790 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61  ODULUS:....if (a
267a0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
267b0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
267c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
267d0 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61  .....if (a->ulVa
267e0 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61  lueLen > b->ulVa
267f0 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d  lueLen) {.....sm
26800 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c  allbuf = b->pVal
26810 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
26820 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75  _len = b->ulValu
26830 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
26840 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
26850 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
26860 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
26870 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  n;....} else {..
26880 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d  ...smallbuf = a-
26890 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
268a0 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  llbuf_len = a->u
268b0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
268c0 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56  largebuf = b->pV
268d0 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
268e0 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61  uf_len = b->ulVa
268f0 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09  lueLen;....}....
26900 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66  .for (; largebuf
26910 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66  _len != smallbuf
26920 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b  _len; largebuf++
26930 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29  ,largebuf_len--)
26940 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65   {.....if (large
26950 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09  buf[0] != 0) {..
26960 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
26970 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61  ....}.....if (la
26980 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d  rgebuf_len != sm
26990 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09  allbuf_len) {...
269a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
269b0 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72  ..if (memcmp(lar
269c0 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c  gebuf, smallbuf,
269d0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d   smallbuf_len) =
269e0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
269f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26a00 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
26a10 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74   approximate mat
26a20 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ch");......retur
26a30 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  n(1);....}.....b
26a40 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  reak;..}...retur
26a50 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  n(0);.}..CK_DEFI
26a60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26a70 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
26a80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
26a90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
26aa0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
26ab0 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  TR phObject, CK_
26ac0 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63  ULONG ulMaxObjec
26ad0 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47  tCount, CK_ULONG
26ae0 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f  _PTR pulObjectCo
26af0 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  unt) {..struct c
26b00 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
26b10 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54  curr_id;..CK_ATT
26b20 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
26b30 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72  r;..CK_ULONG cur
26b40 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f  r_id_idx, curr_o
26b50 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  ut_id_idx, curr_
26b60 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
26b70 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f  ttr_idx;..CK_ULO
26b80 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  NG matched_count
26b90 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  , prev_matched_c
26ba0 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  ount;..int mutex
26bb0 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20  _retval;.#ifdef 
26bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
26bd0 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73  RCH_SPEEDTEST..s
26be0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74  truct timeval st
26bf0 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36  art, end;..uint6
26c00 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65  4_t start_int, e
26c10 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a  nd_int;.#endif..
26c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26c40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26c50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26c70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
26c80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26c90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26ca0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26cb0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
26cc0 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  f (pulObjectCoun
26cd0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
26ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26cf0 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f  TF("Error.  pulO
26d00 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55  bjectCount is NU
26d10 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
26d20 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
26d30 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  AD);..}...if (ph
26d40 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26  Object == NULL &
26d50 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
26d60 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
26d70 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
26d80 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
26d90 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
26da0 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
26db0 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
26dc0 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  .*pulObjectCount
26dd0 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 0;....CACKEY_
26de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
26df0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
26e00 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
26e10 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
26e20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
26e30 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
26e40 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ect == NULL) {..
26e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26e60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68  INTF("Error.  ph
26e70 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22  Object is NULL."
26e80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26e90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26ea0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f  ..}...if (ulMaxO
26eb0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
26ec0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26ed0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26ee0 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72    Maximum number
26ef0 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63   of objects spec
26f00 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29  ified as zero.")
26f10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26f20 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
26f30 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
26f40 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
26f50 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
26f60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
26f70 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26f80 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
26f90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26fa0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
26fb0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
26fc0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
26fd0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
26fe0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
26ff0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
27000 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27010 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
27020 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27030 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27040 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27050 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27060 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
27070 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27080 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27090 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
270a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
270b0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
270c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
270d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
270e0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
270f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27100 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
27110 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
27120 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
27130 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27140 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
27150 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
27160 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
27170 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
27180 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27190 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
271a0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
271b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
271c0 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
271d0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
271e0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
271f0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
27200 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ED);..}..#ifdef 
27210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
27220 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
27230 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61  ettimeofday(&sta
27240 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  rt, NULL);.#endi
27250 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  f...curr_out_id_
27260 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63  idx = 0;..for (c
27270 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63  urr_id_idx = cac
27280 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27290 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
272a0 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69  rr_id; curr_id_i
272b0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
272c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
272d0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
272e0 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
272f0 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  unt; curr_id_idx
27300 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20  ++) {...curr_id 
27310 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
27320 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
27330 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f  ntities[curr_id_
27340 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  idx];....CACKEY_
27350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72  DEBUG_PRINTF("Pr
27360 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74  ocessing identit
27370 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  y:%lu", (unsigne
27380 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f  d long) curr_id_
27390 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64  idx);....matched
273a0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66  _count = 0;....f
273b0 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64  or (curr_attr_id
273c0 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72  x = 0; curr_attr
273d0 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65  _idx < cackey_se
273e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
273f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
27400 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  unt; curr_attr_i
27410 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f  dx++) {....prev_
27420 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
27430 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a  matched_count;..
27440 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
27450 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27460 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27470 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72  _query[curr_attr
27480 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45  _idx];.....CACKE
27490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
274a0 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61    Checking for a
274b0 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78 25  ttribute %s (0x%
274c0 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74  08lx) in identit
274d0 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  y:%i...", CACKEY
274e0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
274f0 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72  IBUTE_TO_STR(cur
27500 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28  r_attr->type), (
27510 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
27520 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
27530 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
27540 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  x);....CACKEY_DE
27550 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
27560 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20    Value looking 
27570 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72  for:", curr_attr
27580 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  ->pValue, curr_a
27590 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  ttr->ulValueLen)
275a0 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f  ;.....for (sess_
275b0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
275c0 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75  ss_attr_idx < cu
275d0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
275e0 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
275f0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
27600 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31  if (cackey_pkcs1
27610 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
27620 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61  utes(&curr_id->a
27630 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
27640 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61  ttr_idx], curr_a
27650 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74  ttr)) {......mat
27660 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09  ched_count++;...
27670 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
27680 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
27690 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
276a0 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
276b0 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
276c0 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
276d0 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
276e0 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
276f0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
27700 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
27710 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
27720 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
27730 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
27740 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27750 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
27760 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
27770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27780 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
27790 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
277a0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
277b0 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
277c0 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
277d0 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
277e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
277f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
27800 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
27810 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
27820 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
27830 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
27840 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
27850 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
27860 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
27870 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
27880 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
27890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
278a0 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
278b0 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
278c0 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
278d0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
278e0 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
278f0 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
27900 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27910 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
27920 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
27930 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
27940 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
27950 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
27960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27970 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
27980 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
27990 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
279a0 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
279b0 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20  id_idx;..#ifdef 
279c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
279d0 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
279e0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64  ettimeofday(&end
279f0 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f  , NULL);..start_
27a00 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f  int = (start.tv_
27a10 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b  sec * 1000000) +
27a20 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a   start.tv_usec;.
27a30 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e  .end_int = (end.
27a40 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
27a50 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b  ) + end.tv_usec;
27a60 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
27a70 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25  , "Search took %
27a80 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c  lu microseconds\
27a90 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  n", (unsigned lo
27aa0 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73  ng) (end_int - s
27ab0 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64  tart_int));.#end
27ac0 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  if...mutex_retva
27ad0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
27ae0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27af0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
27b00 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27b10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27b20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27b30 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
27b40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27b50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27b60 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
27b70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27b80 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
27b90 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74  (%i), num object
27ba0 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b  s = %lu", CKR_OK
27bb0 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  , *pulObjectCoun
27bc0 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
27bd0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
27be0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27bf0 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
27c00 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
27c10 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
27c20 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  n) {..CK_ULONG i
27c30 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
27c40 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
27c50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27c60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27c70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27c80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27ca0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27cb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27cc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27cd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27ce0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
27cf0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
27d00 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
27d10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
27d20 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
27d30 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
27d40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27d50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27d60 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
27d70 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
27d80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
27d90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
27da0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
27db0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
27dc0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
27dd0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
27de0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
27df0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27e00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27e10 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
27e20 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27e30 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
27e40 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
27e50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27e60 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
27e70 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
27e80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27e90 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
27ea0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27eb0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
27ec0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
27ed0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27ee0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27ef0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
27f00 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27f10 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27f20 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
27f30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
27f40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
27f50 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
27f60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27f70 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
27f80 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27f90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
27fa0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
27fb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  IZED);..}...cack
27fc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27fd0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
27fe0 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28  ive = 0;...for (
27ff0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
28000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28010 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
28020 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78  query_count; idx
28030 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
28040 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28050 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
28060 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
28070 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
28080 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28090 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
280a0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09  [idx].pValue);..
280b0 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  .}..}...if (cack
280c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
280d0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
280e0 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  ry) {...free(cac
280f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28100 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
28110 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ery);..}...mutex
28120 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28130 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
28140 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
28150 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
28160 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
28170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28180 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
28190 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
281a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
281b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
281c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
281d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
281e0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
281f0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
28200 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
28210 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28220 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e  _RV, C_EncryptIn
28230 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
28240 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28250 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
28260 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
28270 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
28280 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
28290 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
282a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
282b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
282c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
282d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
282e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
282f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28300 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28310 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28320 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
28330 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28340 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
28350 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
28360 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28370 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28380 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28390 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
283a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
283b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
283c0 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29  K_RV, C_Encrypt)
283d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
283e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
283f0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
28400 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
28410 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
28420 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
28430 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
28440 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
28450 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28460 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28470 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
28480 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
28490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
284a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
284b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
284c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
284d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
284e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
284f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28500 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28510 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
28520 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
28530 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
28540 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28550 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
28560 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28570 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
28580 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
28590 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64  RV, C_EncryptUpd
285a0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
285b0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
285c0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
285d0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
285e0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
285f0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
28600 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
28610 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
28620 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
28630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
28640 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
28650 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
28660 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
28670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28680 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
28690 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
286a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
286b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
286c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
286d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
286e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
286f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28700 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
28710 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28720 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
28730 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
28740 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
28750 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28760 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
28770 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
28780 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28790 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
287a0 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  pLastEncryptedPa
287b0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
287c0 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65   pulLastEncrypte
287d0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
287e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
287f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28800 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28810 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28830 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28840 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28850 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
28860 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
28870 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
28880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28890 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
288a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
288b0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
288c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
288d0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
288e0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
288f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
28900 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28910 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
28920 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
28930 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28940 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
28950 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
28960 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
28970 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
28980 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
28990 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
289a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
289b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
289c0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
289d0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
289e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
289f0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28a00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28a10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28a20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28a30 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
28a40 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
28a50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28a60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28a70 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
28a80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
28a90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
28aa0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
28ab0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
28ac0 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
28ad0 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
28ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28af0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
28b00 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
28b10 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
28b20 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
28b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
28b40 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
28b50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
28b60 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
28b70 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
28b80 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
28b90 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
28ba0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
28bb0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
28bc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28bd0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
28be0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
28bf0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
28c00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
28c10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
28c20 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28c30 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
28c40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
28c50 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28c60 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
28c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28c80 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
28c90 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
28ca0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28cb0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28cc0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28cd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
28ce0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28cf0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28d00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28d20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28d30 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
28d40 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28d50 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28d60 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
28d70 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
28d80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28d90 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
28da0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
28db0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28dc0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
28dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28de0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
28df0 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
28e00 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
28e10 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
28e20 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
28e30 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
28e40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28e50 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28e60 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
28e70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28e80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28e90 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
28ea0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28eb0 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
28ec0 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
28ed0 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
28ee0 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
28ef0 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
28f00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
28f10 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
28f20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
28f30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28f40 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
28f50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28f60 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
28f70 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
28f80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28f90 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
28fa0 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
28fb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28fc0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
28fd0 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
28fe0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
28ff0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
29000 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
29010 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70  pt_mech_parm = p
29020 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61  Mechanism->pPara
29030 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73  meter;..cackey_s
29040 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29050 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
29060 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e  armlen = pMechan
29070 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72  ism->ulParameter
29080 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  Len;..cackey_ses
29090 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
290a0 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
290b0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
290c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
290d0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
290e0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
290f0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
29100 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29110 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
29120 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29130 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29140 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
29150 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
29160 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29170 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
29180 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29190 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
291a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
291b0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
291c0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
291d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
291e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
291f0 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
29200 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
29210 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29220 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
29230 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
29240 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42  tedDataLen, CK_B
29250 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
29260 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
29270 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ataLen) {..CK_UL
29280 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  ONG datalen_upda
29290 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  te, datalen_fina
292a0 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70  l;..CK_RV decryp
292b0 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  t_ret;..int mute
292c0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
292d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
292e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
292f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29300 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29320 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29330 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29340 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29350 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29360 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
29370 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lDataLen == NULL
29380 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29390 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
293a0 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20  . pulDataLen is 
293b0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
293c0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
293d0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61  _BAD);..}...data
293e0 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75  len_update = *pu
293f0 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72  lDataLen;...decr
29400 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
29410 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69  yptUpdate(hSessi
29420 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61  on, pEncryptedDa
29430 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ta, ulEncryptedD
29440 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26  ataLen, pData, &
29450 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b  datalen_update);
29460 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
29470 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
29480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
294a0 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65  cryptUpdate() re
294b0 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
294c0 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
294d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
294e0 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66  rypt_ret);....if
294f0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
29500 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
29510 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54  SMALL) {..../* T
29520 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74  erminate decrypt
29530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
29540 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
29550 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29560 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
29570 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
29580 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
29590 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
295a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
295b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
295c0 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
295d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
295e0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
295f0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
29600 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
29610 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
29620 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29630 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29640 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
29650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29660 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
29670 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
29680 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
29690 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
296a0 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
296b0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
296c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
296d0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
296e0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
296f0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29700 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
29710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29720 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
29730 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
29740 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
29750 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
29760 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29770 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
29780 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29790 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
297a0 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
297b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
297c0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
297d0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
297e0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
297f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
29800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29810 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
29820 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
29830 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29840 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29850 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
29860 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
29870 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61  ;..}...if (pData
29880 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64  ) {...pData += d
29890 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09  atalen_update;..
298a0 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  }..datalen_final
298b0 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d   = *pulDataLen -
298c0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
298d0 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
298e0 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28   C_DecryptFinal(
298f0 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
29900 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29   &datalen_final)
29910 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
29920 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
29930 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29940 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
29950 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65  ecryptFinal() re
29960 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
29970 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
29980 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
29990 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
299a0 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
299b0 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61  );..}...*pulData
299c0 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70  Len = datalen_up
299d0 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66  date + datalen_f
299e0 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  inal;...CACKEY_D
299f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29a00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
29a10 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
29a20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
29a30 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
29a40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
29a50 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ecryptUpdate)(CK
29a60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29a70 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
29a80 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
29a90 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
29aa0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
29ab0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29ac0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
29ad0 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
29ae0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
29af0 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73   buf[16384];..ss
29b00 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43  ize_t buflen;..C
29b10 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
29b20 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
29b30 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
29b40 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
29b50 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
29b60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29b70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29b80 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29b90 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29bb0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29bc0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29bd0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29be0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29bf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
29c00 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
29c10 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
29c20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
29c30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
29c40 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
29c50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29c60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29c70 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
29c80 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
29c90 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29ca0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29cb0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
29cc0 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
29cd0 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
29ce0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
29cf0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
29d00 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
29d10 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
29d20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
29d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29d40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29d50 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
29d60 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
29d70 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
29d80 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
29d90 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
29da0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
29db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29dc0 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
29dd0 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
29de0 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
29df0 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
29e00 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
29e10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29e20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
29e30 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
29e40 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
29e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29e60 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
29e70 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
29e80 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
29e90 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
29ea0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
29eb0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
29ec0 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
29ed0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
29ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29ef0 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
29f00 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
29f10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
29f20 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
29f30 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29f40 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
29f50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29f60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29f70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
29f80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29f90 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
29fa0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
29fb0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
29fc0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
29fd0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
29fe0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
29ff0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2a000 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2a010 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2a020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a030 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a040 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
2a050 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2a060 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2a070 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2a080 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2a090 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a0a0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
2a0b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2a0c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a0d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2a0e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a0f0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2a100 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
2a110 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2a120 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2a130 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a140 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
2a150 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a160 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
2a170 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
2a180 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
2a190 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2a1a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2a1b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
2a1c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a1d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2a1e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2a1f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
2a200 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
2a210 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
2a220 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2a230 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2a240 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
2a250 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
2a260 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
2a270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a280 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2a290 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2a2a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
2a2b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
2a2c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
2a2d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a2e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a2f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a300 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2a310 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
2a320 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a330 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2a340 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2a350 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2a360 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
2a370 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
2a380 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
2a390 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
2a3a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
2a3b0 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
2a3c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2a3d0 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c  ecrypt_identity,
2a3e0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2a3f0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
2a400 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  Len, buf, sizeof
2a410 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09  (buf), 0, 1);...
2a420 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
2a430 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
2a440 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
2a450 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
2a460 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
2a470 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
2a480 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2a490 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
2a4a0 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
2a4b0 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2a4c0 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2a4d0 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2a4e0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2a4f0 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2a500 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
2a510 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2a520 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
2a530 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
2a540 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
2a550 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72  uflen) > *pulPar
2a560 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b  tLen && pPart) {
2a570 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65  ...../* Decrypte
2a580 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
2a590 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
2a5a0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2a5b0 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65  SMALL;....} else
2a5c0 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74   {.....if (pPart
2a5d0 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
2a5e0 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c  pPart, buf, bufl
2a5f0 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  en);.....}......
2a600 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75  *pulPartLen = bu
2a610 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61  flen;......retva
2a620 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d  l = CKR_OK;....}
2a630 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
2a640 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2a650 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2a660 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a670 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2a680 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2a690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a6a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2a6b0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2a6c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a6d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2a6e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2a6f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2a700 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
2a710 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
2a720 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
2a730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2a740 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2a750 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
2a760 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2a770 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2a780 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c  pLastPart, CK_UL
2a790 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50  ONG_PTR pulLastP
2a7a0 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
2a7b0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
2a7c0 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  t terminate_decr
2a7d0 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  ypt = 1;...CACKE
2a7e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a7f0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2a800 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2a810 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2a820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a830 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2a840 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2a850 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2a860 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2a870 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2a880 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2a890 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2a8a0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2a8b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2a8c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2a8d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a8e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a8f0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2a900 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2a910 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2a920 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2a930 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ID);..}...if (pu
2a940 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20  lLastPartLen == 
2a950 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2a960 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a970 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72  rror. pulLastPar
2a980 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
2a990 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2a9a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2a9b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2a9c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2a9d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a9e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2a9f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2aa00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2aa10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2aa20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2aa30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2aa40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2aa50 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2aa60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2aa70 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2aa80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2aa90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2aaa0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2aab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2aac0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2aad0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2aae0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2aaf0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2ab00 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2ab10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ab20 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2ab30 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2ab40 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2ab50 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2ab60 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2ab70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ab80 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
2ab90 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2aba0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2abb0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2abc0 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61  ED);..}...*pulLa
2abd0 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a  stPartLen = 0;..
2abe0 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d  .if (pLastPart =
2abf0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d  = NULL) {...term
2ac00 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
2ac10 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  0;..}...if (term
2ac20 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b  inate_decrypt) {
2ac30 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2ac40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2ac50 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
2ac60 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2ac70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2ac80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ac90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2aca0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2acb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2acc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2acd0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2ace0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2acf0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2ad00 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2ad10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ad20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2ad30 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2ad40 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2ad50 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2ad60 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ad70 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b  C_DigestInit)(CK
2ad80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ad90 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2ada0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2adb0 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59  anism) {..CACKEY
2adc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2add0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2ade0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2adf0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ae00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ae10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ae20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ae30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ae40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ae50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2ae60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2ae70 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2ae80 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ae90 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2aea0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2aeb0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2aec0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2aed0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2aee0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2aef0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
2af00 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2af10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2af20 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2af30 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2af40 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2af50 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
2af60 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
2af70 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2af80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2af90 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2afa0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2afb0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2afc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2afd0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2afe0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2aff0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b000 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b010 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2b020 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b030 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2b040 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b050 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2b060 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2b070 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2b080 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b090 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2b0a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2b0b0 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2b0c0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2b0d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b0e0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2b0f0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2b100 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2b110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b120 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2b130 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2b140 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b160 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b170 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b180 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b190 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b1a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b1b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b1c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b1d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b1e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b1f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b200 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b210 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b220 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b230 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b240 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2b250 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53  igestKey)(CK_SES
2b260 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b270 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
2b280 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2b290 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b2a0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2b2b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2b2c0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2b2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b2e0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2b2f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2b300 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2b310 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2b320 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2b330 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b340 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2b350 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b360 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2b370 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2b380 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2b390 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2b3a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2b3b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2b3c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2b3d0 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b  _DigestFinal)(CK
2b3e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2b3f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2b400 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
2b410 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2b420 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
2b430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b440 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b450 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b460 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b480 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b490 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b4a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b4b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b4c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b4d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b4e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b4f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b500 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b510 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b520 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b530 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b540 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b550 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b560 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2b570 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  gnInit)(CK_SESSI
2b580 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2b590 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2b5a0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2b5b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2b5c0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
2b5d0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
2b5e0 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
2b5f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b600 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b610 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b620 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b640 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2b650 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2b660 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b670 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b680 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
2b690 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
2b6a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b6b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2b6c0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
2b6d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2b6e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2b6f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
2b700 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
2b710 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
2b720 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
2b730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b740 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
2b750 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
2b760 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
2b770 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
2b780 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
2b790 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
2b7a0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2b7b0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2b7c0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2b7d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b7e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2b7f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2b800 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b820 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2b830 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2b840 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2b850 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2b860 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2b870 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b880 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2b890 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2b8a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2b8b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b8c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b8d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2b8e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b8f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b900 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2b910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b920 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2b930 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2b940 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b950 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2b960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b970 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2b980 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2b990 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b9a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2b9b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2b9c0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
2b9d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b9e0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2b9f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2ba00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ba10 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2ba20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ba30 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20  .  Sign already 
2ba40 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
2ba50 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2ba60 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
2ba70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
2ba80 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
2ba90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2baa0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
2bab0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2bac0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2bad0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2bae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2baf0 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
2bb00 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
2bb10 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
2bb20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
2bb30 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
2bb40 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
2bb50 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
2bb60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
2bb70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb80 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2bb90 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
2bba0 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
2bbb0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2bbc0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2bbd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bbe0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
2bbf0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2bc00 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
2bc10 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
2bc20 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
2bc30 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2bc40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2bc50 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a  n_buflen = 128;.
2bc60 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2bc70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bc80 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61  bufused = 0;..ca
2bc90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bca0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2bcb0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
2bcc0 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
2bcd0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bce0 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
2bcf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bd00 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
2bd10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bd20 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25  RINTF("Session %
2bd30 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  lu sign_identity
2bd40 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79   is %p (identity
2bd50 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e   #%lu)", (unsign
2bd60 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
2bd70 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63  n, (void *) &cac
2bd80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bd90 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2bda0 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e  s[hKey], (unsign
2bdb0 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a  ed long) hKey);.
2bdc0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2bdd0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bde0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
2bdf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2be00 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2be10 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
2be20 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2be30 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2be40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2be50 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2be60 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2be70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2be80 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2be90 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2bea0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2beb0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2bec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bed0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2bee0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2bef0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2bf00 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2bf10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2bf20 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53  RV, C_Sign)(CK_S
2bf30 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2bf40 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2bf50 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
2bf60 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
2bf70 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2bf80 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
2bf90 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
2bfa0 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  Len) {..unsigned
2bfb0 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e   long start_sign
2bfc0 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56  _bufused;..CK_RV
2bfd0 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20   sign_ret;..int 
2bfe0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2bff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c000 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c010 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c020 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c030 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c040 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c050 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c060 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2c070 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2c080 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2c090 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2c0a0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2c0b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c0c0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2c0d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c0e0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2c0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c100 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c110 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2c120 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c130 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c140 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
2c150 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2c160 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  d = cackey_sessi
2c170 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c180 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69  gn_bufused;...si
2c190 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55  gn_ret = C_SignU
2c1a0 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20  pdate(hSession, 
2c1b0 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e  pData, ulDataLen
2c1c0 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
2c1d0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
2c1e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c1f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2c200 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e  nUpdate() return
2c210 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
2c220 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
2c230 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
2c240 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f  t);....if (sign_
2c250 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
2c260 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
2c270 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2c280 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2c290 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2c2a0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
2c2b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2c2c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c2d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c2e0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2c2f0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2c300 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2c310 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
2c320 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2c330 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2c340 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
2c350 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2c360 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2c370 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c380 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c390 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2c3a0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2c3b0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2c3c0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2c3d0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
2c3e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c3f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c400 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2c410 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c420 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c430 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2c440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c450 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
2c460 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2c470 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2c480 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2c490 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
2c4a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c4b0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2c4c0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
2c4d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2c4e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c4f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c500 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2c510 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2c520 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c530 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c540 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2c550 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2c560 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c570 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
2c580 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2c590 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74  );..}...sign_ret
2c5a0 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68   = C_SignFinal(h
2c5b0 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74  Session, pSignat
2c5c0 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  ure, pulSignatur
2c5d0 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  eLen);..if (sign
2c5e0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2c5f0 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  {...if (sign_ret
2c600 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
2c610 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43  OO_SMALL) {....C
2c620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c630 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20  TF("SignFinal() 
2c640 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46  returned CKR_BUF
2c650 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72  FER_TOO_SMALL (r
2c660 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e  v = %lu), undoin
2c670 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
2c680 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2c690 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
2c6a0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2c6b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c6c0 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
2c6d0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
2c6e0 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
2c6f0 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  et);...}....CACK
2c700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c710 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e  "Error.  SignFin
2c720 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
2c730 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2c740 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2c750 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
2c760 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2c770 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69  t);..}...if (pSi
2c780 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29  gnature == NULL)
2c790 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c7a0 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61  G_PRINTF("pSigna
2c7b0 74 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61  ture specified a
2c7c0 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20  s NULL, undoing 
2c7d0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29  C_SignUpdate()")
2c7e0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
2c7f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c800 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
2c810 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2c820 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
2c830 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  _ret);..}...CACK
2c840 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c850 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2c860 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2c870 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2c880 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2c890 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2c8a0 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43   C_SignUpdate)(C
2c8b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2c8c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2c8d0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2c8e0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2c8f0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
2c900 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2c910 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2c920 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2c930 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2c940 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2c950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c960 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2c970 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2c980 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2c990 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2c9a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2c9b0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2c9c0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2c9d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2c9e0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2c9f0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2ca00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ca10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ca20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2ca30 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2ca40 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2ca50 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2ca60 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
2ca70 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50  t == NULL && ulP
2ca80 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2ca90 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
2caa0 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
2cab0 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e  d to sign nothin
2cac0 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
2cad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2cae0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2caf0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
2cb00 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
2cb10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2cb20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
2cb30 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2cb40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb50 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74  TF("Error. pPart
2cb60 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
2cb70 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
2cb80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cb90 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2cba0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61  );..}...if (ulPa
2cbb0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2cbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cbd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61  NTF("Error. ulPa
2cbe0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
2cbf0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
2cc00 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2cc10 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2cc20 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2cc30 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2cc40 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2cc50 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2cc60 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2cc70 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2cc80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cc90 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2cca0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ccb0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2ccc0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2ccd0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2cce0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2ccf0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2cd00 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2cd10 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2cd20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd30 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2cd40 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2cd50 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2cd60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2cd70 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2cd80 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2cd90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cda0 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
2cdb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2cdc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2cdd0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2cde0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cdf0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
2ce00 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2ce10 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2ce20 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2ce30 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  D);..}...switch 
2ce40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ce50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2ce60 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2ce70 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2ce80 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
2ce90 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09  te directly */..
2cea0 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
2ceb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cec0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
2ced0 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
2cee0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cef0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2cf00 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  en) {.....cackey
2cf10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cf20 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
2cf30 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
2cf40 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cf50 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
2cf60 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
2cf70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cf80 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
2cf90 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
2cfa0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cfb0 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
2cfc0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cfd0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
2cfe0 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
2cff0 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
2d000 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d010 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
2d020 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d030 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
2d040 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
2d050 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2d060 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d070 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
2d080 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
2d090 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
2d0a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2d0b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2d0c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d0d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d0e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d100 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2d110 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2d120 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2d130 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2d140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d150 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d160 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d170 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d180 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2d190 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d1a0 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c  _RV, C_SignFinal
2d1b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d1c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d1d0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2d1e0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2d1f0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2d200 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
2d210 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32  _BYTE sigbuf[102
2d220 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67  4];..ssize_t sig
2d230 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
2d240 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
2d250 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
2d260 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
2d270 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
2d280 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
2d290 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2d2a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d2b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d2c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d2d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d2e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d2f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d300 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d310 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d320 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d330 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2d340 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
2d350 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2d360 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d370 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
2d380 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
2d390 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d3a0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2d3b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2d3c0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2d3d0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2d3e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2d3f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2d400 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2d410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d430 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2d440 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2d450 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2d460 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2d470 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2d480 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2d490 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2d4a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2d4b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2d4c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d4d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d4e0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2d4f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d500 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2d510 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2d520 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d530 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2d540 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2d550 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d560 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2d570 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d580 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2d590 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d5a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d5b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2d5c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2d5d0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d5e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d5f0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2d600 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d610 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d620 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2d630 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d640 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
2d650 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2d660 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2d670 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d680 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
2d690 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2d6a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
2d6b0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
2d6c0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
2d6d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2d6e0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
2d6f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
2d700 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2d710 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d720 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2d730 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2d740 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
2d750 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
2d760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d770 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2d780 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2d790 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
2d7a0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
2d7b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d7c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2d7d0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2d7e0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
2d7f0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
2d800 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
2d810 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2d820 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2d830 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
2d840 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2d850 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
2d860 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2d870 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d880 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2d890 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2d8a0 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
2d8b0 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09  d to sign */....
2d8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d8d0 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73  NTF("Asking to s
2d8e0 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74  ign from identit
2d8f0 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20  y %p in session 
2d900 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63  %lu", (void *) c
2d910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d920 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
2d930 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65  entity, (unsigne
2d940 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
2d950 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20  );....sigbuflen 
2d960 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
2d970 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
2d980 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
2d990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d9a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
2d9b0 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
2d9c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d9d0 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
2d9e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d9f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
2da00 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
2da10 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
2da20 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
2da30 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2da40 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20  Signing failed. 
2da50 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75  */.....if (sigbu
2da60 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2da70 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2da80 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2da90 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2daa0 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2dab0 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65  lse if (sigbufle
2dac0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2dad0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
2dae0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2daf0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
2db00 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
2db10 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2db20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2db30 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
2db40 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
2db50 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
2db60 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
2db70 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
2db80 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
2db90 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
2dba0 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
2dbb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
2dbc0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2dbd0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
2dbe0 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
2dbf0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2dc00 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
2dc10 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
2dc20 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
2dc30 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
2dc40 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
2dc50 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2dc60 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
2dc70 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2dc80 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
2dc90 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2dca0 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
2dcb0 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
2dcc0 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
2dcd0 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
2dce0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
2dcf0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2dd00 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
2dd10 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2dd20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
2dd30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2dd40 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2dd50 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
2dd60 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
2dd70 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2dd80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2dd90 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
2dda0 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2ddb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ddc0 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
2ddd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2dde0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2ddf0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
2de00 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2de10 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2de20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2de30 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2de40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2de50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2de60 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2de70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2de80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2de90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2dea0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2deb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2dec0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
2ded0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
2dee0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
2def0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2df00 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
2df10 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
2df20 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2df30 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2df40 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2df50 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2df60 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2df70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2df80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2df90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2dfa0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2dfb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dfc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2dfd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2dfe0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2dff0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2e000 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2e010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e020 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2e030 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e040 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2e050 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e060 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2e070 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e080 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2e090 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2e0a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2e0b0 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
2e0c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2e0d0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2e0e0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2e0f0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2e100 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2e110 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
2e120 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2e130 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e140 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e150 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e160 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e190 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e1a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e1b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e1c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e1d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e1e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e1f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e200 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e210 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e220 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e230 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e240 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e250 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e260 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e270 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
2e280 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2e290 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2e2a0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2e2b0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2e2c0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2e2d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e2e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e2f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e300 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e310 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e320 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e330 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e340 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e350 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e360 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e370 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e380 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e390 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e3a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e3b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e3c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e3d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e3e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e3f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e400 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e410 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
2e420 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2e430 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2e440 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2e450 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2e460 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2e470 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2e480 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
2e490 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e4a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e4b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e4c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e4d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e4e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e4f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e500 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e510 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e520 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e530 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e540 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e550 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e560 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e570 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e580 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e590 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e5a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e5b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e5c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e5d0 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
2e5e0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2e5f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2e600 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2e610 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2e620 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2e630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2e640 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2e650 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2e660 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2e670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e680 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2e690 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2e6a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2e6b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e6c0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2e6d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2e6e0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2e6f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e700 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2e710 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e720 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2e730 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e740 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2e750 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2e760 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2e770 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
2e780 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e790 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e7a0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2e7b0 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
2e7c0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2e7d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2e7e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2e7f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2e800 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2e810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e820 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2e830 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2e840 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2e850 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e860 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e880 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2e890 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2e8a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2e8b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e8c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2e8d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e8e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2e8f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e900 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
2e910 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2e920 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e930 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2e940 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2e950 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2e960 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2e970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e980 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e990 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e9a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e9b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e9c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e9d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e9e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e9f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ea00 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ea10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ea20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ea30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ea40 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ea50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ea60 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ea70 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ea80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ea90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2eaa0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2eab0 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
2eac0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ead0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2eae0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2eaf0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2eb00 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
2eb10 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2eb20 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2eb30 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
2eb40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2eb50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2eb60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2eb70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2eb80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2eb90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2eba0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2ebb0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2ebc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2ebd0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2ebe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2ebf0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2ec00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ec10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2ec20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ec30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2ec40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ec50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2ec60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2ec70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
2ec80 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
2ec90 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2eca0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ecb0 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2ecc0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
2ecd0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2ece0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2ecf0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2ed00 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ed10 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2ed20 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ed30 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ed40 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2ed50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ed60 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ed70 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ed80 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ed90 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2eda0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2edb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2edc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2edd0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ede0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2edf0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ee00 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ee10 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ee20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ee30 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ee40 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ee50 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
2ee60 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
2ee70 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2ee80 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2ee90 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2eea0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
2eeb0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
2eec0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2eed0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2eee0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
2eef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ef00 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ef10 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ef20 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ef30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ef40 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ef50 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ef60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ef70 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ef80 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ef90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2efa0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2efb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2efc0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2efd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2efe0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2eff0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f000 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f010 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f020 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f030 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
2f040 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2f050 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f060 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2f070 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2f080 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2f090 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2f0a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2f0b0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2f0c0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2f0d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f0e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f0f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f100 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f110 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f120 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f130 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f140 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f150 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f160 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f170 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f180 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2f190 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2f1a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2f1b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f1c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f1d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f1e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2f1f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f200 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
2f210 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
2f220 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f230 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f240 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2f250 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2f260 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2f270 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2f280 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2f290 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2f2a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f2b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2f2c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2f2d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2f2e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f2f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2f300 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2f310 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2f320 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2f330 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2f340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f350 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f370 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2f380 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f390 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2f3a0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2f3b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f3c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2f3d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2f3e0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
2f3f0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2f400 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2f410 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2f420 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
2f430 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2f440 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
2f450 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2f460 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
2f470 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f480 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f490 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f4a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f4b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f4c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f4d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f4e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f4f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f500 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f510 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f520 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f530 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2f540 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2f550 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2f560 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f570 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f580 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f590 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2f5a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f5b0 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
2f5c0 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
2f5d0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2f5e0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2f5f0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2f600 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2f610 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
2f620 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2f630 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
2f640 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
2f650 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
2f660 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
2f670 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
2f680 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
2f690 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2f6a0 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
2f6b0 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
2f6c0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
2f6d0 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
2f6e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f6f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2f700 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2f710 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f730 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f740 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f750 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f760 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f770 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f790 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f7a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f7b0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f7c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f7d0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f7e0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f7f0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f800 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f810 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
2f820 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
2f830 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f840 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2f850 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2f860 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2f870 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
2f880 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2f890 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
2f8a0 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
2f8b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
2f8c0 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
2f8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f8e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f8f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2f900 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2f910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f920 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2f930 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2f940 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2f950 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2f960 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2f970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f980 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2f990 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f9a0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2f9b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f9c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2f9d0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2f9e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f9f0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2fa00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2fa10 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
2fa20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2fa30 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2fa40 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2fa50 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2fa60 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
2fa70 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
2fa80 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
2fa90 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
2faa0 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
2fab0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2fac0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2fad0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
2fae0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2faf0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
2fb00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fb10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2fb20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2fb30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2fb40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fb50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2fb60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2fb70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2fb80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2fb90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2fba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fbb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2fbc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fbd0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2fbe0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fbf0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2fc00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2fc10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2fc20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2fc30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2fc40 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
2fc50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2fc60 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2fc70 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2fc80 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2fc90 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
2fca0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
2fcb0 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
2fcc0 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
2fcd0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2fce0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
2fcf0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2fd00 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2fd10 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2fd20 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2fd30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2fd40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2fd50 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2fd60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2fd70 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2fd80 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2fd90 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fda0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2fdb0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2fdc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2fdd0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2fde0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2fdf0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2fe00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fe10 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2fe20 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2fe30 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
2fe40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2fe50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2fe60 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
2fe70 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
2fe80 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2fe90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2fea0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2feb0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2fec0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2fed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2fee0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2fef0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2ff00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2ff10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ff20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2ff30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2ff40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2ff50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2ff60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2ff70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ff80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2ff90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ffa0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2ffb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ffc0 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
2ffd0 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
2ffe0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2fff0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
30000 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
30010 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
30020 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
30030 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
30040 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
30050 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
30060 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
30070 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
30080 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
30090 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
300a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
300b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
300c0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
300d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
300e0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
300f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
30100 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30110 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30120 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
30130 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30140 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
30150 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
30160 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
30170 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
30180 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
30190 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
301a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
301b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
301c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
301d0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
301e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
301f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
30200 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
30210 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30220 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
30230 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
30240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
30250 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
30260 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
30270 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
30280 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
30290 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
302a0 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
302b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
302c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
302d0 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
302e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
302f0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
30300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30310 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
30320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30330 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30340 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
30350 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
30360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
30370 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
30380 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
30390 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
303a0 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
303b0 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
303c0 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
303d0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
303e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
303f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
30400 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
30410 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
30420 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
30430 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
30440 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
30450 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
30460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30470 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30480 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
30490 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
304a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
304b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
304c0 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
304d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
304e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
304f0 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
30500 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
30510 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
30520 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
30530 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
30540 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
30550 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
30560 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
30570 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
30580 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
30590 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
305a0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
305b0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
305c0 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
305d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
305e0 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
305f0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
30600 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
30610 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
30620 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30630 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
30640 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
30650 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
30660 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
30670 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
30680 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
30690 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
306a0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
306b0 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
306c0 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
306d0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
306e0 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
306f0 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
30700 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
30710 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30720 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
30730 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
30740 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
30750 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
30760 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
30770 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
30780 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30790 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
307a0 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
307b0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
307c0 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
307d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
307e0 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
307f0 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
30800 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
30810 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
30820 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
30830 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
30840 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
30850 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
30860 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
30870 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
30880 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
30890 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
308a0 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
308b0 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
308c0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
308d0 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
308e0 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
308f0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
30900 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30910 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
30920 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
30930 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
30940 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
30950 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
30960 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30970 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
30980 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
30990 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
309a0 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
309b0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
309c0 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
309d0 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
309e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
309f0 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
30a00 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
30a10 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
30a20 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
30a30 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
30a40 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
30a50 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
30a60 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
30a70 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
30a80 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30a90 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
30aa0 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
30ab0 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
30ac0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
30ad0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
30ae0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
30af0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
30b00 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
30b10 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
30b20 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
30b30 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
30b40 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
30b50 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
30b60 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
30b70 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
30b80 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
30b90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
30ba0 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
30bb0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30bc0 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
30bd0 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
30be0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
30bf0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
30c00 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
30c10 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
30c20 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
30c30 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
30c40 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
30c50 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
30c60 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
30c70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
30c80 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
30c90 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
30ca0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30cb0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
30cc0 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
30cd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30ce0 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
30cf0 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
30d00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
30d10 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
30d20 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30d30 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
30d40 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
30d50 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
30d60 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
30d70 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
30d80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30d90 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
30da0 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
30db0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
30dc0 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
30dd0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
30de0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
30df0 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
30e00 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
30e10 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
30e20 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
30e30 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
30e40 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
30e50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30e60 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
30e70 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
30e80 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
30e90 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
30ea0 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
30eb0 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
30ec0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
30ed0 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
30ee0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30ef0 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
30f00 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
30f10 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
30f20 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
30f30 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
30f40 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
30f50 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
30f60 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
30f70 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
30f80 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
30f90 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
30fa0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30fb0 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
30fc0 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
30fd0 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
30fe0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
30ff0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
31000 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
31010 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
31020 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
31030 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
31040 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
31050 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
31060 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
31070 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
31080 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
31090 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
310a0 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
310b0 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
310c0 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
310d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
310e0 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
310f0 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
31100 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31110 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
31120 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
31130 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
31140 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
31150 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
31160 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
31170 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
31180 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
31190 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
311a0 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
311b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
311c0 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
311d0 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
311e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
311f0 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
31200 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
31210 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31220 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
31230 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
31240 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
31250 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
31260 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
31270 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
31280 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31290 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
312a0 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
312b0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
312c0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
312d0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
312e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
312f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31300 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
31310 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
31320 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..