Hex Artifact Content

Artifact 3de1a30e4b8b7ba3baa7bde7d0b6722ee45f4e71:


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 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62  L;../* PCSC Glob
5db0: 61 6c 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74  al Handles */.st
5dc0: 61 74 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54  atic LPSCARDCONT
5dd0: 45 58 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  EXT cackey_pcsc_
5de0: 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  handle = NULL;..
5df0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
5e00: 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76  long cackey_getv
5e10: 65 72 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09  ersion(void) {..
5e20: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
5e30: 6c 6f 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35  long retval = 25
5e40: 35 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  5;..unsigned lon
5e50: 67 20 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e  g major = 0;..un
5e60: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f  signed long mino
5e70: 72 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61  r = 0;..char *ma
5e80: 6a 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a  jor_str = NULL;.
5e90: 09 63 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72  .char *minor_str
5ea0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45   = NULL;...CACKE
5eb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
5ec0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
5ed0: 28 72 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20  (retval != 255) 
5ee0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
5ef0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
5f00: 6e 67 20 30 78 25 6c 78 20 28 63 61 63 68 65 64  ng 0x%lx (cached
5f10: 29 2e 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  ).", retval);...
5f20: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
5f30: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30  ..}...retval = 0
5f40: 3b 0a 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47  ;..#ifdef PACKAG
5f50: 45 5f 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20  E_VERSION.      
5f60: 20 20 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41    major_str = PA
5f70: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09  CKAGE_VERSION;..
5f80: 69 66 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b  if (major_str) {
5f90: 0a 09 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20  ..        major 
5fa0: 3d 20 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f  = strtoul(major_
5fb0: 73 74 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c  str, &minor_str,
5fc0: 20 31 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e   10);....if (min
5fd0: 6f 72 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e  or_str) {....min
5fe0: 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e  or = strtoul(min
5ff0: 6f 72 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c  or_str + 1, NULL
6000: 2c 20 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  , 10);...}..}...
6010: 72 65 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20  retval = (major 
6020: 3c 3c 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20  << 16) | (minor 
6030: 3c 3c 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  << 8);.#endif...
6040: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6050: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
6060: 78 25 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a  x%lx", retval);.
6070: 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
6080: 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65  ;.}../* PC/SC Re
6090: 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20  lated Functions 
60a0: 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  */./*. * SYNPOSI
60b0: 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61  S. *     void ca
60c0: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
60d0: 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b  nnect_all(void);
60e0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
60f0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6100: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6110: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
6120: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6130: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
6140: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c  connects from al
6150: 6c 20 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a  l cards.. *. */.
6160: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
6170: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6180: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a  ect_all(void) {.
6190: 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a  .uint32_t idx;..
61a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
61b0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
61c0: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
61d0: 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
61e0: 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
61f0: 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
6200: 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ts[0])); idx++) 
6210: 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
6220: 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e  lots[idx].intern
6230: 61 6c 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70  al) {..../* Skip
6240: 20 69 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20   internal slots 
6250: 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  */....continue;.
6260: 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
6270: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
6280: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6290: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
62a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
62b0: 64 44 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29  dDisconnect(%lu)
62c0: 20 63 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67   called", (unsig
62d0: 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a  ned long) idx);.
62e0: 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  ....SCardDisconn
62f0: 65 63 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ect(cackey_slots
6300: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c  [idx].pcsc_card,
6310: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
6320: 44 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  D);...}....if (c
6330: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6340: 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65  .label) {....fre
6350: 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  e(cackey_slots[i
6360: 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09  dx].label);.....
6370: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6380: 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
6390: 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ..}....cackey_sl
63a0: 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61  ots[idx].pcsc_ca
63b0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
63c0: 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
63d0: 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
63e0: 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63  n_depth = 0;...c
63f0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6400: 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
6410: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a  d_hw_lock = 0;..
6420: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6430: 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ts[idx].active) 
6440: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6450: 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e  G_PRINTF("Markin
6460: 67 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c  g active slot %l
6470: 75 20 61 73 20 62 65 69 6e 67 20 72 65 73 65 74  u as being reset
6480: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
6490: 67 29 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09  g) idx);...}....
64a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
64b0: 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ].slot_reset = 1
64c0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
64d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
64e0: 72 6e 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72  rning");...retur
64f0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
6500: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
6510: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
6520: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
6530: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
6540: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
6550: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
6560: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6570: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
6580: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
6590: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
65a0: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
65b0: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
65c0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
65d0: 63 74 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74  ction connects t
65e0: 6f 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e  o the PC/SC Conn
65f0: 65 63 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61  ection Manager a
6600: 6e 64 20 75 70 64 61 74 65 73 20 74 68 65 0a 20  nd updates the. 
6610: 2a 20 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e  *     global han
6620: 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  dle.. *. */.stat
6630: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
6640: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
6650: 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20  t(void) {..LONG 
6660: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6670: 74 5f 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41  t_ret;.#ifdef HA
6680: 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43  VE_SCARDISVALIDC
6690: 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61  ONTEXT..LONG sca
66a0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a  rd_isvalid_ret;.
66b0: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
66c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
66d0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
66e0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
66f0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  e == NULL) {...c
6700: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6710: 65 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  e = malloc(sizeo
6720: 66 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f(*cackey_pcsc_h
6730: 61 6e 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63  andle));...if (c
6740: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6750: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
6760: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6770: 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c  NTF("Call to mal
6780: 6c 6f 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65  loc() failed, re
6790: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
67a0: 72 65 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  re");.....cackey
67b0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
67c0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
67d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
67e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
67f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6800: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
6810: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
6820: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
6830: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6840: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
6850: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
6860: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
6870: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
6880: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6890: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
68a0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
68b0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
68c0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
68d0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
68e0: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
68f0: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
6900: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
6910: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6920: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
6930: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6940: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6950: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6960: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
6970: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
6980: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6990: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
69a0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
69b0: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  ndle = NULL;....
69c0: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
69d0: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
69e0: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
69f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6a00: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  );...}..}..#ifde
6a10: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
6a20: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b  LIDCONTEXT..CACK
6a30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6a40: 22 53 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e  "SCardIsValidCon
6a50: 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b  text() called");
6a60: 0a 09 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  ..scard_isvalid_
6a70: 72 65 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c  ret = SCardIsVal
6a80: 69 64 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65  idContext(*cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6aa0: 09 69 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c  .if (scard_isval
6ab0: 69 64 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  id_ret != SCARD_
6ac0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
6ad0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6ae0: 54 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62  TF("Handle has b
6af0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53  ecome invalid (S
6b00: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
6b10: 78 74 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72  xt = %s/%li), tr
6b20: 79 69 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62  ying to re-estab
6b30: 6c 69 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  lish...", CACKEY
6b40: 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
6b50: 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
6b60: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20  d_isvalid_ret), 
6b70: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76  (long) scard_isv
6b80: 61 6c 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41  alid_ret);....CA
6b90: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6ba0: 46 28 22 53 43 61 72 64 45 73 74 61 62 6c 69 73  F("SCardEstablis
6bb0: 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  hContext() calle
6bc0: 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74  d");...scard_est
6bd0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53  _context_ret = S
6be0: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6bf0: 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45  text(SCARD_SCOPE
6c00: 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e  _SYSTEM, NULL, N
6c10: 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63  ULL, cackey_pcsc
6c20: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28  _handle);...if (
6c30: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6c40: 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  t_ret != SCARD_S
6c50: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43  _SUCCESS) {....C
6c60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6c70: 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72  TF("Call to SCar
6c80: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6c90: 74 20 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e  t failed (return
6ca0: 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75  ed %s/%li), retu
6cb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
6cc0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6cd0: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
6ce0: 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63  _STR(scard_est_c
6cf0: 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f  ontext_ret), (lo
6d00: 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ng) scard_est_co
6d10: 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09  ntext_ret);.....
6d20: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
6d30: 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63  _handle);....cac
6d40: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6d50: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b  = NULL;.....cack
6d60: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6d70: 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72  ect_all();.....r
6d80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6d90: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09  C_E_GENERIC);...
6da0: 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
6db0: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
6dc0: 20 68 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74   has been re-est
6dd0: 61 62 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23  ablished");..}.#
6de0: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
6df0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
6e00: 65 73 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74  essfully connect
6e10: 65 64 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74  ed to PC/SC, ret
6e20: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
6e30: 73 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  s");...return(CA
6e40: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
6e50: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
6e60: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
6e70: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
6e80: 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64  _disconnect(void
6e90: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
6ea0: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
6eb0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
6ec0: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
6ed0: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
6ee0: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
6ef0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
6f00: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
6f10: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
6f20: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6f30: 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63  nction disconnec
6f40: 74 73 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53  ts from the PC/S
6f50: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  C Connection man
6f60: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6f70: 0a 20 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62  . *     the glob
6f80: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6f90: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
6fa0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
6fb0: 64 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  disconnect(void)
6fc0: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72   {..LONG scard_r
6fd0: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  el_context_ret;.
6fe0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6ff0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
7000: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
7010: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
7020: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43  LL) {...return(C
7030: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
7040: 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c  ;..}...scard_rel
7050: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53  _context_ret = S
7060: 43 61 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65  CardReleaseConte
7070: 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  xt(*cackey_pcsc_
7080: 68 61 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63  handle);...if (c
7090: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
70a0: 65 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  e) {...free(cack
70b0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
70c0: 0a 09 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63  .....cackey_pcsc
70d0: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
70e0: 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72  .}...if (scard_r
70f0: 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  el_context_ret !
7100: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
7110: 53 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41  S) {...return(CA
7120: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7130: 52 49 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  RIC);..}...retur
7140: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
7150: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
7160: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
7170: 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  id cackey_mark_s
7180: 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63 74  lot_reset(struct
7190: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
71a0: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
71b0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
71c0: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
71d0: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
71e0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
71f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7200: 20 6d 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61   marks a slot ha
7210: 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65  s having been re
7220: 73 65 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65  set, to later be
7230: 20 63 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20   cleaned up.. * 
7240: 20 20 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79      Cleanup only
7250: 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20   happens when a 
7260: 50 4b 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63  PKCS#11 client c
7270: 61 6c 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63  alls C_FindObjec
7280: 74 73 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73  tsInit.. *. */.s
7290: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
72a0: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
72b0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
72c0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69  slot *slot) {..i
72d0: 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (slot == NULL)
72e0: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
72f0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7300: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
7310: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63  ;...if (slot->pc
7320: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
7330: 64 29 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63  d) {...SCardDisc
7340: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7350: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45  c_card, SCARD_LE
7360: 41 56 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09  AVE_CARD);..}...
7370: 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
7380: 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73   = 1;..slot->pcs
7390: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
73a0: 20 3d 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65   = 0;..if (cacke
73b0: 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d  y_pin_command ==
73c0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d   NULL) {...slot-
73d0: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
73e0: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
73f0: 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73  D;..} else {...s
7400: 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
7410: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 0;..}...CACKE
7420: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7430: 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09  Returning.");...
7440: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
7450: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
7460: 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63   LONG cackey_rec
7470: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7480: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7490: 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61  slot, DWORD defa
74a0: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20  ult_protocol);. 
74b0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
74c0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
74d0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
74e0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
74f0: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
7500: 2a 20 20 20 20 20 44 57 4f 52 44 20 64 65 66 61  *     DWORD defa
7510: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ult_protocol. * 
7520: 20 20 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c          Protocol
7530: 20 74 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73   to attempt firs
7540: 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  t. *. * RETURN V
7550: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20  ALUE. *     The 
7560: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
7570: 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  m SCardReconnect
7580: 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  (). *. * NOTES. 
7590: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
75a0: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
75b0: 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63   around SCardRec
75c0: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20  onnect(). *. *  
75d0: 20 20 20 54 68 65 20 53 43 61 72 64 52 65 63 6f     The SCardReco
75e0: 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e  nnect() function
75f0: 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61   call will be ca
7600: 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74 68 20  lled first with 
7610: 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65  the. *     dwPre
7620: 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20  ferredProtocols 
7630: 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74  of "default_prot
7640: 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20  ocol".  If that 
7650: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20  call returns. * 
7660: 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54      SCARD_E_PROT
7670: 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61  O_MISMATCH try a
7680: 67 61 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74  gain with a prot
7690: 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64  ocol of T=0, and
76a0: 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20   failing. *     
76b0: 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f  that T=1.. *. */
76c0: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63  .static LONG cac
76d0: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
76e0: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
76f0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
7700: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7710: 63 6f 6c 29 20 7b 0a 09 44 57 4f 52 44 20 73 65  col) {..DWORD se
7720: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b  lected_protocol;
7730: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e  ..LONG scard_con
7740: 6e 5f 72 65 74 3b 0a 0a 09 73 65 6c 65 63 74 65  n_ret;...selecte
7750: 64 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a  d_protocol = 0;.
7760: 0a 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7770: 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63   = SCardReconnec
7780: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7790: 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  d, SCARD_SHARE_S
77a0: 48 41 52 45 44 2c 20 64 65 66 61 75 6c 74 5f 70  HARED, default_p
77b0: 72 6f 74 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52  rotocol, SCARD_R
77c0: 45 53 45 54 5f 43 41 52 44 2c 20 26 73 65 6c 65  ESET_CARD, &sele
77d0: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
77e0: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
77f0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7800: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7810: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7820: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
7830: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
7840: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7850: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7860: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7870: 29 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  )...scard_conn_r
7880: 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e  et = SCardReconn
7890: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
78a0: 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45  ard, SCARD_SHARE
78b0: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
78c0: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 53 43 41 52  ROTOCOL_T0, SCAR
78d0: 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 26 73  D_RESET_CARD, &s
78e0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
78f0: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
7900: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
7910: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
7920: 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  CH) {....CACKEY_
7930: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7940: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
7950: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7960: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7970: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7980: 20 54 3d 31 22 29 0a 09 09 09 73 63 61 72 64 5f   T=1")....scard_
7990: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
79a0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
79b0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
79c0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
79d0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
79e0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
79f0: 52 44 2c 20 26 73 65 6c 65 63 74 65 64 5f 70 72  RD, &selected_pr
7a00: 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09 7d 0a  otocol);...}..}.
7a10: 0a 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7a20: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
7a30: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 73 6c 6f  SUCCESS) {...slo
7a40: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 73 65  t->protocol = se
7a50: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 3b  lected_protocol;
7a60: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61  ..}...return(sca
7a70: 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a  rd_conn_ret);.}.
7a80: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
7a90: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
7aa0: 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  t cackey_connect
7ab0: 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63  _card(struct cac
7ac0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
7ad0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
7ae0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
7af0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
7b00: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
7b10: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
7b20: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
7b30: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
7b40: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
7b50: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
7b60: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
7b70: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
7b80: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
7b90: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
7ba0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
7bb0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
7bc0: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
7bd0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7be0: 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65  ot) {..cackey_re
7bf0: 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  t pcsc_connect_r
7c00: 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f  et;..DWORD proto
7c10: 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  col;..LONG scard
7c20: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  _conn_ret;...CAC
7c30: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7c40: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
7c50: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
7c60: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7c70: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
7c80: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
7c90: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
7ca0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
7cb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
7cc0: 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  IC);..}...pcsc_c
7cd0: 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
7ce0: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
7cf0: 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  ();..if (pcsc_co
7d00: 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
7d10: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
7d20: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d30: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
7d40: 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c  on to PC/SC fail
7d50: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
7d60: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
7d70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
7d80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
7d90: 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f  .../* Connect to
7da0: 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64   reader, if need
7db0: 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74  ed */..if (!slot
7dc0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7dd0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
7de0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7df0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29  SCardConnect(%s)
7e00: 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e   called", slot->
7e10: 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09  pcsc_reader);...
7e20: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7e30: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
7e40: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
7e50: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
7e60: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
7e70: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7e80: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
7e90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
7ea0: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
7eb0: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
7ec0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7ed0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7ee0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7ef0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
7f00: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7f10: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7f20: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7f30: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7f40: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29   with just T=0")
7f50: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7f60: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7f70: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7f80: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7f90: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7fa0: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7fb0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7fc0: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
7fd0: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a  d, &protocol);..
7fe0: 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7ff0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
8000: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
8010: 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
8020: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
8030: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8040: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8050: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8060: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
8070: 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e  ").....scard_con
8080: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8090: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
80a0: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
80b0: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
80c0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
80d0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
80e0: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
80f0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
8100: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
8110: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8120: 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f   == SCARD_W_UNPO
8130: 57 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09  WERED_CARD) {...
8140: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8150: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
8160: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
8170: 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f  ARD_W_UNPOWERED_
8180: 43 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20  CARD, trying to 
8190: 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b  re-connect...");
81a0: 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  .....scard_conn_
81b0: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
81c0: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
81d0: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
81e0: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
81f0: 5f 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53  _SHARE_DIRECT, S
8200: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
8210: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
8220: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
8230: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
8240: 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72  l);.....if (scar
8250: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
8260: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
8270: 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b  ATCH) {.....CACK
8280: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8290: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20  "SCardConnect() 
82a0: 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45  returned SCARD_E
82b0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c  _PROTO_MISMATCH,
82c0: 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73   trying with jus
82d0: 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72  t T=0").....scar
82e0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
82f0: 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65  rdConnect(*cacke
8300: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73  y_pcsc_handle, s
8310: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8320: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
8330: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
8340: 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T0, &slot->
8350: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
8360: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28  ocol);......if (
8370: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8380: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
8390: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09  MISMATCH) {.....
83a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
83b0: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
83c0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
83d0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
83e0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
83f0: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
8400: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8410: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8420: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8430: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8440: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8450: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8460: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
8470: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
8480: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09   &protocol);....
8490: 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72  .}....}.....scar
84a0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63  d_conn_ret = cac
84b0: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
84c0: 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f  rd(slot, protoco
84d0: 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  l);...}....if (s
84e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d  card_conn_ret !=
84f0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
8500: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8510: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e  BUG_PRINTF("Conn
8520: 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66  ection to card f
8530: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
8540: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61   in failure (SCa
8550: 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73  rdConnect() = %s
8560: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
8570: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
8580: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
8590: 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  conn_ret), (long
85a0: 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ) scard_conn_ret
85b0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
85c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
85d0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f  RIC);...}....slo
85e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
85f0: 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c  nected = 1;...sl
8600: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8610: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f  depth = 0;...slo
8620: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
8630: 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
8640: 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  ...slot->protoco
8650: 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d  l = protocol;..}
8660: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8670: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
8680: 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a  g in success");.
8690: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
86a0: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
86b0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
86c0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
86d0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
86e0: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
86f0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8700: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8710: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8720: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8730: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8740: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8750: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8760: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8770: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
8780: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
8790: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
87a0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
87b0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
87c0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74  TES. *     The t
87d0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c  ransaction shoul
87e0: 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20  d be terminated 
87f0: 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e  using "cackey_en
8800: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20  d_transaction". 
8810: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
8820: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62  key_ret cackey_b
8830: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
8840: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8850: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
8860: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8870: 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20  conn_ret;..LONG 
8880: 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b  scard_trans_ret;
8890: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
88a0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
88b0: 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e  );...cackey_conn
88c0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
88d0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
88e0: 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f  ;..if (cackey_co
88f0: 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nn_ret != CACKEY
8900: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
8910: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8920: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
8930: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
8940: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8950: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8960: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8970: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  NERIC);..}...slo
8980: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8990: 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c  epth++;...if (sl
89a0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
89b0: 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c  depth > 1 && !sl
89c0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
89d0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a  need_hw_lock) {.
89e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
89f0: 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69  RINTF("Already i
8a00: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
8a10: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61   performing no a
8a20: 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68  ction (new depth
8a30: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
8a40: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8a50: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8a60: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8a70: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
8a80: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8a90: 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64  ock = 0;...scard
8aa0: 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61  _trans_ret = SCa
8ab0: 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  rdBeginTransacti
8ac0: 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  on(slot->pcsc_ca
8ad0: 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  rd);..if (scard_
8ae0: 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41  trans_ret != SCA
8af0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8b00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8b10: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
8b20: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
8b30: 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  on, returning in
8b40: 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74   error");....ret
8b50: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8b60: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
8b70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8b80: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
8b90: 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74  y began transact
8ba0: 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29  ion on slot (%s)
8bb0: 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  ", slot->pcsc_re
8bc0: 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ader);...return(
8bd0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8be0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
8bf0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
8c00: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e  ey_ret cackey_en
8c10: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  d_transaction(st
8c20: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8c30: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *slot);. *. * A
8c40: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
8c50: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8c60: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
8c70: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
8c80: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55  ds to. *. * RETU
8c90: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
8ca0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
8cb0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
8cc0: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
8cd0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ce0: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
8cf0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
8d00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
8d10: 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62  quires "cackey_b
8d20: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
8d30: 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  " to be called f
8d40: 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  irst. *. */.stat
8d50: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
8d60: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
8d70: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8d80: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
8d90: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61  ..LONG scard_tra
8da0: 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  ns_ret;...CACKEY
8db0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
8dc0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
8dd0: 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  !slot->pcsc_card
8de0: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
8df0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8e00: 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74  NTF("Card is not
8e10: 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62   connected, unab
8e20: 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61  le to end transa
8e30: 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b  ction on card");
8e40: 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ....if (slot->tr
8e50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8e60: 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  > 0) {....CACKEY
8e70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
8e80: 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61  ecreasing transa
8e90: 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20  ction depth and 
8ea0: 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72  asking for a har
8eb0: 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  dware lock on th
8ec0: 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61  e next begin tra
8ed0: 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e  nsaction (curren
8ee0: 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20  t depth = %i)", 
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 29 3b 0a 0a 09 09 09 73 6c  n_depth);.....sl
8f10: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8f20: 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20  depth--;.....if 
8f30: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
8f40: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
8f50: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
8f60: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
8f70: 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d  ck = 1;....}...}
8f80: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8f90: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8fa0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
8fb0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8fc0: 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  pth == 0) {...CA
8fd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8fe0: 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61  F("Terminating a
8ff0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9000: 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21  t has not begun!
9010: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
9020: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9030: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  RIC);..}...slot-
9040: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9050: 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  th--;...if (slot
9060: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9070: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43  pth > 0) {...CAC
9080: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9090: 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73  ("Transactions s
90a0: 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73  till in progress
90b0: 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e  , not terminatin
90c0: 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61  g on-card Transa
90d0: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
90e0: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
90f0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
9100: 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e  epth);....return
9110: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
9120: 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74  K);..}...scard_t
9130: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
9140: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  EndTransaction(s
9150: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
9160: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
9170: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
9180: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
9190: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
91a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
91b0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65  NTF("Unable to e
91c0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nd transaction, 
91d0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
91e0: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
91f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9200: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
9210: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9220: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65  ("Sucessfully te
9230: 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63  rminated transac
9240: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
9250: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
9260: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
9270: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
9280: 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52  K);.}../* APDU R
9290: 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73  elated Functions
92a0: 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53   */./*. * SYNPOS
92b0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
92c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64  _ret cackey_send
92d0: 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61 63  _apdu(struct cac
92e0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
92f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
9300: 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ass, unsigned ch
9310: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  ar instruction, 
9320: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31  unsigned char p1
9330: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9340: 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  p2, unsigned cha
9350: 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63  r lc, unsigned c
9360: 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67  har *data, unsig
9370: 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e  ned char le, uin
9380: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c  t16_t *respcode,
9390: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
93a0: 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74  respdata, size_t
93b0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
93c0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
93d0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
93e0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
93f0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
9400: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
9410: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9420: 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20   char class. *  
9430: 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61 73         APDU Clas
9440: 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  s (GSCIS_CLASS_I
9450: 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f  SO7816 or GSCIS_
9460: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
9470: 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20  TFORM. *        
9480: 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29   usually), (CLA)
9490: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
94a0: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
94b0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  tion. *         
94c0: 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e  APDU Instruction
94d0: 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20   (INS). *. *    
94e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
94f0: 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  1. *         APD
9500: 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28 50  U Parameter 1 (P
9510: 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  1). *. *     uns
9520: 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a  igned char p2. *
9530: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
9540: 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20  rameter 2 (P2). 
9550: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9560: 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20  d char lc. *    
9570: 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68       APDU Length
9580: 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29   of Content (Lc)
9590: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
95a0: 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22  length of "data"
95b0: 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72 61  . *         para
95c0: 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74 61  meter.  If "data
95d0: 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  " is specified a
95e0: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72  s NULL, this par
95f0: 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20  ameter will. *  
9600: 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65         be ignore
9610: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  d.. *. *     uns
9620: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
9630: 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e  . *         Poin
9640: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f  ter to buffer to
9650: 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c   send.  It shoul
9660: 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73 20  d be "Lc" bytes 
9670: 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20  long.  If. *    
9680: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9690: 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c  s NULL, "Lc" wil
96a0: 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61  l not be sent, a
96b0: 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20 77  nd this buffer w
96c0: 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20  ill be. *       
96d0: 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a    ignored.. *. *
96e0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
96f0: 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20  ar le. *        
9700: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
9710: 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29  Expectation (Le)
9720: 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65 20   -- this is the 
9730: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a  length of the. *
9740: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
9750: 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69  d reply.  If thi
9760: 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  s is specified a
9770: 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  s 0 then it will
9780: 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20   not. *         
9790: 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20  be sent.. *. *  
97a0: 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73     uint16_t *res
97b0: 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20  pcode. *        
97c0: 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74   [OUT] Pointer t
97d0: 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44  o storage of APD
97e0: 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e  U response code.
97f0: 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20    If this is. * 
9800: 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69 65          specifie
9810: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72  d as NULL, the r
9820: 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c  esponse code wil
9830: 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  l be discarded..
9840: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9850: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9860: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  a. *         [OU
9870: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
9880: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
9890: 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66  sponse data.  If
98a0: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
98b0: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
98c0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
98d0: 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65  nse data will be
98e0: 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a   discarded.  If.
98f0: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 22   *         the "
9900: 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61  respdata_len" pa
9910: 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63 69  rameter is speci
9920: 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68  fied as NULL, th
9930: 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20  is buffer. *    
9940: 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65       will not be
9950: 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20   updated.. *. * 
9960: 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70      size_t *resp
9970: 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  data_len. *     
9980: 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f      [IN, OUT] Po
9990: 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67  inter initialing
99a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
99b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73  size of the "res
99c0: 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20  pdata". *       
99d0: 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72    buffer.  Befor
99e0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65  e returning, the
99f0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75   pointed to valu
9a00: 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  e is updated to 
9a10: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e  the. *         n
9a20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
9a30: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75  ritten to the bu
9a40: 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20 69  ffer.  If this i
9a50: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a 20  s specified as. 
9a60: 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20  *         NULL, 
9a70: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  it will not be u
9a80: 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73  pdated, and "res
9a90: 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69  pdata" will be i
9aa0: 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20  gnored causing. 
9ab0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65  *         the re
9ac0: 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62  sponse data to b
9ad0: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
9ae0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
9af0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
9b00: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
9b10: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
9b20: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
9b30: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f  E_GENERIC      O
9b40: 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43  n error. *     C
9b50: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
9b60: 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68 65  ENABSENT  If the
9b70: 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20   sending failed 
9b80: 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65  because the toke
9b90: 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  n is. *         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a         absent. *
9bc0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
9bd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
9be0: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
9bf0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
9c00: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a  ion Manager via.
9c10: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63   *     cackey_pc
9c20: 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20  sc_connect() if 
9c30: 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  needed.. *. *   
9c40: 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63    It will connec
9c50: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e  t to the card in
9c60: 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74 61   the reader atta
9c70: 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74  ched to the slot
9c80: 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69 65  . *     specifie
9c90: 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f  d.  It will reco
9ca0: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61 72  nnect to the car
9cb0: 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  d if the connect
9cc0: 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20  ion. *     goes 
9cd0: 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  away.. *. */.sta
9ce0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
9cf0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9d00: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
9d10: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
9d20: 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75  ed char class, u
9d30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
9d40: 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e  truction, unsign
9d50: 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69  ed char p1, unsi
9d60: 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e  gned char p2, un
9d70: 73 69 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75  signed int lc, u
9d80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9d90: 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ta, unsigned int
9da0: 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72   le, uint16_t *r
9db0: 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65  espcode, unsigne
9dc0: 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61  d char *respdata
9dd0: 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61  , size_t *respda
9de0: 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38  ta_len) {..uint8
9df0: 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e  _t major_rc, min
9e00: 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62  or_rc;..size_t b
9e10: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d  ytes_to_copy, tm
9e20: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a  p_respdata_len;.
9e30: 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45 51  .LPCSCARD_IO_REQ
9e40: 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69 3b  UEST pioSendPci;
9e50: 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e  ..DWORD xmit_len
9e60: 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e  , recv_len;..LON
9e70: 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  G scard_xmit_ret
9e80: 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  , scard_reconn_r
9e90: 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62  et;..BYTE xmit_b
9ea0: 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62  uf[1024], recv_b
9eb0: 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70  uf[1024];..int p
9ec0: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c  csc_connect_ret,
9ed0: 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65   pcsc_getresp_re
9ee0: 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43  t;..int idx;...C
9ef0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9f00: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
9f10: 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09  .if (!slot) {...
9f20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9f30: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f  NTF("Invalid slo
9f40: 74 20 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a  t specified.");.
9f50: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9f60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9f70: 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e  ;..}...pcsc_conn
9f80: 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
9f90: 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
9fa0: 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  ot);..if (pcsc_c
9fb0: 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
9fc0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
9fd0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
9fe0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
9ff0: 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
a000: 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  rd, returning in
a010: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
a020: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
a030: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
a040: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
a050: 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74  which protocol t
a060: 6f 20 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a  o send using */.
a070: 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70  .switch (slot->p
a080: 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73  rotocol) {...cas
a090: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
a0a0: 5f 54 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  _T0:....CACKEY_D
a0b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
a0c0: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61  tocol to send da
a0d0: 74 61 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b  tagram is T=0");
a0e0: 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a0f0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a  = SCARD_PCI_T0;.
a100: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
a110: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
a120: 5f 54 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  _T1:....CACKEY_D
a130: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
a140: 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61  tocol to send da
a150: 74 61 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b  tagram is T=1");
a160: 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a170: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a  = SCARD_PCI_T1;.
a180: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66  ....break;...def
a190: 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f  ault:....CACKEY_
a1a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
a1b0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
a1c0: 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22  ound, aborting."
a1d0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
a1e0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
a1f0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72  RIC);..}.../* Tr
a200: 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f  ansmit */..xmit_
a210: 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62  len = 0;..xmit_b
a220: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a230: 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75   class;..xmit_bu
a240: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a250: 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d  instruction;..xm
a260: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a270: 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62  +] = p1;..xmit_b
a280: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a290: 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20   p2;..if (data) 
a2a0: 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35  {...if (lc > 255
a2b0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
a2c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54  BUG_PRINTF("CAUT
a2d0: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c  ION!  Using an L
a2e0: 63 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  c greater than 2
a2f0: 35 35 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20  55 is untested. 
a300: 20 4c 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a   Lc = %u", lc);.
a310: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a320: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b  t_len++] = 0x82;
a330: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44   /* XXX UNTESTED
a340: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   */....xmit_buf[
a350: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c  xmit_len++] = (l
a360: 63 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  c & 0xff00) >> 8
a370: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ;....xmit_buf[xm
a380: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26  it_len++] = lc &
a390: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20   0xff;...} else 
a3a0: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a3b0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a  it_len++] = lc;.
a3c0: 09 09 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
a3d0: 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64   0; idx < lc; id
a3e0: 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62  x++) {....xmit_b
a3f0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a400: 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a   data[idx];...}.
a410: 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30  .}...if (le != 0
a420: 78 30 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20  x00) {...if (le 
a430: 3e 20 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b  > 256) {....CACK
a440: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a450: 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67  "CAUTION!  Using
a460: 20 61 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74   an Le greater t
a470: 68 61 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73  han 256 is untes
a480: 74 65 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20  ted.  Le = %u", 
a490: 6c 65 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75  le);.....xmit_bu
a4a0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a4b0: 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54  0x82; /* XXX UNT
a4c0: 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74  ESTED */....xmit
a4d0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a4e0: 20 3d 20 28 6c 65 20 26 20 30 78 66 66 30 30 29   = (le & 0xff00)
a4f0: 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62   >> 8;....xmit_b
a500: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a510: 20 6c 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20   le & 0xff;...} 
a520: 65 6c 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32  else if (le == 2
a530: 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  56) {....xmit_bu
a540: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a550: 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  0x00;...} else {
a560: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a570: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09  t_len++] = le;..
a580: 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  .}..}.../* Begin
a590: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
a5a0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
a5b0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
a5c0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
a5d0: 28 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f  (class == GSCIS_
a5e0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26  CLASS_ISO7816 &&
a5f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20   instruction == 
a600: 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
a610: 46 59 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30  FY && p1 == 0x00
a620: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a630: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69  UG_PRINTF("Sendi
a640: 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f  ng APDU: <<censo
a650: 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65  red>>");..} else
a660: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a670: 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64  G_PRINTBUF("Send
a680: 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74  ing APDU:", xmit
a690: 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b  _buf, xmit_len);
a6a0: 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d  ..}...recv_len =
a6b0: 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66   sizeof(recv_buf
a6c0: 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  );..scard_xmit_r
a6d0: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
a6e0: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
a6f0: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
a700: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
a710: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62  en, NULL, recv_b
a720: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a  uf, &recv_len);.
a730: 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74  ..if (scard_xmit
a740: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
a750: 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20  NOT_TRANSACTED) 
a760: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a770: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
a780: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
a790: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
a7a0: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c  mit() = %s/%lx),
a7b0: 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e   will ask callin
a7c0: 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  g function to re
a7d0: 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69  try (not resetti
a7e0: 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41  ng card)...", CA
a7f0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
a800: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
a810: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
a820: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
a830: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29   scard_xmit_ret)
a840: 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d  ;..../* Begin Sm
a850: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a860: 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f  ion */...cackey_
a870: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
a880: 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79  slot);....cackey
a890: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
a8a0: 73 6c 6f 74 2c 20 73 6c 6f 74 2d 3e 70 72 6f 74  slot, slot->prot
a8b0: 6f 63 6f 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ocol);....return
a8c0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52  (CACKEY_PCSC_E_R
a8d0: 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ETRY);..}...if (
a8e0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
a8f0: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
a900: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
a910: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
a920: 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20  ed to send APDU 
a930: 74 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72  to card (SCardTr
a940: 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c  ansmit() = %s/%l
a950: 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  x)", CACKEY_DEBU
a960: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
a970: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69  TO_STR(scard_xmi
a980: 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65  t_ret), (unsigne
a990: 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d  d long) scard_xm
a9a0: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  it_ret);....CACK
a9b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a9c0: 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73  "Marking slot as
a9d0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73   having been res
a9e0: 65 74 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d  et");...cackey_m
a9f0: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
aa00: 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  lot);....if (sca
aa10: 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53  rd_xmit_ret == S
aa20: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
aa30: 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
aa40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
aa50: 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
aa60: 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
aa70: 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
aa80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63  ret = cackey_rec
aa90: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
aaa0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
aab0: 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
aac0: 4f 43 4f 4c 5f 54 31 29 3b 0a 0a 09 09 09 69 66  OCOL_T1);.....if
aad0: 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72   (scard_reconn_r
aae0: 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
aaf0: 43 43 45 53 53 29 20 7b 0a 09 09 09 09 73 77 69  CCESS) {.....swi
ab00: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
ab10: 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65  col) {......case
ab20: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
ab30: 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e  T0:.......pioSen
ab40: 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49  dPci = SCARD_PCI
ab50: 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  _T0;........brea
ab60: 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41  k;......case SCA
ab70: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
ab80: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
ab90: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b   = SCARD_PCI_T1;
aba0: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
abb0: 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
abc0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
abd0: 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20  PRINTF("Invalid 
abe0: 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20  protocol found, 
abf0: 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20  but too late to 
ac00: 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75  do anything abou
ac10: 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69  t it now -- tryi
ac20: 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09  ng anyway.");...
ac30: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
ac40: 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74  }....../* Re-est
ac50: 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69  ablish transacti
ac60: 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72  on, if it was pr
ac70: 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20  esent */.....if 
ac80: 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
ac90: 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
aca0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
acb0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
acc0: 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
acd0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
ace0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  ock = 1;......ca
acf0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
ad00: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
ad10: 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
ad20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
ad30: 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
ad40: 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29  retransmitting")
ad50: 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20  ;......recv_len 
ad60: 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75  = sizeof(recv_bu
ad70: 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d  f);.....scard_xm
ad80: 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72  it_ret = SCardTr
ad90: 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73  ansmit(slot->pcs
ada0: 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50  c_card, pioSendP
adb0: 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  ci, xmit_buf, xm
adc0: 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65  it_len, NULL, re
add0: 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65  cv_buf, &recv_le
ade0: 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61  n);......if (sca
adf0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
ae00: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
ae10: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
ae20: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72  BUG_PRINTF("Retr
ae30: 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72  ansmit failed, r
ae40: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ae50: 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e  ure after discon
ae60: 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64  necting the card
ae70: 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20   (SCardTransmit 
ae80: 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b  = %s/%li)", CACK
ae90: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
aea0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
aeb0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
aec0: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
aed0: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61  _ret);.......SCa
aee0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
aef0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
af00: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
af10: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ......slot->pcsc
af20: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
af30: 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e  = 0;......./* En
af40: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
af50: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  saction */......
af60: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
af70: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
af80: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
af90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
afa0: 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
afb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
afc0: 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
afd0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
afe0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
aff0: 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e  TF("Disconnectin
b000: 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53  g card");......S
b010: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
b020: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
b030: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
b040: 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  );.....slot->pcs
b050: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
b060: 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e   = 0;....../* En
b070: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b080: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73  saction */.....s
b090: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
b0a0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
b0b0: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
b0c0: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
b0d0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b0e0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
b0f0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
b100: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b110: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
b120: 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  SENT);....}...} 
b130: 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
b140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44  _DEBUG_PRINTF("D
b150: 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72  isconnecting car
b160: 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  d");.....SCardDi
b170: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
b180: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
b190: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
b1a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
b1b0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a  connected = 0;..
b1c0: 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63  .../* End Smartc
b1d0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
b1e0: 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  */....slot->tran
b1f0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
b200: 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  1;....cackey_end
b210: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b220: 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  t);.....CACKEY_D
b230: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
b240: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b250: 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43  e");....return(C
b260: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
b270: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09  ENABSENT);...}..
b280: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
b290: 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74 75 72  _PRINTBUF("Retur
b2a0: 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63  ned Value:", rec
b2b0: 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29  v_buf, recv_len)
b2c0: 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ;...if (recv_len
b2d0: 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e   < 2) {.../* Min
b2e0: 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65  imal response le
b2f0: 6e 67 74 68 20 69 73 20 32 20 62 79 74 65 73 2c  ngth is 2 bytes,
b300: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
b310: 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45  ilure */...CACKE
b320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b330: 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61  Response too sma
b340: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ll, returning in
b350: 20 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c   failure (recv_l
b360: 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  en = %lu)", (uns
b370: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
b380: 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64  _len);..../* End
b390: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b3a0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b3b0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b3c0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74  on(slot);....ret
b3d0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b3e0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
b3f0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65  ./* Determine re
b400: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61  sult code */..ma
b410: 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  jor_rc = recv_bu
b420: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b  f[recv_len - 2];
b430: 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63  ..minor_rc = rec
b440: 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d  v_buf[recv_len -
b450: 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f   1];..if (respco
b460: 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64  de) {...*respcod
b470: 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c  e = (major_rc <<
b480: 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a   8) | minor_rc;.
b490: 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d  .}.../* Adjust m
b4a0: 65 73 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f  essage buffer */
b4b0: 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b  ..recv_len -= 2;
b4c0: 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20  .../* Add bytes 
b4d0: 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  to return value 
b4e0: 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61  */..tmp_respdata
b4f0: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72  _len = 0;..if (r
b500: 65 73 70 64 61 74 61 20 26 26 20 72 65 73 70 64  espdata && respd
b510: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70  ata_len) {...tmp
b520: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  _respdata_len = 
b530: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a  *respdata_len;..
b540: 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
b550: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
b560: 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e  ....if (recv_len
b570: 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
b580: 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
b590: 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b  copy = recv_len;
b5a0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
b5b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70  EBUG_PRINTF("Cop
b5c0: 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74  ying %lu bytes t
b5d0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 28 72 65  o the buffer (re
b5e0: 63 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20  cv'd %lu bytes, 
b5f0: 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74  but only %lu byt
b600: 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62  es left in our b
b610: 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e  uffer)", (unsign
b620: 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74  ed long) bytes_t
b630: 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65  o_copy, (unsigne
b640: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
b650: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b660: 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  ) *respdata_len)
b670: 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70  ;....memcpy(resp
b680: 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20  data, recv_buf, 
b690: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
b6a0: 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79  ..respdata += by
b6b0: 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09  tes_to_copy;....
b6c0: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20  *respdata_len = 
b6d0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09  bytes_to_copy;..
b6e0: 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  .tmp_respdata_le
b6f0: 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f  n -= bytes_to_co
b700: 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  py;..} else {...
b710: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20  if (recv_len != 
b720: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
b730: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72  EBUG_PRINTF("Thr
b740: 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62  owing away %lu b
b750: 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f  ytes, nowhere to
b760: 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e   put them!", (un
b770: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
b780: 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  v_len);...}..}..
b790: 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d  .if (major_rc ==
b7a0: 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65   0x61) {.../* We
b7b0: 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f   need to READ */
b7c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b7d0: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b7e0: 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a  ead required");.
b7f0: 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20  ...if (minor_rc 
b800: 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69  == 0x00) {....mi
b810: 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f  nor_rc = CACKEY_
b820: 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09  APDU_MTU;...}...
b830: 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  .pcsc_getresp_re
b840: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
b850: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
b860: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
b870: 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f  GSCIS_INSTR_GET_
b880: 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20  RESPONSE, 0x00, 
b890: 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d  0x00, 0, NULL, m
b8a0: 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64  inor_rc, respcod
b8b0: 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d  e, respdata, &tm
b8c0: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b  p_respdata_len);
b8d0: 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
b8e0: 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b  resp_ret != CACK
b8f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
b900: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b910: 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72  PRINTF("Buffer r
b920: 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74  ead failed!  Ret
b930: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
b940: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  e");...../* End 
b950: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b960: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ction */....cack
b970: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b980: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66  on(slot);.....if
b990: 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72   (pcsc_getresp_r
b9a0: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
b9b0: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09  C_E_RETRY) {....
b9c0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
b9d0: 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09  CSC_E_RETRY);...
b9e0: 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
b9f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
ba00: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RIC);...}....if 
ba10: 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b  (respdata_len) {
ba20: 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65  ....*respdata_le
ba30: 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74  n += tmp_respdat
ba40: 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  a_len;...}..../*
ba50: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
ba60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
ba70: 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
ba80: 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
ba90: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
baa0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
bab0: 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66  in success (buff
bac0: 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65  er read complete
bad0: 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41  )");...return(CA
bae0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
baf0: 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61  ..}.../* End Sma
bb00: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
bb10: 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
bb20: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
bb30: 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  ot);...if (major
bb40: 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09  _rc == 0x90) {..
bb50: 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09  ./* Success */..
bb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bb70: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
bb80: 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f  in success (majo
bb90: 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a  r_rc = 0x90)");.
bba0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
bbb0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
bbc0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bbd0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74  PRINTF("APDU Ret
bbe0: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20  urned an error, 
bbf0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
bc00: 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  lure");...return
bc10: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
bc20: 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74  ENERIC);.}..stat
bc30: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
bc40: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65   *cackey_read_be
bc50: 72 74 6c 76 5f 74 61 67 28 75 6e 73 69 67 6e 65  rtlv_tag(unsigne
bc60: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
bc70: 73 69 7a 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c  size_t *buffer_l
bc80: 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65 64 20 63  en_p, unsigned c
bc90: 68 61 72 20 74 61 67 2c 20 75 6e 73 69 67 6e 65  har tag, unsigne
bca0: 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 66 65  d char *outbuffe
bcb0: 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75  r, size_t *outbu
bcc0: 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75  ffer_len_p) {..u
bcd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
bce0: 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20  ffer_p;..size_t 
bcf0: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62  outbuffer_len, b
bd00: 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65  uffer_len;..size
bd10: 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64  _t size;..int id
bd20: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
bd30: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
bd40: 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65  .");...if (buffe
bd50: 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29  r_len_p == NULL)
bd60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
bd70: 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66 65 72  G_PRINTF("buffer
bd80: 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20  _len_p is NULL. 
bd90: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
bda0: 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74  ilure.");....ret
bdb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
bdc0: 69 66 20 28 6f 75 74 62 75 66 66 65 72 5f 6c 65  if (outbuffer_le
bdd0: 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  n_p == NULL) {..
bde0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bdf0: 49 4e 54 46 28 22 6f 75 74 62 75 66 66 65 72 5f  INTF("outbuffer_
be00: 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20  len_p is NULL.  
be10: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
be20: 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75  lure.");....retu
be30: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62  rn(NULL);..}...b
be40: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74  uffer_len = *out
be50: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f  buffer_len_p;..o
be60: 75 74 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a  utbuffer_len = *
be70: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b  outbuffer_len_p;
be80: 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75  ...buffer_p = bu
be90: 66 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65  ffer;..if (buffe
bea0: 72 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b  r_p[0] != tag) {
beb0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bec0: 50 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e  PRINTF("Tag foun
bed0: 64 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78  d was not tag ex
bee0: 70 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25  pected.  Tag = %
bef0: 30 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20  02x, Expected = 
bf00: 25 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67  %02x.  Returning
bf10: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28   in failure.", (
bf20: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75  unsigned int) bu
bf30: 66 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b  ffer_p[0], tag);
bf40: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
bf50: 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b  ;..}...buffer_p+
bf60: 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d  +;..buffer_len--
bf70: 3b 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f  ;...if ((buffer_
bf80: 70 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20  p[0] & 0x80) == 
bf90: 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d  0x80) {...size =
bfa0: 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66   0;...idx = (buf
bfb0: 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29  fer_p[0] & 0x7f)
bfc0: 3b 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62  ;....if (idx > b
bfd0: 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09  uffer_len) {....
bfe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bff0: 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42  NTF("Malformed B
c000: 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20  ER value -- not 
c010: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61  enough bytes ava
c020: 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c  ilable to read l
c030: 65 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c  ength (idx = %i,
c040: 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c   buffer_len = %l
c050: 75 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67  u)", idx, (unsig
c060: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
c070: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72  _len);.....retur
c080: 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09  n(NULL);...}....
c090: 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20  for (; idx > 0; 
c0a0: 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66  idx--) {....buff
c0b0: 65 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65  er_p++;....buffe
c0c0: 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a  r_len--;.....siz
c0d0: 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65  e <<= 8;....size
c0e0: 20 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b   |= buffer_p[0];
c0f0: 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
c100: 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70  .size = buffer_p
c110: 5b 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  [0];..}...buffer
c120: 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65  _p++;..buffer_le
c130: 6e 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20  n--;...if (size 
c140: 3e 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29  > outbuffer_len)
c150: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c160: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
c170: 20 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62   to copy value b
c180: 75 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66  uffer to outbuff
c190: 65 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72  er, not enough r
c1a0: 6f 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66  oom.  Value buff
c1b0: 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  er length = %lu,
c1c0: 20 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67   out buffer leng
c1d0: 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69  th = %lu", (unsi
c1e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c  gned long) size,
c1f0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c200: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b   outbuffer_len);
c210: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
c220: 3b 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65  ;..}...*outbuffe
c230: 72 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a  r_len_p = size;.
c240: 09 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20  .if (outbuffer) 
c250: 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75  {...memcpy(outbu
c260: 66 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20  ffer, buffer_p, 
c270: 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f  size);...buffer_
c280: 70 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66  p += size;...buf
c290: 66 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b  fer_len -= size;
c2a0: 0a 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f  ....*buffer_len_
c2b0: 70 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  p = buffer_len;.
c2c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c2d0: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
c2e0: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74  V results:", out
c2f0: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09  buffer, size);..
c300: 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f  } else {...memmo
c310: 76 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  ve(buffer, buffe
c320: 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75  r_p, size);...bu
c330: 66 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b  ffer_p = buffer;
c340: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c350: 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54  _PRINTBUF("BER-T
c360: 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75  LV results:", bu
c370: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a  ffer, size);..}.
c380: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c390: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
c3a0: 20 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69   in success.  Si
c3b0: 7a 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66  ze of contents f
c3c0: 6f 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25  or tag %02x is %
c3d0: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  lu", (unsigned i
c3e0: 6e 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e  nt) tag, (unsign
c3f0: 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a  ed long) size);.
c400: 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f  ..return(buffer_
c410: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  p);.}../*. * SYN
c420: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
c430: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f  ze_t cackey_get_
c440: 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b  data(struct cack
c450: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
c460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
c470: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66  ffer, size_t buf
c480: 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65  fer_len, unsigne
c490: 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a  d char oid[3]);.
c4a0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
c4b0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
c4c0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
c4d0: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
c4e0: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
c4f0: 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e   to. *. *     un
c500: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c510: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  fer. *         [
c520: 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20  OUT] Buffer. *. 
c530: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66  *     size_t buf
c540: 66 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  fer_len. *      
c550: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
c560: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
c570: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
c580: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
c590: 64 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20  d[3]. *         
c5a0: 33 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65  3-byte OID to re
c5b0: 61 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55  ad. *. *. * RETU
c5c0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
c5d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
c5e0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
c5f0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
c600: 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f  ly read, or -1 o
c610: 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e  n error.. *. * N
c620: 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  OTES. *     None
c630: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
c640: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65  size_t cackey_ge
c650: 74 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61  t_data(struct ca
c660: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
c670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c680: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62  buffer, size_t b
c690: 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67  uffer_len, unsig
c6a0: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29  ned char oid[3])
c6b0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
c6c0: 72 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c  r cmd[] = {0x5C,
c6d0: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
c6e0: 30 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67  0, 0x00};..unsig
c6f0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
c700: 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  _p;..size_t init
c710: 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a  _buffer_len, siz
c720: 65 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  e;..uint16_t res
c730: 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64  pcode;..int send
c740: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
c750: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
c760: 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62  led.");...init_b
c770: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66  uffer_len = buff
c780: 65 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d  er_len;...cmd[2]
c790: 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b   = oid[0];..cmd[
c7a0: 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d  3] = oid[1];..cm
c7b0: 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a  d[4] = oid[2];..
c7c0: 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63  ./* 256 to indic
c7d0: 61 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20  ate the largest 
c7e0: 6d 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20  message size -- 
c7f0: 6e 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69  not clear if thi
c800: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68  s will work with
c810: 20 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f   all messages */
c820: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
c830: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
c840: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
c850: 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38  ISO7816, NISTSP8
c860: 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
c870: 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78  T_DATA, 0x3F, 0x
c880: 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  FF, sizeof(cmd),
c890: 20 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70   cmd, 256, &resp
c8a0: 63 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62  code, buffer, &b
c8b0: 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66  uffer_len);...if
c8c0: 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
c8d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
c8e0: 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
c8f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
c900: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
c910: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
c920: 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75  uffer");....retu
c930: 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61  rn(cackey_get_da
c940: 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c  ta(slot, buffer,
c950: 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e   init_buffer_len
c960: 2c 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66  , oid));..}...if
c970: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
c980: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
c990: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c9a0: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
c9b0: 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c  send_apdu() fail
c9c0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
c9d0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
c9e0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23  eturn(-1);..}..#
c9f0: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
ca00: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
ca10: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
ca20: 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20  .if (buffer_len 
ca30: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
ca40: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
ca50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61  EBUG_PRINTF("Rea
ca60: 64 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f  d bytes (buffer_
ca70: 6c 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78  len) exceeds max
ca80: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
ca90: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
caa0: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75  . (max = %li, bu
cab0: 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22  ffer_len = %lu)"
cac0: 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
cad0: 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
cae0: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65  gned long) buffe
caf0: 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  r_len);....retur
cb00: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
cb10: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  if.#endif...if (
cb20: 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20  buffer_len < 2) 
cb30: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
cb40: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45  _PRINTF("APDU GE
cb50: 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20  T DATA returned 
cb60: 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68  %lu bytes, which
cb70: 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f   is too short fo
cb80: 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70  r a BER-TLV resp
cb90: 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64  onse", (unsigned
cba0: 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65   long) buffer_le
cbb0: 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  n);....return(-1
cbc0: 29 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62  );..}...size = b
cbd0: 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66  uffer_len;..buff
cbe0: 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65  er_p = cackey_re
cbf0: 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75  ad_bertlv_tag(bu
cc00: 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65  ffer, &buffer_le
cc10: 6e 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26  n, 0x53, NULL, &
cc20: 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66  size);...if (buf
cc30: 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  fer_p == NULL) {
cc40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cc50: 50 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f  PRINTF("Tag deco
cc60: 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74  ding failed, ret
cc70: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e  urning in error.
cc80: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
cc90: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
cca0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47  EBUG_PRINTBUF("G
ccb0: 45 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c  ET DATA result",
ccc0: 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a   buffer, size);.
ccd0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cce0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
ccf0: 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61   in success, rea
cd00: 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75  d %lu bytes", (u
cd10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
cd20: 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69  ze);...return(si
cd30: 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ze);.}../*. * SY
cd40: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73  NPOSIS. *     ss
cd50: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
cd60: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
cd70: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
cd80: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
cd90: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
cda0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
cdb0: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
cdc0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
cdd0: 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  set);. *. * ARGU
cde0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
cdf0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
ce00: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
ce10: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
ce20: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
ce30: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
ce40: 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20  r *buffer. *    
ce50: 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65       [OUT] Buffe
ce60: 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  r. *. *     size
ce70: 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20  _t count. *     
ce80: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
ce90: 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74  tes to attempt t
cea0: 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20  o read. *. *    
ceb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
cec0: 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20  _or_v. *        
ced0: 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75   Select the T-bu
cee0: 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62  ffer (01) or V-b
cef0: 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65  uffer (02) to re
cf00: 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a  ad from.  . *. *
cf10: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74       size_t init
cf20: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20  ial_offset. *   
cf30: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68        Specify th
cf40: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
cf50: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a  n the read from.
cf60: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20   *. *. * RETURN 
cf70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69  VALUE. *     Thi
cf80: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
cf90: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
cfa0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
cfb0: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65  read, or -1 on e
cfc0: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  rror.. *. * NOTE
cfd0: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
cfe0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
cff0: 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  e_t cackey_read_
d000: 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61  buffer(struct ca
d010: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
d020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d030: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63  buffer, size_t c
d040: 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  ount, unsigned c
d050: 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65  har t_or_v, size
d060: 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  _t initial_offse
d070: 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  t) {..unsigned c
d080: 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72  har *init_buffer
d090: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63  ;..size_t init_c
d0a0: 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e  ount;..size_t in
d0b0: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
d0c0: 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  t;...size_t offs
d0d0: 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73  et = 0, max_offs
d0e0: 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09  et, max_count;..
d0f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d  unsigned char cm
d100: 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20  d[2];..uint16_t 
d110: 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73  respcode;..int s
d120: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
d130: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d140: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69  Called.");...ini
d150: 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65  t_buffer = buffe
d160: 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d  r;..init_count =
d170: 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e   count;..init_in
d180: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69  itial_offset = i
d190: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a  nitial_offset;..
d1a0: 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f  .max_offset = co
d1b0: 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20  unt;..max_count 
d1c0: 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54  = CACKEY_APDU_MT
d1d0: 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20  U;...if (t_or_v 
d1e0: 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21  != 1 && t_or_v !
d1f0: 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 2) {...CACKEY_
d200: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
d210: 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72  valid T or V par
d220: 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64  ameter specified
d230: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d240: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
d250: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d  urn(-1);..}...cm
d260: 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a  d[0] = t_or_v;..
d270: 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69  .while (1) {...i
d280: 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78  f (offset >= max
d290: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41  _offset) {....CA
d2a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d2b0: 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d  F("Buffer too sm
d2c0: 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77  all, returning w
d2d0: 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b  hat we got...");
d2e0: 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
d2f0: 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f  ...count = max_o
d300: 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a  ffset - offset;.
d310: 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61  ..if (count > ma
d320: 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f  x_count) {....co
d330: 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b  unt = max_count;
d340: 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d  ...}....cmd[1] =
d350: 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f   count;....send_
d360: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
d370: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
d380: 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f  IS_CLASS_GLOBAL_
d390: 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f  PLATFORM, GSCIS_
d3a0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45  INSTR_READ_BUFFE
d3b0: 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66  R, ((initial_off
d3c0: 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e  set + offset) >>
d3d0: 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69   8) & 0xff, (ini
d3e0: 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66  tial_offset + of
d3f0: 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69  fset) & 0xff, si
d400: 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20  zeof(cmd), cmd, 
d410: 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c  0x00, &respcode,
d420: 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74   buffer + offset
d430: 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66  , &count);....if
d440: 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
d450: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
d460: 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  Y) {....CACKEY_D
d470: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
d480: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
d490: 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20  , retrying read 
d4a0: 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65  buffer");.....re
d4b0: 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64  turn(cackey_read
d4c0: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e  _buffer(slot, in
d4d0: 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f  it_buffer, init_
d4e0: 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69  count, t_or_v, i
d4f0: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
d500: 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  et));...}....if 
d510: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
d520: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d530: 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
d540: 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09   == 0x6A86) {...
d550: 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20  ..if (max_count 
d560: 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65  == 1) {......bre
d570: 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d  ak;.....}......m
d580: 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63  ax_count = max_c
d590: 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63  ount / 2;......c
d5a0: 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
d5b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d5c0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
d5d0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
d5e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
d5f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65  ailure");.....re
d600: 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
d610: 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74  .offset += count
d620: 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c  ;....if (count <
d630: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
d640: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d650: 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64  INTF("Short read
d660: 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20   -- count = %i, 
d670: 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69  cmd[1] = %i", (i
d680: 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29  nt) count, (int)
d690: 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72   cmd[1]);.....br
d6a0: 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  eak;...}..}..#if
d6b0: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
d6c0: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
d6d0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
d6e0: 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53  f (offset > _POS
d6f0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
d700: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d710: 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78  RINTF("Offset ex
d720: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
d730: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
d740: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
d750: 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20  = %li, offset = 
d760: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
d770: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
d780: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
d790: 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75  offset);....retu
d7a0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
d7b0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  dif.#endif...CAC
d7c0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d7d0: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
d7e0: 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75  uccess, read %lu
d7f0: 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e   bytes", (unsign
d800: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
d810: 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65  ;...return(offse
d820: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
d830: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
d840: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73  key_ret cackey_s
d850: 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72  elect_applet(str
d860: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d870: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
d880: 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f  char *aid, size_
d890: 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  t aid_len);. *. 
d8a0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
d8b0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
d8c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
d8d0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
d8e0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
d8f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
d900: 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20  ed char *aid. * 
d910: 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63          Buffer c
d920: 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74  ontaining Applet
d930: 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a   ID to select. *
d940: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61  . *     size_t a
d950: 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  id_len. *       
d960: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
d970: 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28  s in the "aid" (
d980: 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d  Applet ID) param
d990: 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52  eter. *. * RETUR
d9a0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
d9b0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
d9c0: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
d9d0: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
d9e0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
d9f0: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
da00: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
da10: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
da20: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
da30: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
da40: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
da50: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
da60: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20  gned char *aid, 
da70: 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20  size_t aid_len) 
da80: 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b  {..int send_ret;
da90: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
daa0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
dab0: 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
dac0: 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65  G_PRINTBUF("Sele
dad0: 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20  cting applet:", 
dae0: 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a  aid, aid_len);..
daf0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
db00: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
db10: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
db20: 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
db30: 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49  STR_SELECT, GSCI
db40: 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41  S_PARAM_SELECT_A
db50: 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64  PPLET, 0x00, aid
db60: 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c  _len, aid, 0x00,
db70: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
db80: 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  L);...if (send_r
db90: 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
dba0: 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43  C_E_RETRY) {...C
dbb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dbc0: 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67  TF("ADPU Sending
dbd0: 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e   failed, retryin
dbe0: 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22  g select applet"
dbf0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63  );....return(cac
dc00: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
dc10: 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64  t(slot, aid, aid
dc20: 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20  _len));..}...if 
dc30: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
dc40: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
dc50: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
dc60: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
dc70: 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72  o open applet, r
dc80: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
dc90: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
dca0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
dcb0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
dcc0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dcd0: 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20  F("Successfully 
dce0: 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b  selected file");
dcf0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
dd00: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
dd10: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
dd20: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
dd30: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
dd40: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
dd50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
dd60: 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20  nt16_t ef);. *. 
dd70: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
dd80: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
dd90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
dda0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
ddb0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
ddc0: 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36   *. *     uint16
ddd0: 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20  _t ef. *        
dde0: 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20   Elemental File 
ddf0: 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20  to select. *. * 
de00: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
de10: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
de20: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20  S_OK         On 
de30: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
de40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
de50: 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72  ERIC    On error
de60: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
de70: 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73      This selects
de80: 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46   an Elementary F
de90: 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74  ile (EF) under t
dea0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c  he currently sel
deb0: 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64  ected. *     Ded
dec0: 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29  icated File (DF)
ded0: 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63  . *. *     Typic
dee0: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c  ally this is cal
def0: 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74  led after select
df00: 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20  ing the correct 
df10: 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a  Applet (using. *
df20: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65       cackey_sele
df30: 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56  ct_applet) for V
df40: 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73  M cards. *. */.s
df50: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
df60: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
df70: 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65  ile(struct cacke
df80: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69  y_slot *slot, ui
df90: 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e  nt16_t ef) {..un
dfa0: 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f  signed char fid_
dfb0: 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e  buf[2];..int sen
dfc0: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
dfd0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
dfe0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70  lled.");.../* Op
dff0: 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72  en the elementar
e000: 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62  y file */..fid_b
e010: 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38  uf[0] = (ef >> 8
e020: 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62  ) & 0xff;..fid_b
e030: 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66  uf[1] = ef & 0xf
e040: 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  f;...CACKEY_DEBU
e050: 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74  G_PRINTF("Select
e060: 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22  ing file: %04lx"
e070: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e080: 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65  ) ef);...send_re
e090: 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
e0a0: 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
e0b0: 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
e0c0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
e0d0: 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20  CT, 0x02, 0x0C, 
e0e0: 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c  sizeof(fid_buf),
e0f0: 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20   fid_buf, 0x00, 
e100: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
e110: 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  );..if (send_ret
e120: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
e130: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
e140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
e150: 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69  ailed to open fi
e160: 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  le, returning in
e170: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e180: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
e190: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
e1a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e1b0: 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73 66  PRINTF("Successf
e1c0: 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69  ully selected fi
e1d0: 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  le");...return(C
e1e0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
e1f0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
e200: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
e210: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
e220: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e230: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b  v_entity *root);
e240: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
e250: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
e260: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
e270: 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20   *root. *       
e280: 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c    Root of the TL
e290: 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20  V list to start 
e2a0: 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45  freeing. *. * RE
e2b0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
e2c0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54    None. *. * NOT
e2d0: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
e2e0: 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68  unction frees th
e2f0: 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73  e TLV linked lis
e300: 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ted returned fro
e310: 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79  m. *     "cackey
e320: 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a  _read_tlv". *. *
e330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  /.static void ca
e340: 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74  ckey_free_tlv(st
e350: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e360: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a  entity *root) {.
e370: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
e380: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c  lv_entity *curr,
e390: 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f   *next;...if (ro
e3a0: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
e3b0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
e3c0: 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63   (curr = root; c
e3d0: 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74  urr; curr = next
e3e0: 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72  ) {...next = cur
e3f0: 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69  r->_next;....swi
e400: 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20  tch (curr->tag) 
e410: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
e420: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
e430: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
e440: 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09  _CERTIFICATE:...
e450: 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75  ..if (curr->valu
e460: 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
e470: 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09  urr->value);....
e480: 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
e490: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e4a0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20  CARDURL:.....if 
e4b0: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
e4c0: 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65  durl) {......fre
e4d0: 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  e(curr->value_ca
e4e0: 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09  rdurl);.....}...
e4f0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
e500: 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a  free(curr);..}..
e510: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
e520: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
e530: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
e540: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
e550: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
e560: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
e570: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
e580: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
e590: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
e5a0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61  y_tlv_entity *ca
e5b0: 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74  ckey_read_tlv(st
e5c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
e5d0: 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63   *slot) {..struc
e5e0: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e5f0: 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79  ity *curr_entity
e600: 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20  , *root = NULL, 
e610: 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75  *last = NULL;..u
e620: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65  nsigned char tle
e630: 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62  n_buf[2], tval_b
e640: 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b  uf[1024], *tval;
e650: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e660: 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61  vlen_buf[2], vva
e670: 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76  l_buf[8192], *vv
e680: 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  al;..unsigned ch
e690: 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73  ar *tmpbuf;..uns
e6a0: 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75  igned long tmpbu
e6b0: 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74  flen;..ssize_t t
e6c0: 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a  len, vlen;..ssiz
e6d0: 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73  e_t read_ret;..s
e6e0: 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d  ize_t offset_t =
e6f0: 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30   0, offset_v = 0
e700: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
e710: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
e720: 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56  ngth;.#ifdef HAV
e730: 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f  E_LIBZ..int unco
e740: 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64  mpress_ret;.#end
e750: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
e760: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
e770: 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20  .");...read_ret 
e780: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
e790: 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f  ffer(slot, tlen_
e7a0: 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e  buf, sizeof(tlen
e7b0: 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74  _buf), 1, offset
e7c0: 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  _t);..if (read_r
e7d0: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65  et != sizeof(tle
e7e0: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  n_buf)) {...CACK
e7f0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e800: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65  "Read failed, re
e810: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e820: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e830: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e  NULL);..}...tlen
e840: 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20   = (tlen_buf[1] 
e850: 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66  << 8) | tlen_buf
e860: 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20  [0];...read_ret 
e870: 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  = cackey_read_bu
e880: 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f  ffer(slot, vlen_
e890: 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e  buf, sizeof(vlen
e8a0: 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74  _buf), 2, offset
e8b0: 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72  _v);..if (read_r
e8c0: 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65  et != sizeof(vle
e8d0: 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b  n_buf)) {...CACK
e8e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e8f0: 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65  "Read failed, re
e900: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e910: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e920: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e  NULL);..}...vlen
e930: 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20   = (vlen_buf[1] 
e940: 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66  << 8) | vlen_buf
e950: 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  [0];...CACKEY_DE
e960: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20  BUG_PRINTF("Tag 
e970: 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61  Length = %lu, Va
e980: 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75  lue Length = %lu
e990: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
e9a0: 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e  g) tlen, (unsign
e9b0: 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a  ed long) vlen);.
e9c0: 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b  ..offset_t += 2;
e9d0: 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b  ..offset_v += 2;
e9e0: 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69  ...if (tlen > si
e9f0: 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20  zeof(tval_buf)) 
ea00: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
ea10: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e  _PRINTF("Tag len
ea20: 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  gth is too large
ea30: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ea40: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
ea50: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
ea60: 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f  if (vlen > sizeo
ea70: 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09  f(vval_buf)) {..
ea80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ea90: 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67  INTF("Value leng
eaa0: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
eab0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
eac0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
ead0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
eae0: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
eaf0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
eb00: 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65  t, tval_buf, tle
eb10: 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b  n, 1, offset_t);
eb20: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
eb30: 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  = tlen) {...CACK
eb40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
eb50: 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "Unable to read 
eb60: 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c  entire T-buffer,
eb70: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
eb80: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
eb90: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72  rn(NULL);..}...r
eba0: 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ead_ret = cackey
ebb0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f  _read_buffer(slo
ebc0: 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65  t, vval_buf, vle
ebd0: 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b  n, 2, offset_v);
ebe0: 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21  ..if (read_ret !
ebf0: 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b  = vlen) {...CACK
ec00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ec10: 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "Unable to read 
ec20: 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c  entire V-buffer,
ec30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
ec40: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
ec50: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
ec60: 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a  val = tval_buf;.
ec70: 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66  .vval = vval_buf
ec80: 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e  ;..while (tlen >
ec90: 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20   0 && vlen > 0) 
eca0: 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b  {...tag = *tval;
ecb0: 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65  ...tval++;...tle
ecc0: 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61  n--;....if (*tva
ecd0: 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09  l == 0xff) {....
ece0: 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32  length = (tval[2
ecf0: 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31  ] << 8) | tval[1
ed00: 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b  ];....tval += 3;
ed10: 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09  ....tlen -= 3;..
ed20: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e  .} else {....len
ed30: 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09  gth = *tval;....
ed40: 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d  tval++;....tlen-
ed50: 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  -;...}....CACKEY
ed60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
ed70: 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20  ag: %s (%02x)", 
ed80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
ed90: 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67  C_TAG_TO_STR(tag
eda0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ), (unsigned int
edb0: 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59  ) tag);...CACKEY
edc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
edd0: 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20  "Value:", vval, 
ede0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72  length);....curr
edf0: 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  _entity = NULL;.
ee00: 09 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b  ..switch (tag) {
ee10: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
ee20: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09  AG_CARDURL:.....
ee30: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
ee40: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
ee50: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  r_entity));.....
ee60: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
ee70: 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c  ue_cardurl = mal
ee80: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
ee90: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
eea0: 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d  ardurl));......m
eeb0: 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74  emcpy(curr_entit
eec0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
eed0: 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b  ->rid, vval, 5);
eee0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
eef0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
ef00: 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b  >apptype = vval[
ef10: 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  5];.....curr_ent
ef20: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
ef30: 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28  rl->objectid = (
ef40: 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20  vval[6] << 8) | 
ef50: 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72  vval[7];.....cur
ef60: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
ef70: 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d  cardurl->appid =
ef80: 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20   (vval[8] << 8) 
ef90: 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09  | vval[9];......
efa0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
efb0: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
efc0: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
efd0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
efe0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
eff0: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
f000: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
f010: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
f020: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
f030: 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c  ....tmpbuf = mal
f040: 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09  loc(length);....
f050: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
f060: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
f070: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f080: 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09  ->tag = tag;....
f090: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65  .curr_entity->le
f0a0: 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  ngth = length;..
f0b0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f0c0: 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a  value = tmpbuf;.
f0d0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f0e0: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
f0f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
f100: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  se GSCIS_TAG_CER
f110: 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75  TIFICATE:.....cu
f120: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f130: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f140: 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65  entity));..#ifde
f150: 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09  f HAVE_LIBZ.....
f160: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67  tmpbuflen = leng
f170: 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62  th * 2;.....tmpb
f180: 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
f190: 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63  uflen);......unc
f1a0: 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e  ompress_ret = un
f1b0: 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c  compress(tmpbuf,
f1c0: 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61   &tmpbuflen, vva
f1d0: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
f1e0: 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72  if (uncompress_r
f1f0: 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09  et != Z_OK) {...
f200: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
f210: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
f220: 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e  o decompress, un
f230: 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72  compress() retur
f240: 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74  ned %i -- resort
f250: 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f  ing to direct co
f260: 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f  py", uncompress_
f270: 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62  ret);.......tmpb
f280: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a  uflen = length;.
f290: 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
f2a0: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
f2b0: 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
f2c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
f2d0: 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65  BUF("Decompresse
f2e0: 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20  d to:", tmpbuf, 
f2f0: 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73  tmpbuflen);.#els
f300: 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  e.....CACKEY_DEB
f310: 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69  UG_PRINTF("Missi
f320: 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c  ng ZLIB Support,
f330: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
f340: 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c  e is likely usel
f350: 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74  ess...");......t
f360: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
f370: 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  h;.....memcpy(tm
f380: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
f390: 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09  th);.#endif.....
f3a0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
f3b0: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
f3c0: 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68  r_entity->length
f3d0: 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09   = tmpbuflen;...
f3e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
f3f0: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
f400: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f410: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
f420: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f430: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
f440: 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  15:.....curr_ent
f450: 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  ity = malloc(siz
f460: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
f470: 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  ));......curr_en
f480: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
f490: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f4a0: 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76  ->value_byte = v
f4b0: 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72  val[0];.....curr
f4c0: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
f4d0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
f4e0: 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b  k;...}....vval +
f4f0: 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e  = length;...vlen
f500: 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69   -= length;....i
f510: 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21  f (curr_entity !
f520: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
f530: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
f540: 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72  .....root = curr
f550: 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09  _entity;....}...
f560: 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55  ..if (last != NU
f570: 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e  LL) {.....last->
f580: 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74  _next = curr_ent
f590: 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61  ity;....}.....la
f5a0: 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  st = curr_entity
f5b0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72  ;...}..}...retur
f5c0: 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20  n(root);.}../*. 
f5d0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
f5e0: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
f5f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
f600: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
f610: 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
f620: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
f630: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
f640: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
f650: 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63  free_certs(struc
f660: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
f670: 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73  entity *start, s
f680: 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74  ize_t count, int
f690: 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09   free_start) {..
f6a0: 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66  size_t idx;...if
f6b0: 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (start == NULL)
f6c0: 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a   {...return;..}.
f6d0: 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
f6e0: 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78  idx < count; idx
f6f0: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72  ++) {...if (star
f700: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
f710: 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74  te) {....free(st
f720: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
f730: 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  cate);...}..}...
f740: 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 29 20  if (free_start) 
f750: 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 29 3b  {...free(start);
f760: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a  ..}...return;.}.
f770: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
f780: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
f790: 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79  ity *cackey_copy
f7a0: 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
f7b0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f7c0: 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74  ty *dest, struct
f7d0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f7e0: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
f7f0: 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73  ze_t count) {..s
f800: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20  ize_t idx;...if 
f810: 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (start == NULL) 
f820: 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  {...return(NULL)
f830: 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20  ;..}...if (dest 
f840: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73  == NULL) {...des
f850: 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  t = malloc(sizeo
f860: 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74  f(*dest) * count
f870: 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
f880: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
f890: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65  t; idx++) {...de
f8a0: 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20  st[idx].id_type 
f8b0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f  = start[idx].id_
f8c0: 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20  type;....switch 
f8d0: 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79  (dest[idx].id_ty
f8e0: 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
f8f0: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
f900: 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73  :.....memcpy(des
f910: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f920: 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64  applet, start[id
f930: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  x].card.cac.appl
f940: 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b  et, sizeof(dest[
f950: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
f960: 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74  plet));.....dest
f970: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66  [idx].card.cac.f
f980: 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  ile = start[idx]
f990: 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a  .card.cac.file;.
f9a0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
f9b0: 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
f9c0: 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b  E_PIV:.....dest[
f9d0: 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65  idx].card.piv.ke
f9e0: 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78  y_id = start[idx
f9f0: 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69  ].card.piv.key_i
fa00: 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65  d;.....memcpy(de
fa10: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76  st[idx].card.piv
fa20: 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b 69 64  .label, start[id
fa30: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  x].card.piv.labe
fa40: 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  l, sizeof(dest[i
fa50: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62  dx].card.piv.lab
fa60: 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  el));.....break;
fa70: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
fa80: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
fa90: 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  Y:.....break;...
faa0: 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65  }...dest[idx].ce
fab0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
fac0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
fad0: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65  ficate_len;...de
fae0: 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20  st[idx].keysize 
faf0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79  = start[idx].key
fb00: 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64  size;....dest[id
fb10: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d  x].certificate =
fb20: 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78   malloc(dest[idx
fb30: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
fb40: 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73  n);...memcpy(des
fb50: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
fb60: 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  te, start[idx].c
fb70: 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74  ertificate, dest
fb80: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fb90: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_len);..}...ret
fba0: 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a  urn(dest);.}../*
fbb0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
fbc0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
fbd0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
fbe0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
fbf0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
fc00: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
fc10: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
fc20: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
fc30: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
fc40: 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63  y *cackey_read_c
fc50: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
fc60: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
fc70: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
fc80: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74  c_identity *cert
fc90: 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
fca0: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75   *count) {..stru
fcb0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
fcc0: 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
fcd0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
fce0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63  _tlv_entity *ccc
fcf0: 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c  _tlv, *ccc_curr,
fd00: 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f   *app_tlv, *app_
fd10: 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  curr;..unsigned 
fd20: 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d  char ccc_aid[] =
fd30: 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d   {GSCIS_AID_CCC}
fd40: 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e  , piv_aid[] = {N
fd50: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49  ISTSP800_73_3_PI
fd60: 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65  V_AID};..unsigne
fd70: 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c  d char *piv_oid,
fd80: 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68   piv_oid_pivauth
fd90: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
fda0: 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48  73_3_OID_PIVAUTH
fdb0: 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61  }, piv_oid_signa
fdc0: 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  ture[] = {NISTSP
fdd0: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
fde0: 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64  NATURE}, piv_oid
fdf0: 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53  _keymgt[] = {NIS
fe00: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
fe10: 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e  KEYMGT};..unsign
fe20: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
fe30: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  [7];..unsigned c
fe40: 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d  har buffer[8192]
fe50: 2c 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 75 6e  , *buffer_p;..un
fe60: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74 69  signed long outi
fe70: 64 78 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a 70  dx = 0;..char *p
fe80: 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61 63 6b 65  iv_label;..cacke
fe90: 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69 6f  y_ret transactio
fea0: 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74 20  n_ret;..ssize_t 
feb0: 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f  read_ret;..size_
fec0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 69  t buffer_len;..i
fed0: 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62  nt certs_resizab
fee0: 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  le;..int send_re
fef0: 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09  t, select_ret;..
ff00: 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76  int piv_key, piv
ff10: 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a   = 0;..int idx;.
ff20: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ff30: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
ff40: 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d  ;...if (count ==
ff50: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
ff60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ff70: 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72  count is NULL, r
ff80: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ff90: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
ffa0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
ffb0: 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20  (certs != NULL) 
ffc0: 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d  {...if (*count =
ffd0: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
ffe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
fff0: 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75  equested we retu
10000 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68  rn 0 objects, sh
10010 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a  ort-circuit");..
10020 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
10030 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21  ;...}..}...if (!
10040 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74  slot->slot_reset
10050 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e  ) {...if (slot->
10060 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a  cached_certs) {.
10070 09 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20  ...if (certs == 
10080 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74  NULL) {.....cert
10090 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
100a0 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74  f(*certs) * slot
100b0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
100c0 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e  ount);.....*coun
100d0 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  t = slot->cached
100e0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09  _certs_count;...
100f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
10100 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d   (*count > slot-
10110 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10120 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  unt) {......*cou
10130 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt = slot->cache
10140 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09  d_certs_count;..
10150 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
10160 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
10170 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
10180 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e  hed_certs, *coun
10190 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  t);.....return(c
101a0 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
101b0 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
101c0 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b  _certs) {...cack
101d0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c  ey_free_certs(sl
101e0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
101f0 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
10200 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a  erts_count, 1);.
10210 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ...slot->cached_
10220 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  certs = NULL;..}
10230 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
10240 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
10250 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
10260 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
10270 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
10280 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
10290 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
102a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
102b0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
102c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
102d0 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
102e0 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
102f0 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
10300 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
10310 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
10320 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
10330 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
10340 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
10350 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
10360 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
10370 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
10380 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
10390 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
103a0 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
103b0 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
103c0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
103d0 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
103e0 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
103f0 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
10400 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
10410 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
10420 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69  /* Try PIV appli
10430 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64  cation */...send
10440 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
10450 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
10460 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f  , piv_aid, sizeo
10470 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69  f(piv_aid));...i
10480 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
10490 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
104a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
104b0 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
104c0 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d  ve a PIV card --
104d0 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43   not using the C
104e0 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d  CC, pulling pre-
104f0 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b  selected keys");
10500 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09  .....piv = 1;...
10510 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
10520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10530 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63  "Unable to selec
10540 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65  t CCC Applet, re
10550 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10560 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72  re");...../* Ter
10570 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
10580 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
10590 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
105a0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
105b0 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  .....return(NULL
105c0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
105d0 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64  piv) {...for (id
105e0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20  x = 0; idx < 3; 
105f0 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74  idx++) {....swit
10600 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63  ch (idx) {.....c
10610 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f  ase 0:......piv_
10620 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69  oid = piv_oid_pi
10630 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f  vauth;......piv_
10640 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f  key = NISTSP800_
10650 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48  78_3_KEY_PIVAUTH
10660 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
10670 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61 74 69   = "Authenticati
10680 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  on";......break;
10690 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09  .....case 1:....
106a0 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f  ..piv_oid = piv_
106b0 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09  oid_signature;..
106c0 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
106d0 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
106e0 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09  _SIGNATURE;.....
106f0 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 53 69  .piv_label = "Si
10700 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09 09 62  gnature";......b
10710 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32  reak;.....case 2
10720 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
10730 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b   piv_oid_keymgt;
10740 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
10750 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
10760 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09  EY_KEYMGT;......
10770 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b 65 79  piv_label = "Key
10780 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a 09 09   Management";...
10790 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
107a0 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61  ...read_ret = ca
107b0 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c  ckey_get_data(sl
107c0 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  ot, buffer, size
107d0 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f  of(buffer), piv_
107e0 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  oid);.....if (re
107f0 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09  ad_ret <= 0) {..
10800 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10810 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20  }.....curr_id = 
10820 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a  &certs[outidx];.
10830 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09  ...outidx++;....
10840 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a  .curr_id->keysiz
10850 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f  e = -1;....curr_
10860 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41  id->id_type = CA
10870 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
10880 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  ;....curr_id->ca
10890 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20  rd.piv.key_id = 
108a0 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65 6d 63  piv_key;....memc
108b0 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  py(curr_id->card
108c0 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69 76 5f  .piv.label, piv_
108d0 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28 70 69  label, strlen(pi
108e0 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b 0a 0a  v_label) + 1);..
108f0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10900 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72 65  ificate_len = re
10910 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72 5f  ad_ret;....curr_
10920 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
10930 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
10940 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10950 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72 5f 6c  n);.....buffer_l
10960 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75 66 66  en = sizeof(buff
10970 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72 5f 70  er);....buffer_p
10980 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
10990 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66 65 72  ertlv_tag(buffer
109a0 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c 20 30  , &buffer_len, 0
109b0 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  x70, curr_id->ce
109c0 72 74 69 66 69 63 61 74 65 2c 20 26 63 75 72 72  rtificate, &curr
109d0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
109e0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 62  _len);.....if (b
109f0 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29  uffer_p == NULL)
10a00 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10a10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
10a20 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
10a30 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72 65 73  from BER-TLV res
10a40 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20 73 6b  ponse failed, sk
10a50 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22 2c 20  ipping key %i", 
10a60 69 64 78 29 3b 0a 09 09 09 09 66 72 65 65 28 63  idx);.....free(c
10a70 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10a80 61 74 65 29 3b 0a 0a 09 09 09 09 6f 75 74 69 64  ate);......outid
10a90 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e  x--;......contin
10aa0 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20  ue;....}...}..} 
10ab0 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64  else {.../* Read
10ac0 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
10ad0 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
10ae0 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76  TLV */...ccc_tlv
10af0 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
10b00 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20  lv(slot);..../* 
10b10 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c  Look for CARDURL
10b20 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e  s that coorespon
10b30 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73  d to PKI applets
10b40 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63   */...for (ccc_c
10b50 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
10b60 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
10b70 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
10b80 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
10b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
10ba0 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
10bb0 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
10bc0 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
10bd0 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
10be0 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75  ;.....if (ccc_cu
10bf0 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
10c00 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
10c10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10c20 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10c30 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10c40 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
10c50 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
10c60 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10c70 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
10c80 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10c90 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
10ca0 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
10cb0 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
10cc0 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43  P_PKI) {.....CAC
10cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10ce0 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
10cf0 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
10d00 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
10d10 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
10d20 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
10d30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
10d40 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
10d50 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
10d60 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10d70 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
10d80 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
10d90 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10da0 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
10db0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10dc0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10dd0 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
10de0 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
10df0 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
10e00 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
10e10 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10e20 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  rid));....CACKEY
10e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
10e40 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
10e50 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
10e60 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
10e70 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10e80 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
10e90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10ea0 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
10eb0 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
10ec0 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
10ed0 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63  UG_PRINTF("Objec
10ee0 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  tID = %s/%04lx",
10ef0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
10f00 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
10f10 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10f20 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
10f30 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
10f40 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
10f50 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
10f60 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63  ectid);.....memc
10f70 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
10f80 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
10f90 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
10fa0 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
10fb0 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
10fc0 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69  ;....curr_aid[si
10fd0 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
10fe0 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d   2] = (ccc_curr-
10ff0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
11000 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78  appid >> 8) & 0x
11010 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ff;....curr_aid[
11020 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
11030 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72   - 1] = ccc_curr
11040 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
11050 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a  >appid & 0xff;..
11060 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
11070 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
11080 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11090 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
110a0 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
110b0 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
110c0 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28  r_aid));....if (
110d0 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
110e0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
110f0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
11100 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
11110 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
11120 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
11130 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11140 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11150 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11160 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
11170 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
11180 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
11190 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
111a0 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
111b0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
111c0 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66  objectid);....if
111d0 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
111e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
111f0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
11200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
11210 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
11220 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
11230 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
11240 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
11250 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
11260 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69  ../* Process thi
11270 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f  s file's TLV loo
11280 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69  king for certifi
11290 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f  cates */....app_
112a0 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
112b0 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09  d_tlv(slot);....
112c0 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20  ..for (app_curr 
112d0 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63  = app_tlv; app_c
112e0 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20  urr; app_curr = 
112f0 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29  app_curr->_next)
11300 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
11310 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
11320 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
11330 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
11340 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
11350 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66  r->tag));.....if
11360 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
11370 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
11380 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
11390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
113a0 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
113b0 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
113c0 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
113d0 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
113e0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
113f0 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20  .}......curr_id 
11400 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
11410 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ;.....outidx++;.
11420 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 69 64  .....curr_id->id
11430 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f 49  _type = CACKEY_I
11440 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09 09 09  D_TYPE_CAC;.....
11450 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
11460 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
11470 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f   curr_aid, sizeo
11480 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11490 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
114a0 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  ..curr_id->card.
114b0 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63 5f 63  cac.file = ccc_c
114c0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
114d0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a 09 09  rl->objectid;...
114e0 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69  ..curr_id->keysi
114f0 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09 43 41  ze = -1;......CA
11500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11510 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72 72 5f  F("Filling curr_
11520 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11530 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25 6c  let (%p) with %l
11540 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72 5f  u bytes:", curr_
11550 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
11560 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  let, (unsigned l
11570 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75 72 72  ong) sizeof(curr
11580 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
11590 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b  plet));.....CACK
115a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
115b0 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69  F("VAL:", curr_i
115c0 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
115d0 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  et, sizeof(curr_
115e0 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  id->card.cac.app
115f0 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75 72 72  let));......curr
11600 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11610 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d  _len = app_curr-
11620 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75  >length;......cu
11630 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11640 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
11650 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
11660 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
11670 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  y(curr_id->certi
11680 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75 72 72  ficate, app_curr
11690 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f 69 64  ->value, curr_id
116a0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
116b0 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 75 74  n);......if (out
116c0 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b  idx >= *count) {
116d0 0a 09 09 09 09 09 69 66 20 28 63 65 72 74 73 5f  ......if (certs_
116e0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09  resizable) {....
116f0 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a  ...*count *= 2;.
11700 09 09 09 09 09 09 63 65 72 74 73 20 3d 20 72 65  ......certs = re
11710 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a  alloc(certs, siz
11720 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a  eof(*certs) * (*
11730 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09 7d 20  count));......} 
11740 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62 72 65  else {.......bre
11750 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
11760 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
11770 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c  _free_tlv(app_tl
11780 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75 74 69  v);.....if (outi
11790 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a  dx >= *count) {.
117a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
117b0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
117c0 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b  ee_tlv(ccc_tlv);
117d0 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f  ..}...*count = o
117e0 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63 65 72  utidx;...if (cer
117f0 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
11800 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f  ..certs = reallo
11810 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28  c(certs, sizeof(
11820 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e  *certs) * (*coun
11830 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  t));..}...slot->
11840 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 63  cached_certs = c
11850 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73  ackey_copy_certs
11860 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63  (NULL, certs, *c
11870 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61  ount);..slot->ca
11880 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
11890 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20   = *count;.../* 
118a0 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
118b0 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
118c0 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
118d0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
118e0 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72 74 73  ;...return(certs
118f0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
11900 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OSIS. *     ....
11910 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
11920 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
11930 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
11940 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e       .... *. * N
11950 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  OTES. *     ....
11960 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
11970 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73 69 67  ize_t cackey_sig
11980 6e 64 65 63 72 79 70 74 28 73 74 72 75 63 74 20  ndecrypt(struct 
11990 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
119a0 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
119b0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
119c0 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ity, unsigned ch
119d0 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  ar *buf, size_t 
119e0 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  buflen, unsigned
119f0 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c 20 73   char *outbuf, s
11a00 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c  ize_t outbuflen,
11a10 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c 20 69   int padInput, i
11a20 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74 29 20  nt unpadOutput) 
11a30 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  {..cackey_pcsc_i
11a40 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65 3b 0a  d_type id_type;.
11a50 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64  .unsigned char d
11a60 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
11a70 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  [10];..unsigned 
11a80 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74  char *tmpbuf, *t
11a90 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66  mpbuf_s, *outbuf
11aa0 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b 0a 09  _s, *outbuf_p;..
11ab0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79  unsigned char by
11ac0 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c  tes_to_send, p1,
11ad0 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65   class;..unsigne
11ae0 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65  d char blocktype
11af0 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65  ;..cackey_ret se
11b00 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f  nd_ret;..uint16_
11b10 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69  t respcode;..ssi
11b20 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c  ze_t retval = 0,
11b30 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73   unpadoffset;..s
11b40 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c  ize_t tmpbuflen,
11b50 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62   padlen, tmpoutb
11b60 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f 6c 65  uflen, outbuf_le
11b70 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70  n;..int free_tmp
11b80 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65  buf = 0;..int le
11b90 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
11ba0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
11bb0 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d  ");...if (slot =
11bc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11be0 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73  "Error.  slot is
11bf0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
11c00 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
11c10 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (buf == NULL) {.
11c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11c30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62  RINTF("Error.  b
11c40 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
11c50 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11c60 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20  ..if (outbuf == 
11c70 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11c90 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73  rror.  outbuf is
11ca0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
11cb0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
11cc0 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
11cd0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
11ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11cf0 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20  r.  identity is 
11d00 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11d10 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
11d20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11d30 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
11d40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11d50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11d60 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
11d70 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c  _identity is NUL
11d80 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11d90 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65  1);..}...id_type
11da0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
11db0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74  c_identity->id_t
11dc0 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74 79 70  ype;..if (id_typ
11dd0 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
11de0 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b  YPE_CERT_ONLY) {
11df0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11e00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11e10 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11e20 64 65 6e 74 69 74 79 20 69 73 20 43 41 43 4b 45  dentity is CACKE
11e30 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
11e40 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f  NLY, which canno
11e50 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 69  t be used for si
11e60 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
11e70 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11e80 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
11e90 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
11ea0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
11eb0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
11ec0 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 62 72  _TYPE_CAC:....br
11ed0 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
11ee0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11ef0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11f00 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11f10 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 61  dentity is not a
11f20 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c 75 65   supported value
11f30 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25 6c 78  . Type is: 0x%lx
11f40 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c 20 43   (PIV = 0x%lx, C
11f50 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75  AC = 0x%lx)", (u
11f60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
11f70 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  _type, (unsigned
11f80 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
11f90 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e 73 69  _TYPE_PIV, (unsi
11fa0 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
11fb0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a  Y_ID_TYPE_CAC);.
11fc0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11fd0 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
11fe0 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73  e identity Key s
11ff0 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ize */..if (iden
12000 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12010 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30  ity->keysize < 0
12020 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e  ) {...identity->
12030 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12040 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f  eysize = x509_to
12050 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74  _keysize(identit
12060 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12070 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 69  ->certificate, i
12080 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12090 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
120a0 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  ate_len);..}.../
120b0 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f  * Pad message to
120c0 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   key size */..if
120d0 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09   (padInput) {...
120e0 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
120f0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12100 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69  size > 0) {....i
12110 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65  f (buflen != ide
12120 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12130 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b  tity->keysize) {
12140 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
12150 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  > (identity->pcs
12160 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12170 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09  ize + 3)) {.....
12180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65  INTF("Error.  Me
121a0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
121b0 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79  ge to sign/decry
121c0 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  pt");.......retu
121d0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09  rn(-1);.....}...
121e0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69  ...tmpbuflen = i
121f0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12200 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b  entity->keysize;
12210 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
12220 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
12230 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
12240 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65   = 1;......padle
12250 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20  n = tmpbuflen - 
12260 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09  buflen - 3;.....
12270 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45  ./* RSA PKCS#1 E
12280 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50  MSA-PKCS1-v1_5 P
12290 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d  adding */.....tm
122a0 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a  pbuf[0] = 0x00;.
122b0 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20  ....tmpbuf[1] = 
122c0 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74  0x01;.....memset
122d0 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46  (&tmpbuf[2], 0xF
122e0 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09  F, padlen);.....
122f0 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
12300 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65  2]= 0x00;.....me
12310 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64  mcpy(&tmpbuf[pad
12320 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62  len + 3], buf, b
12330 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43  uflen);......CAC
12340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
12350 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
12360 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
12370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12380 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
12390 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
123a0 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  flen);....} else
123b0 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20   {.....tmpbuf = 
123c0 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c  buf;.....tmpbufl
123d0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
123e0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
123f0 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  ;.....padlen = 0
12400 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
12410 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
12420 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
12430 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65   to determine ke
12440 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74  y size, hoping t
12450 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 72  he message is pr
12460 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 29  operly padded!")
12470 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62  ;.....tmpbuf = b
12480 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  uf;....tmpbuflen
12490 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72   = buflen;....fr
124a0 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
124b0 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
124c0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d  }..} else {...tm
124d0 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d  pbuf = buf;...tm
124e0 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
124f0 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ;...free_tmpbuf 
12500 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20  = 0;...padlen = 
12510 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  0;..}.../* Begin
12520 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
12530 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
12540 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
12550 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
12560 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09  rect applet */..
12570 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
12580 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
12590 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
125a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
125b0 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
125c0 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20  applet found at 
125d0 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74  %p ...", identit
125e0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
125f0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
12600 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  t);....cackey_se
12610 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
12620 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
12630 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e  _identity->card.
12640 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
12650 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
12660 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
12670 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
12680 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
12690 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09  rect file */....
126a0 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
126b0 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
126c0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
126d0 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 29  ->card.cac.file)
126e0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
126f0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12700 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75  E_PIV:....dyn_au
12710 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d  th_template[0] =
12720 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75   0x7C;....dyn_au
12730 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d  th_template[1] =
12740 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
12750 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d  th_template[2] =
12760 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36   ((tmpbuflen + 6
12770 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  ) & 0xff00) >> 8
12780 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12790 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70  mplate[3] = (tmp
127a0 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
127b0 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74  00ff;....dyn_aut
127c0 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20  h_template[4] = 
127d0 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
127e0 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20  h_template[5] = 
127f0 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x00;....dyn_aut
12800 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20  h_template[6] = 
12810 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x81;....dyn_aut
12820 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20  h_template[7] = 
12830 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
12840 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20  h_template[8] = 
12850 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66  (tmpbuflen & 0xf
12860 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79  f00) >> 8;....dy
12870 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
12880 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
12890 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 73 65 6e   0x00ff;.....sen
128a0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
128b0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 30  end_apdu(slot, 0
128c0 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  x10, NISTSP800_7
128d0 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
128e0 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  H, NISTSP800_78_
128f0 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20  3_ALGO_RSA2048, 
12900 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12910 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
12920 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a 65 6f 66  v.key_id, sizeof
12930 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
12940 74 65 29 2c 20 64 79 6e 5f 61 75 74 68 5f 74 65  te), dyn_auth_te
12950 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c 20 4e 55  mplate, 0x00, NU
12960 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
12970 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
12980 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12990 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62  _CERT_ONLY:....b
129a0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75  reak;..}...tmpbu
129b0 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f  f_s = tmpbuf;..o
129c0 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66  utbuf_s = outbuf
129d0 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66  ;..while (tmpbuf
129e0 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62  len) {...tmpoutb
129f0 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65  uflen = outbufle
12a00 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66  n;....if (tmpbuf
12a10 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
12a20 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65  U_MTU) {....byte
12a30 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b  s_to_send = CACK
12a40 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
12a50 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
12a60 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
12a70 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e  flen;...}....sen
12a80 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50  d_ret = CACKEY_P
12a90 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09  CSC_E_GENERIC;..
12aa0 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
12ab0 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
12ac0 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
12ad0 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
12ae0 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
12af0 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d  MTU) {......p1 =
12b00 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x80;......le =
12b10 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
12b20 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78  e {......p1 = 0x
12b30 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  00;......le = 0x
12b40 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  00;.....}......s
12b50 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
12b60 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
12b70 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
12b80 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53  BAL_PLATFORM, GS
12b90 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
12ba0 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c  CRYPT, p1, 0x00,
12bb0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
12bc0 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
12bd0 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
12be0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
12bf0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12c00 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12c10 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d  _PIV:.....if (tm
12c20 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
12c30 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
12c40 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a  ..class = 0x10;.
12c50 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
12c60 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
12c70 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f  ..class = GSCIS_
12c80 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09  CLASS_ISO7816;..
12c90 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09  ....le = 256;...
12ca0 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
12cb0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
12cc0 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73  apdu(slot, class
12cd0 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  , NISTSP800_73_3
12ce0 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20  _INSTR_GENAUTH, 
12cf0 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41  NISTSP800_78_3_A
12d00 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65  LGO_RSA2048, ide
12d10 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12d20 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b  tity->card.piv.k
12d30 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f  ey_id, bytes_to_
12d40 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
12d50 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
12d60 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
12d70 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  en);.....break;.
12d80 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
12d90 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
12da0 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
12db0 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
12dc0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
12dd0 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 66  S_OK) {....if (f
12de0 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
12df0 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20  ..if (tmpbuf_s) 
12e00 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70 62  {......free(tmpb
12e10 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09  uf_s);.....}....
12e20 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61  }...../* End tra
12e30 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
12e40 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
12e50 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
12e60 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
12e70 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
12e80 45 54 52 59 29 20 7b 0a 09 09 09 09 43 41 43 4b  ETRY) {.....CACK
12e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12ea0 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
12eb0 69 6c 65 64 20 2d 2d 20 72 65 74 72 79 69 6e 67  iled -- retrying
12ec0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
12ed0 28 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72  (cackey_signdecr
12ee0 79 70 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ypt(slot, identi
12ef0 74 79 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 2c  ty, buf, buflen,
12f00 20 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 6c   outbuf, outbufl
12f10 65 6e 2c 20 70 61 64 49 6e 70 75 74 2c 20 75 6e  en, padInput, un
12f20 70 61 64 4f 75 74 70 75 74 29 29 3b 0a 09 09 09  padOutput));....
12f30 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
12f40 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
12f50 53 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d  Sending Failed -
12f60 2d 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  - returning in e
12f70 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20  rror.");.....if 
12f80 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
12f90 39 38 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20  982 || respcode 
12fa0 3d 3d 20 30 78 36 65 30 30 29 20 7b 0a 09 09 09  == 0x6e00) {....
12fb0 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
12fc0 20 30 78 36 45 30 30 29 20 7b 0a 09 09 09 09 09   0x6E00) {......
12fd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12fe0 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47  NTF("Got \"WRONG
12ff0 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d   CLASS\", this m
13000 65 61 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b  eans we are talk
13010 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67  ing to the wrong
13020 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20   object (likely 
13030 62 65 63 61 75 73 65 20 74 68 65 20 63 61 72 64  because the card
13040 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72   went away) -- r
13050 65 73 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09  esetting");.....
13060 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41  } else {......CA
13070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13080 46 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74  F("Security stat
13090 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65  us not satisifie
130a0 64 20 28 72 65 73 70 63 6f 64 65 20 3d 20 30 78  d (respcode = 0x
130b0 25 30 34 78 29 2e 20 20 52 65 74 75 72 6e 69 6e  %04x).  Returnin
130c0 67 20 4e 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69  g NEEDLOGIN", (i
130d0 6e 74 29 20 72 65 73 70 63 6f 64 65 29 3b 0a 09  nt) respcode);..
130e0 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
130f0 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13100 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 73 6c 6f  (slot);......slo
13110 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
13120 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
13130 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
13140 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
13150 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
13160 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65  ....if (respcode
13170 20 3d 3d 20 30 78 36 45 30 30 29 20 7b 0a 09 09   == 0x6E00) {...
13180 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13190 52 49 4e 54 46 28 22 47 6f 74 20 5c 22 57 52 4f  RINTF("Got \"WRO
131a0 4e 47 20 43 4c 41 53 53 5c 22 2c 20 74 68 69 73  NG CLASS\", this
131b0 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 74 61   means we are ta
131c0 6c 6b 69 6e 67 20 74 6f 20 74 68 65 20 77 72 6f  lking to the wro
131d0 6e 67 20 6f 62 6a 65 63 74 20 28 6c 69 6b 65 6c  ng object (likel
131e0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  y because the ca
131f0 72 64 20 77 65 6e 74 20 61 77 61 79 29 20 2d 2d  rd went away) --
13200 20 72 65 73 65 74 74 69 6e 67 22 29 3b 0a 0a 09   resetting");...
13210 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
13220 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
13230 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13240 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
13250 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  OGIN);....}.....
13260 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
13270 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
13280 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09  KENABSENT) {....
13290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
132a0 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73 65  INTF("Token abse
132b0 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 54  nt.  Returning T
132c0 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a 09  OKENABSENT");...
132d0 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
132e0 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
132f0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
13300 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
13310 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a 09  ABSENT);....}...
13320 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13330 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20 62  }....tmpbuf += b
13340 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09 09  ytes_to_send;...
13350 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79 74  tmpbuflen -= byt
13360 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09 6f  es_to_send;....o
13370 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74 62  utbuf += tmpoutb
13380 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66 6c  uflen;...outbufl
13390 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66 6c  en -= tmpoutbufl
133a0 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d 20  en;...retval += 
133b0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 7d  tmpoutbuflen;..}
133c0 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
133d0 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70 62  uf) {...if (tmpb
133e0 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65 28  uf_s) {....free(
133f0 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a 09  tmpbuf_s);...}..
13400 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75 74  }...outbuf = out
13410 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64 20  buf_s;.../* End 
13420 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  transaction */..
13430 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
13440 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 23  action(slot);..#
13450 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
13460 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
13470 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
13480 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20 3e  .if (outbuflen >
13490 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
134a0 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
134b0 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74 62  BUG_PRINTF("Outb
134c0 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d 61  uflen exceeds ma
134d0 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
134e0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
134f0 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f  e. (max = %li, o
13500 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29 22  utbuflen = %lu)"
13510 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
13520 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
13530 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62 75  gned long) outbu
13540 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  flen);....return
13550 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
13560 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57 65  f.#endif.../* We
13570 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68 65   must remove the
13580 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65 74   "7C" tag to get
13590 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75 72   to the signatur
135a0 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69 64  e */..switch (id
135b0 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  _type) {...case 
135c0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
135d0 49 56 3a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  IV:....outbuf_le
135e0 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
135f0 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
13600 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
13610 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
13620 5f 6c 65 6e 2c 20 30 78 37 43 2c 20 4e 55 4c 4c  _len, 0x7C, NULL
13630 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
13640 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
13650 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
13660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13670 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
13680 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
13690 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
136a0 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 37  ON was not a 0x7
136b0 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67  C tag, returning
136c0 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
136d0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
136e0 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20  ...}.....retval 
136f0 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09  = outbuf_len;...
13700 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
13710 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
13720 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
13730 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
13740 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
13750 20 30 78 38 32 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x82, NULL,  &o
13760 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
13770 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
13780 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
13790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
137a0 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
137b0 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
137c0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
137d0 73 20 6e 6f 74 20 61 20 30 78 38 32 20 77 69 74  s not a 0x82 wit
137e0 68 20 74 68 65 6e 20 30 78 37 43 20 74 61 67 2c  h then 0x7C tag,
137f0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
13800 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65  ilure");......re
13810 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a  turn(-1);....}..
13820 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62  ...retval = outb
13830 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 62 72 65 61  uf_len;.....brea
13840 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
13850 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
13860 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
13870 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
13880 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a  ..break;..}.../*
13890 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a 2f 0a   Unpad reply */.
138a0 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70 75 74  .if (unpadOutput
138b0 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76 61 6c  ) {...if (retval
138c0 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43 4b 45   < 3) {....CACKE
138d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
138e0 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73 6d 61  Reply is too sma
138f0 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74 20 61  ll, we are not a
13900 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d 2d 20  ble to unpad -- 
13910 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
13920 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
13930 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
13940 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13950 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
13960 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
13970 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
13980 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
13990 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
139a0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f 75 74  ;...}....if (out
139b0 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30 29 20  buf[0] != 0x00) 
139c0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
139d0 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65 63 6f  G_PRINTF("Unreco
139e0 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67 20 73  gnized padding s
139f0 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69 6e 67  cheme -- passing
13a00 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67   back and hoping
13a10 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29   for the best!")
13a20 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
13a30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
13a40 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
13a50 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62   retval = %li (b
13a60 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72  ytes)", (long) r
13a70 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72  etval);....retur
13a80 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a  n(retval);...}..
13a90 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20 6f 75  ..blocktype = ou
13aa0 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70 61 64  tbuf[1];...unpad
13ab0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09 09 73  offset = 0;....s
13ac0 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79 70 65  witch (blocktype
13ad0 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78 30 30  ) {....case 0x00
13ae0 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
13af0 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65 20 66   Scheme 1, the f
13b00 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79  irst non-zero by
13b10 74 65 20 69 73 20 74 68 65 20 73 74 61 72 74 20  te is the start 
13b20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09 09 66  of data */.....f
13b30 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
13b40 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
13b50 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
13b60 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
13b70 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
13b80 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 30 30  doffset] != 0x00
13b90 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  ) {.......break;
13ba0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
13bb0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
13bc0 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20 50 61   0x01:...../* Pa
13bd0 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32 2c 20  dding Scheme 2, 
13be0 70 61 64 20 62 79 74 65 73 20 61 72 65 20 30 78  pad bytes are 0x
13bf0 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 30  FF followed by 0
13c00 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28  x00 */.....for (
13c10 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b  unpadoffset = 2;
13c20 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72   unpadoffset < r
13c30 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73  etval; unpadoffs
13c40 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20  et++) {......if 
13c50 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
13c60 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20 7b 0a  set] != 0xFF) {.
13c70 09 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
13c80 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
13c90 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 09   0x00) {........
13ca0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a  unpadoffset++;..
13cb0 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
13cc0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
13cd0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13ce0 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
13cf0 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66 6f   padding data fo
13d00 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  und, returning i
13d10 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75 6c  n failure, shoul
13d20 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 30 30  d have been 0x00
13d30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c 20   found 0x%02x", 
13d40 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6f  (unsigned int) o
13d50 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
13d60 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72 65 74  t]);.........ret
13d70 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 09 7d  urn(-1);.......}
13d80 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
13d90 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13da0 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
13db0 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20 66  d padding data f
13dc0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  ound, returning 
13dd0 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f 75  in failure, shou
13de0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78 46  ld have been 0xF
13df0 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22 2c  F found 0x%02x",
13e00 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
13e10 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
13e20 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72 65 74  et]);........ret
13e30 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09 7d 0a  urn(-1);......}.
13e40 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
13e50 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09  ....case 0x02:..
13e60 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
13e70 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79 74 65  heme 3, pad byte
13e80 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s are non-zero f
13e90 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65 20 66  irst zero byte f
13ea0 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65 70 65  ound is the sepe
13eb0 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a 09 09  rator byte */...
13ec0 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
13ed0 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
13ee0 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
13ef0 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
13f00 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
13f10 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30  npadoffset] == 0
13f20 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75 6e 70  x00) {.......unp
13f30 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09  adoffset++;.....
13f40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
13f50 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
13f60 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75 6e 70  ;...}....if (unp
13f70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74 76 61  adoffset > retva
13f80 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  l) {....CACKEY_D
13f90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
13fa0 73 65 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  set greater than
13fb0 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61 62 6f   reply size, abo
13fc0 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64 6f 66  rting.  (unpadof
13fd0 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65 74 76  fset = %lu, retv
13fe0 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73  al = %lu)", (uns
13ff0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e 70 61  igned long) unpa
14000 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69 67 6e  doffset, (unsign
14010 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  ed long) retval)
14020 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
14030 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
14040 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
14050 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62 75 66  Padded:", outbuf
14060 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
14070 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f 66 66  tval -= unpadoff
14080 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f  set;...memmove(o
14090 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20  utbuf, outbuf + 
140a0 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72 65 74  unpadoffset, ret
140b0 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  val);....CACKEY_
140c0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
140d0 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  Unpadded:", outb
140e0 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a  uf, retval);..}.
140f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14100 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14110 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
14120 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65  tval = %li (byte
14130 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76  s)", (long) retv
14140 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
14150 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  tval);.}../*. * 
14160 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
14170 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
14180 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
14190 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
141a0 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
141b0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
141c0 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
141d0 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
141e0 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75 63 74  key_login(struct
141f0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
14200 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
14210 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e 65 64  r *pin, unsigned
14220 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c 20 69   long pin_len, i
14230 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e  nt *tries_remain
14240 69 6e 67 5f 70 29 20 7b 0a 09 73 74 72 75 63 74  ing_p) {..struct
14250 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
14260 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
14270 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
14280 64 20 63 68 61 72 20 63 61 63 5f 70 69 6e 5b 38  d char cac_pin[8
14290 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78 46 46 2c  ] = {0xFF, 0xFF,
142a0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
142b0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
142c0 78 46 46 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  xFF};..unsigned 
142d0 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  long num_certs;.
142e0 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e  .uint16_t respon
142f0 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72  se_code;..int tr
14300 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
14310 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69  int send_ret;..i
14320 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  nt key_reference
14330 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e   = 0x00;.../* In
14340 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20 64  dicate that we d
14350 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74  o not know about
14360 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20   how many tries 
14370 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f  are remaining */
14380 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
14390 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72  ining_p) {...*tr
143a0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20  ies_remaining_p 
143b0 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70  = -1;..}.../* Ap
143c0 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49  parently, CAC PI
143d0 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a  Ns are *EXACTLY*
143e0 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d   8 bytes long --
143f0 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20 69   pad with 0xFF i
14400 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09  f too short */..
14410 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38  if (pin_len >= 8
14420 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63  ) {...memcpy(cac
14430 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09  _pin, pin, 8);..
14440 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70  } else {...memcp
14450 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
14460 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  pin_len);..}.../
14470 2a 20 52 65 6a 65 63 74 20 50 49 4e 73 20 77 68  * Reject PINs wh
14480 69 63 68 20 61 72 65 20 74 6f 6f 20 73 68 6f 72  ich are too shor
14490 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65  t */..if (pin_le
144a0 6e 20 3c 20 35 29 20 7b 0a 09 09 43 41 43 4b 45  n < 5) {...CACKE
144b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
144c0 52 65 6a 65 63 74 69 6e 67 20 50 49 4e 20 77 68  Rejecting PIN wh
144d0 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74  ich is too short
144e0 20 28 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20   (length = %lu, 
144f0 6d 75 73 74 20 62 65 20 61 74 6c 65 61 73 74 20  must be atleast 
14500 35 29 22 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 0a  5)", pin_len);..
14510 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
14520 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a  PCSC_E_BADPIN);.
14530 09 7d 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68  .}.../* PIV auth
14540 65 6e 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20  entication uses 
14550 61 20 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  a "key_reference
14560 22 20 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63  " of 0x80 */..pc
14570 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
14580 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
14590 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
145a0 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
145b0 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26  num_certs > 0 &&
145c0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
145d0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77   != NULL) {...sw
145e0 69 74 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74  itch (pcsc_ident
145f0 69 74 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65  ities[0].id_type
14600 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
14610 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
14620 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14630 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 76 65  _PRINTF("We have
14640 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20 77 65   PIV card, so we
14650 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f   will attempt to
14660 20 61 75 74 68 65 6e 74 69 63 61 74 65 20 75 73   authenticate us
14670 69 6e 67 20 74 68 65 20 50 49 56 20 41 70 70 6c  ing the PIV Appl
14680 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 66 65  ication key refe
14690 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b 65  rence");......ke
146a0 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78  y_reference = 0x
146b0 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  80;.....break;..
146c0 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 62  ..default:.....b
146d0 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  reak;...}....cac
146e0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
146f0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
14700 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09  num_certs, 1);..
14710 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20 50 49 4e  }.../* Issue PIN
14720 20 56 65 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64   Verify */..send
14730 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
14740 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
14750 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
14760 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56  6, GSCIS_INSTR_V
14770 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79  ERIFY, 0x00, key
14780 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65  _reference, size
14790 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63  of(cac_pin), cac
147a0 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73  _pin, 0x00, &res
147b0 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c  ponse_code, NULL
147c0 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73  , NULL);...if (s
147d0 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
147e0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
147f0 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63  .if ((response_c
14800 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d  ode & 0x63C0) ==
14810 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72   0x63C0) {....tr
14820 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20  ies_remaining = 
14830 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26  (response_code &
14840 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45   0xF);.....CACKE
14850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14860 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
14870 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65   failed, %i trie
14880 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72  s remaining", tr
14890 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a  ies_remaining);.
148a0 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
148b0 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09  maining_p) {....
148c0 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
148d0 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61  g_p = tries_rema
148e0 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09  ining;....}.....
148f0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14900 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09  SC_E_BADPIN);...
14910 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73  }....if (respons
14920 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33  e_code == 0x6983
14930 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
14940 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
14950 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
14960 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c  led, device is l
14970 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74  ocked");.....ret
14980 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
14990 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a  E_LOCKED);...}..
149a0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
149b0 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
149c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
149d0 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
149e0 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63  erification succ
149f0 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72  eeded");...retur
14a00 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
14a10 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
14a20 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
14a30 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
14a40 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
14a50 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
14a60 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
14a70 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
14a80 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
14a90 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
14aa0 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
14ab0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
14ac0 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
14ad0 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
14ae0 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
14af0 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c   reader_len = 0,
14b00 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74   state = 0, prot
14b10 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65  ocol = 0, atr_le
14b20 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58  n;..BYTE atr[MAX
14b30 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e  _ATR_SIZE];..LON
14b40 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63  G status_ret, sc
14b50 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
14b60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14b70 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
14b80 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e  ;...if (slot->in
14b90 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b  ternal) {...CACK
14ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14bb0 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e  "Returning token
14bc0 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e   present (intern
14bd0 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09  al token)");....
14be0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14bf0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
14c00 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  T);..}...pcsc_co
14c10 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
14c20 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
14c30 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
14c40 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
14c50 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
14c60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14c70 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
14c80 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
14c90 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
14ca0 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
14cb0 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14cc0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
14cd0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ENT);..}...CACKE
14ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14cf0 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61  Calling SCardSta
14d00 74 75 73 28 29 20 74 6f 20 64 65 74 65 72 6d 69  tus() to determi
14d10 6e 65 20 63 61 72 64 20 73 74 61 74 75 73 22 29  ne card status")
14d20 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69  ;...atr_len = si
14d30 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74  zeof(atr);..stat
14d40 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
14d50 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
14d60 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
14d70 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
14d80 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
14d90 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66   &atr_len);...if
14da0 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20   (status_ret == 
14db0 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
14dc0 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b  HANDLE) {...CACK
14dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14de0 22 53 43 61 72 64 53 74 61 74 75 73 28 29 20 72  "SCardStatus() r
14df0 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
14e00 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20  INVALID_HANDLE, 
14e10 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61  marking is not a
14e20 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64  lready connected
14e30 20 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69   and trying agai
14e40 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  n");...cackey_ma
14e50 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
14e60 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e  ot);....pcsc_con
14e70 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
14e80 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
14e90 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63  lot);...if (pcsc
14ea0 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
14eb0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
14ec0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
14ed0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
14ee0 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
14ef0 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
14f00 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
14f10 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
14f20 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
14f30 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43  BSENT);...}....C
14f40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14f50 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72  TF("Calling SCar
14f60 64 53 74 61 74 75 73 28 29 20 61 67 61 69 6e 22  dStatus() again"
14f70 29 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20  );....atr_len = 
14f80 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73  sizeof(atr);...s
14f90 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
14fa0 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
14fb0 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
14fc0 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
14fd0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
14fe0 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
14ff0 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  }...if (status_r
15000 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
15010 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65  CCESS) {...cacke
15020 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
15030 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28  t(slot);....if (
15040 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43  status_ret == SC
15050 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
15060 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15070 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
15080 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
15090 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
150a0 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
150b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f  et = cackey_reco
150c0 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c  nnect_card(slot,
150d0 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
150e0 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
150f0 43 4f 4c 5f 54 31 29 3b 0a 09 09 09 69 66 20 28  COL_T1);....if (
15100 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
15110 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
15120 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 52 65  ESS) {...../* Re
15130 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73  -establish trans
15140 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61  action, if it wa
15150 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09  s present */....
15160 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
15170 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
15180 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  ) {......slot->t
15190 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
151a0 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74  --;......slot->t
151b0 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
151c0 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09  hw_lock = 1;....
151d0 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
151e0 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
151f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
15200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15210 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66  ("Reset successf
15220 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22 29  ul, requerying")
15230 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65 74  ;.....status_ret
15240 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
15250 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
15260 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
15270 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
15280 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
15290 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73 74  len);.....if (st
152a0 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52  atus_ret != SCAR
152b0 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
152c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
152d0 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20 75  _PRINTF("Still u
152e0 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63  nable to query c
152f0 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75  ard status, retu
15300 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
15310 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73  nt.  SCardStatus
15320 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
15330 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
15340 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74  DERR_TO_STR(stat
15350 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 09  us_ret));.......
15360 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15370 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15380 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  );.....}....} el
15390 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  se {.....CACKEY_
153a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
153b0 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63  able to reconnec
153c0 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
153d0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
153e0 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  t.  SCardReconne
153f0 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  ct() = %s", CACK
15400 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
15410 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
15420 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29  ard_reconn_ret))
15430 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
15440 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
15450 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09  NABSENT);....}..
15460 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
15470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15480 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65 72  ("Unable to quer
15490 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72  y card status, r
154a0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
154b0 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61  bsent.  SCardSta
154c0 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43  tus() = %s", CAC
154d0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
154e0 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
154f0 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09  tatus_ret));....
15500 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15510 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
15520 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  T);...}..}...if 
15530 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44 5f  ((state & SCARD_
15540 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52 44  ABSENT) == SCARD
15550 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  _ABSENT) {...CAC
15560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15570 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e 74  ("Card is absent
15580 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
15590 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
155a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
155b0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
155c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
155d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
155e0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73  rning token pres
155f0 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e  ent.");...return
15600 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54  (CACKEY_PCSC_S_T
15610 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a  OKENPRESENT);.}.
15620 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
15630 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
15640 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
15650 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
15660 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
15670 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
15680 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
15690 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
156a0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
156b0 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73  ntity_to_label(s
156c0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
156d0 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  c_identity *iden
156e0 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  tity, unsigned c
156f0 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20  har *label_buf, 
15700 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61  unsigned long la
15710 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  bel_buf_len) {..
15720 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65  unsigned long ce
15730 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
15740 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31  void *label_asn1
15750 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66 69  ;..void *certifi
15760 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f  cate;..int x509_
15770 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74  read_ret;...cert
15780 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
15790 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
157a0 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
157b0 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
157c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
157d0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
157e0 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65  _len < 0) {...re
157f0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
15800 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
15810 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63  509_to_subject(c
15820 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
15830 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f  ificate_len, (vo
15840 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73  id **) &label_as
15850 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  n1);..if (x509_r
15860 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
15870 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
15880 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
15890 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
158a0 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
158b0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
158c0 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
158d0 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
158e0 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78 35  , "CN");..if (x5
158f0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
15900 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64 5f  ) {...x509_read_
15910 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
15920 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
15930 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
15940 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
15950 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
15960 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09  _len, NULL);....
15970 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
15980 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65 74  t <= 0) {....ret
15990 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
159a0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
159b0 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
159c0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
159d0 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  X..if (x509_read
159e0 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53  _ret > _POSIX_SS
159f0 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43  IZE_MAX) {...CAC
15a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15a10 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ("x509_read_ret 
15a20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
15a30 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
15a40 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
15a50 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72 65  x = %li, x509_re
15a60 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c 20  ad_ret = %lu)", 
15a70 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
15a80 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
15a90 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65  ed long) x509_re
15aa0 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  ad_ret);....retu
15ab0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
15ac0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  dif.#endif...ret
15ad0 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72 65  urn(x509_read_re
15ae0 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  t);.}../* Return
15af0 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
15b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
15b10 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
15b20 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b  (void **mutex) {
15b30 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ..pthread_mutex_
15b40 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  t *pthread_mutex
15b50 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72  ;..int pthread_r
15b60 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75  etval;..CK_RV cu
15b70 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  stom_retval;...C
15b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15b90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
15ba0 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67  .if ((cackey_arg
15bb0 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53  s.flags & CKF_OS
15bc0 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20  _LOCKING_OK) == 
15bd0 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
15be0 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d  K) {...pthread_m
15bf0 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  utex = malloc(si
15c00 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d 75  zeof(*pthread_mu
15c10 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70 74  tex));...if (!pt
15c20 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09  hread_mutex) {..
15c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15c40 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
15c50 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
15c60 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
15c70 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72  -1);...}....pthr
15c80 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
15c90 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
15ca0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e  pthread_mutex, N
15cb0 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68 72  ULL);...if (pthr
15cc0 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
15cd0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15ce0 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
15cf0 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29 20  ad_mutex_init() 
15d00 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
15d10 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
15d20 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
15d30 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a  rn(-1);...}....*
15d40 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64 5f  mutex = pthread_
15d50 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b  mutex;..} else {
15d60 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
15d70 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29 20  gs.CreateMutex) 
15d80 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
15d90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
15da0 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75 74  .CreateMutex(mut
15db0 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
15dc0 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
15dd0 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
15de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15df0 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  "cackey_args.Cre
15e00 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75 72  ateMutex() retur
15e10 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
15e20 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
15e30 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
15e40 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
15e50 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
15e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15e70 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
15e80 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
15e90 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
15ea0 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
15eb0 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
15ec0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
15ed0 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20  ck(void *mutex) 
15ee0 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
15ef0 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
15f00 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
15f10 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
15f20 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
15f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15f40 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
15f50 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
15f60 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
15f70 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
15f80 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
15f90 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
15fa0 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a  mutex = mutex;..
15fb0 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
15fc0 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
15fd0 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  _lock(pthread_mu
15fe0 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
15ff0 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
16000 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
16010 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
16020 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20  ad_mutex_lock() 
16030 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
16040 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72  %i).", pthread_r
16050 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75  etval);.....retu
16060 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65  rn(-1);...}..} e
16070 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  lse {...if (cack
16080 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
16090 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
160a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
160b0 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75  rgs.LockMutex(mu
160c0 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
160d0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
160e0 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
160f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16100 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ("cackey_args.Lo
16110 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e  ckMutex() return
16120 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22  ed error (%li)."
16130 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f  , (long) custom_
16140 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65  retval);......re
16150 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09  turn(-1);....}..
16160 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  .}..}...CACKEY_D
16170 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16180 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c  urning sucessful
16190 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75  ly (0)");...retu
161a0 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  rn(0);.}../* Ret
161b0 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
161c0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
161d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
161e0 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
161f0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
16200 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
16210 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
16220 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
16230 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
16240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
16260 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
16270 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
16280 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
16290 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
162a0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
162b0 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
162c0 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
162d0 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
162e0 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64  x_unlock(pthread
162f0 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70  _mutex);...if (p
16300 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d  thread_retval !=
16310 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
16320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74  DEBUG_PRINTF("pt
16330 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
16340 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ck() returned er
16350 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72  ror (%i).", pthr
16360 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ead_retval);....
16370 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
16380 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
16390 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  (cackey_args.Unl
163a0 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ockMutex) {....c
163b0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
163c0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
163d0 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
163e0 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
163f0 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
16400 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
16410 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
16420 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
16430 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
16440 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
16450 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
16460 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
16470 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
16480 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16490 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
164a0 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
164b0 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
164c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41  ;.}..static CK_A
164d0 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61 63  TTRIBUTE_PTR cac
164e0 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
164f0 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41  es(CK_OBJECT_CLA
16500 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  SS objectclass, 
16510 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
16520 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
16530 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
16540 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e 75  long identity_nu
16550 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  m, CK_ULONG_PTR 
16560 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
16570 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
16580 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74 69  true = 1;..stati
16590 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61  c CK_BBOOL ck_fa
165a0 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69 63  lse = 0;..static
165b0 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72 75   CK_TRUST ck_tru
165c0 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54 45  sted = CK_TRUSTE
165d0 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b  D_DELEGATOR;..CK
165e0 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20  _ULONG numattrs 
165f0 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  = 0, retval_coun
16600 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  t;..CK_ATTRIBUTE
16610 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72 5f  _TYPE curr_attr_
16620 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42  type;..CK_ATTRIB
16630 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20 2a  UTE curr_attr, *
16640 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44  retval;..CK_VOID
16650 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b  _PTR pValue;..CK
16660 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65  _ULONG ulValueLe
16670 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  n;..CK_OBJECT_CL
16680 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ASS ck_object_cl
16690 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49  ass;..CK_CERTIFI
166a0 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65 72  CATE_TYPE ck_cer
166b0 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09  tificate_type;..
166c0 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b  CK_KEY_TYPE ck_k
166d0 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46  ey_type;..CK_UTF
166e0 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b 31  8CHAR ucTmpBuf[1
166f0 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65  024];..SHA1Conte
16700 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44  xt sha1_ctx;..MD
16710 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09  5_CTX md5_ctx;..
16720 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61 73  uint8_t sha1_has
16730 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d 3b  h[SHA1HashSize];
16740 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61  ..uint8_t md5_ha
16750 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b  sh[MD5HashSize];
16760 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
16770 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 73  *certificate;..s
16780 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63 61  size_t certifica
16790 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30  te_len = -1, x50
167a0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  9_read_ret;..int
167b0 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09   pValue_free;...
167c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
167d0 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a  NTF("Called (obj
167e0 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20  ectClass = %lu, 
167f0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25  identity_num = %
16800 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
16810 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61   long) objectcla
16820 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  ss, identity_num
16830 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  );...*pulCount =
16840 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74   0;...if (object
16850 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
16860 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
16870 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
16880 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a  UBLIC_KEY && obj
16890 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
168a0 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f  PRIVATE_KEY && o
168b0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
168c0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
168d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
168e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
168f0 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
16900 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f  NULL), invalid o
16910 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a  bject class");..
16920 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
16930 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72 74  .}.../* Get Cert
16940 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69 74   */..if (identit
16950 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
16960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16970 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
16980 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
16990 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79 20  invalid identiy 
169a0 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09 72  provided");....r
169b0 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
169c0 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
169d0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
169e0 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
169f0 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
16a00 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
16a10 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
16a20 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31  ficate_len == -1
16a30 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65 20   || certificate 
16a40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
16a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16a60 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62  ("Returning 0 ob
16a70 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68  jects (NULL), th
16a80 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65 73  is identity does
16a90 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e 35   not have an X.5
16aa0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
16ab0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 69  ssociated with i
16ac0 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77  t and will not w
16ad0 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ork");....return
16ae0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
16af0 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74  Verify that cert
16b00 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e 31  ificate is ASN.1
16b10 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20 63   encoded X.509 c
16b20 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 69  ertificate */..i
16b30 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69 61  f (x509_to_seria
16b40 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
16b50 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
16b60 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43  NULL) < 0) {...C
16b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16b80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
16b90 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
16ba0 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69 66  the X.509 certif
16bb0 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64  icate associated
16bc0 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e 74   with this ident
16bd0 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69 64  ity is not valid
16be0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
16bf0 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  LL);..}...retval
16c00 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65  _count = 64;..re
16c10 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65  tval = malloc(re
16c20 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
16c30 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a  eof(*retval));..
16c40 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f  .for (curr_attr_
16c50 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f 61  type = 0; curr_a
16c60 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65 35  ttr_type < 0xce5
16c70 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74 72  363bf; curr_attr
16c80 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20  _type++) {...if 
16c90 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  (curr_attr_type 
16ca0 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09 63  == 0x800) {....c
16cb0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
16cc0 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a  0xce536300;...}.
16cd0 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20 3d  ...pValue_free =
16ce0 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e   0;...pValue = N
16cf0 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
16d00 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
16d10 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75 72  ;....switch (cur
16d20 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a 09  r_attr_type) {..
16d30 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53 53  ..case CKA_CLASS
16d40 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
16d50 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
16d60 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
16d70 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30 38  CKA_CLASS (0x%08
16d80 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16d90 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16da0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
16db0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20  ck_object_class 
16dc0 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a  = objectclass;..
16dd0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
16de0 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09  _object_class;..
16df0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16e00 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74  sizeof(ck_object
16e10 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43 41  _class);......CA
16e20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16e30 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16e40 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
16e50 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16e60 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c   *((CK_OBJECT_CL
16e70 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  ASS *) pValue), 
16e80 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
16e90 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
16ea0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
16eb0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b  ....case CKA_TOK
16ec0 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EN:.....CACKEY_D
16ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
16ee0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16ef0 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25  e CKA_TOKEN (0x%
16f00 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16f10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16f20 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16f30 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
16f40 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
16f50 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
16f60 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
16f70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16f80 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16f90 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16fa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16fb0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
16fc0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16fd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16fe0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16ff0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17000 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
17010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17020 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
17030 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50   attribute CKA_P
17040 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78 29  RIVATE (0x%08lx)
17050 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
17060 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17070 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
17080 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
17090 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
170a0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
170b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
170c0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
170d0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
170e0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not a Net
170f0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
17100 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
17110 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56  k;.....}......pV
17120 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
17130 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
17140 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
17150 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
17160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17170 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
17180 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
17190 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
171a0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
171b0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
171c0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
171d0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
171e0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
171f0 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09 43  A_TRUSTED:.....C
17200 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17210 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17220 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55  ttribute CKA_TRU
17230 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20 2e  STED (0x%08lx) .
17240 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17250 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17260 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17270 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17280 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17290 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
172a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
172b0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
172c0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
172d0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
172e0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
172f0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17300 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  .}......pValue =
17310 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
17320 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
17330 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
17340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17350 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17360 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
17370 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
17380 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
17390 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
173a0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
173b0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
173c0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
173d0 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49  .case CKA_MODIFI
173e0 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABLE:.....CACKEY
173f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17400 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17410 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ute CKA_MODIFIAB
17420 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
17430 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17440 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17450 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  e);......pValue 
17460 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
17470 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17480 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
17490 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
174a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
174b0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
174c0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
174d0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
174e0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
174f0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17500 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17510 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17520 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41 42  ....case CKA_LAB
17530 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  EL:.....CACKEY_D
17540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17550 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17560 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25  e CKA_LABEL (0x%
17570 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17580 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17590 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
175a0 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
175b0 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b 45  id_type == CACKE
175c0 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20 7b  Y_ID_TYPE_PIV) {
175d0 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69  ......pValue = i
175e0 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
175f0 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75 6c  v.label;......ul
17600 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c 65  ValueLen = strle
17610 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d  n(pValue);.....}
17620 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c 56   else {......ulV
17630 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e  alueLen = snprin
17640 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d  tf((char *) ucTm
17650 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54  pBuf, sizeof(ucT
17660 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74  mpBuf), "Identit
17670 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  y #%lu", (unsign
17680 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
17690 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56 61  y_num);......pVa
176a0 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a  lue = ucTmpBuf;.
176b0 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75  ......if (ulValu
176c0 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75  eLen >= sizeof(u
176d0 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09  cTmpBuf)) {.....
176e0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30  ..ulValueLen = 0
176f0 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  ;.......pValue =
17700 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09 09   NULL;......}...
17710 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
17720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17730 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
17740 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
17750 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17760 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17770 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17780 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09   CKA_VALUE:.....
17790 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
177a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
177b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41  attribute CKA_VA
177c0 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  LUE (0x%08lx) ..
177d0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
177e0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
177f0 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68  pe);......switch
17800 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b   (objectclass) {
17810 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
17820 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09  RIVATE_KEY:.....
17830 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17840 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
17850 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
17860 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
17870 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a  private key.");.
17880 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17890 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53  ...case CKO_NETS
178a0 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09  CAPE_TRUST:.....
178b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
178c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
178d0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
178e0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
178f0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
17900 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09  bject");........
17910 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65  break;......case
17920 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a   CKO_PUBLIC_KEY:
17930 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74 69  .......if (certi
17940 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
17950 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72   {........x509_r
17960 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
17970 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66 69  o_pubkey(certifi
17980 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
17990 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
179a0 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30 39  ........if (x509
179b0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
179c0 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75 65   .........pValue
179d0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09   = NULL;........
179e0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09  } else {........
179f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
17a00 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
17a10 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09  ....}.......}...
17a20 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
17a30 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46  .case CKO_CERTIF
17a40 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61  ICATE:.......pVa
17a50 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61 74  lue = certificat
17a60 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65  e;.......ulValue
17a70 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74  Len = certificat
17a80 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72  e_len;........br
17a90 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
17aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ab0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17ac0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
17ad0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17ae0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17af0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17b00 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52  .case CKA_ISSUER
17b10 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
17b20 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
17b30 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
17b40 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25 30  CKA_ISSUER (0x%0
17b50 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17b60 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17b70 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17b80 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
17b90 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
17ba0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
17bb0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
17bc0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17be0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17bf0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17c00 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
17c10 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f   a certificate o
17c20 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  r Netscape trust
17c30 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17c40 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17c50 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
17c60 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
17c70 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
17c80 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75  t = x509_to_issu
17c90 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  er(certificate, 
17ca0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
17cb0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
17cc0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
17cd0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
17ce0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
17cf0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
17d00 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
17d10 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
17d20 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
17d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17d40 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17d50 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
17d60 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17d70 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17d80 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17d90 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
17da0 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43  _NUMBER:.....CAC
17db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17dc0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
17dd0 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41  ribute CKA_SERIA
17de0 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c  L_NUMBER (0x%08l
17df0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17e00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17e10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17e20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
17e30 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
17e40 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
17e50 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
17e60 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
17e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e80 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
17e90 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
17ea0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
17eb0 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20   certificate or 
17ec0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
17ed0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
17ee0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
17ef0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
17f00 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
17f10 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
17f20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c  = x509_to_serial
17f30 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
17f40 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
17f50 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
17f60 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
17f70 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
17f80 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
17f90 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
17fa0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
17fb0 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
17fc0 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
17fd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17fe0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
17ff0 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
18000 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18010 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18020 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18030 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43  .case CKA_SUBJEC
18040 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
18050 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18060 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18070 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78   CKA_SUBJECT (0x
18080 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18090 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
180a0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
180b0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
180c0 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
180d0 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41  ICATE) {......CA
180e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
180f0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18100 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18110 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
18120 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a  certificate");..
18130 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18140 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
18150 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
18160 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
18170 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
18180 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
18190 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
181a0 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
181b0 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
181c0 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
181d0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
181e0 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
181f0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
18200 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
18210 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
18220 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18230 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
18240 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
18250 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18260 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18270 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18280 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49  k;....case CKA_I
18290 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
182a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
182b0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
182c0 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78   CKA_ID (0x%08lx
182d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
182e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
182f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18300 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
18310 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
18320 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
18330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18340 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
18350 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
18360 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
18370 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
18380 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
18390 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70  ....}......ucTmp
183a0 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74  Buf[0] = ((ident
183b0 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20  ity_num + 1) >> 
183c0 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75  8) & 0xff;.....u
183d0 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69  cTmpBuf[1] =  (i
183e0 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
183f0 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56   & 0xff;......pV
18400 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66  alue = &ucTmpBuf
18410 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
18420 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45   = 2;......CACKE
18430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18440 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18450 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20  p/%lu", pValue, 
18460 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18470 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18480 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18490 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
184a0 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45  _TYPE:.....CACKE
184b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
184c0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
184d0 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49  bute CKA_CERTIFI
184e0 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30 38  CATE_TYPE (0x%08
184f0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18500 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18510 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18520 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18530 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
18540 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
18550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18560 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
18570 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
18580 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
18590 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09  tificate.");....
185a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
185b0 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
185c0 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74  support one cert
185d0 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a  ificate type */.
185e0 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61  ....ck_certifica
185f0 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f  te_type = CKC_X_
18600 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  509;......pValue
18610 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61   = &ck_certifica
18620 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56  te_type;.....ulV
18630 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18640 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f  (ck_certificate_
18650 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  type);......CACK
18660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18670 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18680 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20  CKC_X_509 (%lu) 
18690 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
186a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
186b0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
186c0 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  E *) pValue), pV
186d0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
186e0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
186f0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18700 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54  ..case CKA_KEY_T
18710 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPE:.....CACKEY_
18720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18730 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
18740 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20  te CKA_KEY_TYPE 
18750 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18760 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18770 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18780 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18790 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
187a0 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65  VATE_KEY && obje
187b0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
187c0 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09  UBLIC_KEY) {....
187d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
187e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
187f0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18800 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
18810 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  t a key.");.....
18820 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18830 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73  ..../* We only s
18840 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74  upport one key t
18850 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65  ype */.....ck_ke
18860 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41  y_type = CKK_RSA
18870 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
18880 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09  &ck_key_type;...
18890 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
188a0 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70  izeof(ck_key_typ
188b0 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
188c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
188d0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b  .. returning CKK
188e0 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25  _RSA (%lu) (%p/%
188f0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18900 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54  long) *((CK_CERT
18910 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20  IFICATE_TYPE *) 
18920 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18930 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18940 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18950 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18960 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09  e CKA_SIGN:.....
18970 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18980 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18990 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
189a0 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  GN (0x%08lx) ...
189b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
189c0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
189d0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
189e0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
189f0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
18a00 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
18a10 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18a20 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
18a30 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
18a40 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
18a50 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
18a60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18a70 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
18a80 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
18a90 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
18aa0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
18ab0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
18ac0 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
18ad0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
18ae0 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
18af0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
18b00 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
18b10 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
18b20 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
18b30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18b40 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18b50 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
18b60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
18b70 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
18b80 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
18b90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18ba0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18bb0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18bc0 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
18bd0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18be0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18bf0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18c00 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52  CKA_SIGN_RECOVER
18c10 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
18c20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18c30 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18c40 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18c50 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
18c60 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
18c70 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18c80 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18c90 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18ca0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18cb0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18cc0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18cd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18ce0 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e  ..../* We curren
18cf0 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  tly only support
18d00 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70 65   "Sign with Appe
18d10 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61  ndix" */.....pVa
18d20 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
18d30 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18d40 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
18d50 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
18d60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18d70 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
18d80 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
18d90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
18da0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
18db0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
18dc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
18dd0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
18de0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
18df0 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41  _DECRYPT:.....CA
18e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18e10 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18e20 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52  tribute CKA_DECR
18e30 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPT (0x%08lx) ..
18e40 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
18e50 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
18e60 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
18e70 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
18e80 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
18e90 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
18ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18eb0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
18ec0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
18ed0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
18ee0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
18ef0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18f00 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
18f10 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
18f20 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a  IVATE_KEY || obj
18f30 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18f40 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
18f50 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18f60 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
18f70 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
18f80 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
18f90 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
18fa0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
18fb0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18fc0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
18fd0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
18fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18ff0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
19000 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
19010 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19020 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
19030 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
19040 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19050 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
19060 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
19070 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a  e CKA_SENSITIVE:
19080 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19090 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
190a0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
190b0 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78  KA_SENSITIVE (0x
190c0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
190d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
190e0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
190f0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
19100 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
19110 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
19120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19130 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19140 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19150 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
19160 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
19170 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
19180 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19190 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
191a0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
191b0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
191c0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
191d0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
191e0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
191f0 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
19200 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
19210 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
19220 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
19230 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
19240 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19250 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19260 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
19270 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
19280 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
19290 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
192a0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
192b0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
192c0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
192d0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58  ;....case CKA_EX
192e0 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43  TRACTABLE:.....C
192f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19300 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19310 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54  ttribute CKA_EXT
19320 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c  RACTABLE (0x%08l
19330 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
19340 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
19350 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
19360 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
19370 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
19380 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
19390 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
193a0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
193b0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
193c0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
193d0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
193e0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
193f0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
19400 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
19410 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
19420 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
19430 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
19440 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
19450 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
19460 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
19470 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
19480 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
19490 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
194a0 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
194b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
194c0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
194d0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
194e0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
194f0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
19500 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
19510 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
19520 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
19530 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
19540 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  .case CKA_MODULU
19550 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
19560 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19570 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19580 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78   CKA_MODULUS (0x
19590 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
195a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
195b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
195c0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
195d0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
195e0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
195f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19600 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19610 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19620 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
19630 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
19640 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
19650 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19660 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
19670 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
19680 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
19690 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73   x509_to_modulus
196a0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
196b0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
196c0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
196d0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
196e0 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
196f0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
19700 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
19710 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
19720 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
19730 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
19740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19750 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
19760 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
19770 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
19780 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
19790 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
197a0 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43  .case CKA_PUBLIC
197b0 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43  _EXPONENT:.....C
197c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
197d0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
197e0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42  ttribute CKA_PUB
197f0 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78  LIC_EXPONENT (0x
19800 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19810 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19820 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19830 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
19840 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
19850 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
19860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19870 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19880 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19890 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
198a0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
198b0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
198c0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
198d0 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
198e0 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09  len >= 0) {.....
198f0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
19900 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e   x509_to_exponen
19910 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
19920 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19930 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
19940 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
19950 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
19960 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
19970 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
19980 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
19990 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
199a0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
199b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
199c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
199d0 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
199e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
199f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19a00 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19a10 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
19a20 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55  _DIGITAL_SIGNATU
19a30 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  RE:....case CKA_
19a40 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49  TRUST_NON_REPUDI
19a50 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43  ATION:....case C
19a60 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43  KA_TRUST_KEY_ENC
19a70 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61  IPHERMENT:....ca
19a80 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54  se CKA_TRUST_DAT
19a90 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a  A_ENCIPHERMENT:.
19aa0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
19ab0 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a  T_KEY_AGREEMENT:
19ac0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
19ad0 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e  ST_KEY_CERT_SIGN
19ae0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
19af0 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09  UST_CRL_SIGN:...
19b00 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
19b10 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09  SERVER_AUTH:....
19b20 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
19b30 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63  LIENT_AUTH:....c
19b40 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f  ase CKA_TRUST_CO
19b50 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63  DE_SIGNING:....c
19b60 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d  ase CKA_TRUST_EM
19b70 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a  AIL_PROTECTION:.
19b80 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19b90 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19ba0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19bb0 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25  A_TRUST_... (0x%
19bc0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19bd0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19be0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19bf0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
19c00 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61  rusted;.....ulVa
19c10 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
19c20 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09  ck_trusted);....
19c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19c40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19c50 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
19c60 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
19c70 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54  ong) *((CK_TRUST
19c80 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
19c90 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
19ca0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
19cb0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
19cc0 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53  .case CKA_CERT_S
19cd0 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41  HA1_HASH:.....CA
19ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19cf0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19d00 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54  tribute CKA_CERT
19d10 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25 30  _SHA1_HASH (0x%0
19d20 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
19d30 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
19d40 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19d50 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19d60 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
19d70 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
19d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19d90 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
19da0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
19db0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
19dc0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19dd0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19de0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19df0 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68 61  ..SHA1Reset(&sha
19e00 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31  1_ctx);.....SHA1
19e10 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c  Input(&sha1_ctx,
19e20 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65   certificate, ce
19e30 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
19e40 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28 26  ....SHA1Result(&
19e50 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68  sha1_ctx, sha1_h
19e60 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ash);......pValu
19e70 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09  e = sha1_hash;..
19e80 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19e90 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68  sizeof(sha1_hash
19ea0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
19eb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19ec0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
19ed0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
19ee0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19ef0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19f00 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
19f10 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a  A_CERT_MD5_HASH:
19f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19f30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
19f40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
19f50 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
19f60 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
19f70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19f80 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
19f90 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
19fa0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
19fb0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
19fc0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19fd0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
19fe0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
19ff0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
1a000 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20   not a Netscape 
1a010 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
1a020 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1a030 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28  .}......MD5Init(
1a040 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d  &md5_ctx);.....M
1a050 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74  D5Update(&md5_ct
1a060 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20  x, certificate, 
1a070 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
1a080 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d  ;.....MD5Final(m
1a090 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74  d5_hash, &md5_ct
1a0a0 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  x);......pValue 
1a0b0 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09  = md5_hash;.....
1a0c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
1a0d0 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a  eof(md5_hash);..
1a0e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1a0f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
1a100 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
1a110 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
1a120 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
1a130 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
1a140 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  ;....default:...
1a150 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
1a160 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
1a170 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a  = (CK_LONG) -1;.
1a180 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
1a190 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29  ..if (((CK_LONG)
1a1a0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20   ulValueLen) != 
1a1b0 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20  ((CK_LONG) -1)) 
1a1c0 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72  {..../* Push cur
1a1d0 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20  r_attr onto the 
1a1e0 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72  stack */....curr
1a1f0 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72  _attr.type = cur
1a200 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09  r_attr_type;....
1a210 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
1a220 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65  eLen = ulValueLe
1a230 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  n;.....curr_attr
1a240 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63  .pValue = malloc
1a250 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  (curr_attr.ulVal
1a260 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70  ueLen);....memcp
1a270 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c  y(curr_attr.pVal
1a280 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72  ue, pValue, curr
1a290 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
1a2a0 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75  );.....if (pValu
1a2b0 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75 65  e_free && pValue
1a2c0 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61  ) {.....free(pVa
1a2d0 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  lue);....}.....i
1a2e0 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72  f (numattrs >= r
1a2f0 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09  etval_count) {..
1a300 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c  ...retval = real
1a310 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76  loc(retval, retv
1a320 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f  al_count * sizeo
1a330 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09  f(*retval));....
1a340 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65  }.....memcpy(&re
1a350 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20  tval[numattrs], 
1a360 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65  &curr_attr, size
1a370 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a  of(curr_attr));.
1a380 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09  ...numattrs++;..
1a390 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61  .}..}...if (numa
1a3a0 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72  ttrs != 0) {...r
1a3b0 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75  etval_count = nu
1a3c0 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c  mattrs;...retval
1a3d0 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61   = realloc(retva
1a3e0 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  l, retval_count 
1a3f0 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c  * sizeof(*retval
1a400 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ));..} else {...
1a410 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09  free(retval);...
1a420 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a  .retval = NULL;.
1a430 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
1a440 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43   numattrs;...CAC
1a450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a460 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  ("Returning %lu 
1a470 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20  objects (%p).", 
1a480 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20  numattrs, (void 
1a490 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  *) retval);...re
1a4a0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
1a4b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
1a4c0 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
1a4d0 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
1a4e0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
1a4f0 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64  tities, unsigned
1a500 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73   long identities
1a510 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54  _count) {..CK_AT
1a520 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
1a530 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  tr;..unsigned lo
1a540 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f  ng id_idx, attr_
1a550 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  idx;...if (ident
1a560 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  ities == NULL ||
1a570 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
1a580 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  t == 0) {...retu
1a590 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  rn;..}...for (id
1a5a0 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78  _idx = 0; id_idx
1a5b0 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f   < identities_co
1a5c0 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b  unt; id_idx++) {
1a5d0 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1a5e0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a5f0 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28  utes) {....for (
1a600 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74  attr_idx = 0; at
1a610 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74  tr_idx < identit
1a620 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a630 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74  ibutes_count; at
1a640 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
1a650 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65  curr_attr = &ide
1a660 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1a670 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f  attributes[attr_
1a680 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63  idx];......if (c
1a690 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1a6a0 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
1a6b0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29  rr_attr->pValue)
1a6c0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
1a6d0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
1a6e0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a6f0 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69  es) {.....free(i
1a700 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a710 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09  ].attributes);..
1a720 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66  ..}.....cackey_f
1a730 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69  ree_certs(identi
1a740 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1a750 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31  c_identity, 1, 1
1a760 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65  );...}..}...free
1a770 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a  (identities);.}.
1a780 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64  .static unsigned
1a790 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61   long cackey_rea
1a7a0 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1a7b0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  (struct cackey_i
1a7c0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1a7d0 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ies, unsigned lo
1a7e0 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ng num_dod_certs
1a7f0 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
1a800 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f  ng cert_idx, id_
1a810 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69  idx = 0;...if (i
1a820 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
1a830 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75  L) {...return(nu
1a840 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29  m_dod_certs * 3)
1a850 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74  ;..}...for (cert
1a860 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69  _idx = 0; cert_i
1a870 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  dx < num_dod_cer
1a880 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1a890 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  {...identities[i
1a8a0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1a8b0 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69  tity = NULL;...i
1a8c0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a8d0 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1a8e0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1a8f0 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49  utes(CKO_CERTIFI
1a900 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72  CATE, &extra_cer
1a910 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
1a920 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
1a930 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1a940 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1a950 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
1a960 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65  ++;....identitie
1a970 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1a980 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
1a990 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1a9a0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1a9b0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1a9c0 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c  ributes(CKO_PUBL
1a9d0 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63  IC_KEY, &extra_c
1a9e0 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
1a9f0 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
1aa00 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1aa10 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1aa20 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
1aa30 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74  dx++;....identit
1aa40 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1aa50 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
1aa60 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ;...identities[i
1aa70 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1aa80 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1aa90 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45  ttributes(CKO_NE
1aaa0 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65  TSCAPE_TRUST, &e
1aab0 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
1aac0 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
1aad0 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1aae0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1aaf0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1ab00 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a  ..id_idx++;..}..
1ab10 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b  .return(id_idx);
1ab20 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  .}..static struc
1ab30 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1ab40 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69  y *cackey_read_i
1ab50 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74  dentities(struct
1ab60 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
1ab70 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ot, unsigned lon
1ab80 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a  g *ids_found) {.
1ab90 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
1aba0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
1abb0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
1abc0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1abd0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
1abe0 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
1abf0 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69  ng num_ids, id_i
1ac00 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65  dx, curr_id_type
1ac10 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1ac20 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f   num_certs, num_
1ac30 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f  dod_certs, cert_
1ac40 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64  idx;..int includ
1ac50 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1ac60 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63  0, include_dod_c
1ac70 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  erts;...CACKEY_D
1ac80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1ac90 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64  led.");...if (id
1aca0 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29  s_found == NULL)
1acb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1acc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1acd0 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e    ids_found is N
1ace0 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
1acf0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64  (NULL);..}..#ifd
1ad00 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53  ef CACKEY_CARD_S
1ad10 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52  LOT_INCLUDE_EXTR
1ad20 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65  A_CERTS..include
1ad30 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31  _extra_certs = 1
1ad40 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67  ;.#endif...if (g
1ad50 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f  etenv("CACKEY_DO
1ad60 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c  D_CERTS_ON_HW_SL
1ad70 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  OTS") != NULL) {
1ad80 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  ...include_extra
1ad90 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a  _certs = 1;..}..
1ada0 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1adb0 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53  KEY_NO_DOD_CERTS
1adc0 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
1add0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1ade0 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1adf0 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  = 0;..}..#ifdef 
1ae00 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1ae10 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e  CERTS..if (geten
1ae20 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f  v("CACKEY_EXTRA_
1ae30 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1ae40 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1ae50 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65  _certs = 1;..} e
1ae60 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1ae70 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1ae80 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74  }.#else..if (get
1ae90 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45  env("CACKEY_NO_E
1aea0 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20  XTRA_CERTS") != 
1aeb0 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1aec0 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  e_dod_certs = 0;
1aed0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63  ..} else {...inc
1aee0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1aef0 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09   1;..}.#endif...
1af00 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  if (include_dod_
1af10 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f 64  certs) {...num_d
1af20 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f  od_certs = sizeo
1af30 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f  f(extra_certs) /
1af40 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65   sizeof(extra_ce
1af50 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73 65  rts[0]);..} else
1af60 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
1af70 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  ts = 0;..}...if 
1af80 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29  (slot->internal)
1af90 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63   {...num_ids = c
1afa0 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1afb0 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20  dentities(NULL, 
1afc0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1afd0 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21  ...if (num_ids !
1afe0 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69  = 0) {....identi
1aff0 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1b000 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1b010 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1b020 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1b030 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1b040 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64  ntities, num_dod
1b050 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73  _certs);...} els
1b060 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65  e {....identitie
1b070 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  s = NULL;...}...
1b080 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75  .*ids_found = nu
1b090 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e  m_ids;....return
1b0a0 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d  (identities);..}
1b0b0 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
1b0c0 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1b0d0 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
1b0e0 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
1b0f0 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69  .if (pcsc_identi
1b100 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
1b110 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d  ../* Convert num
1b120 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20  ber of Certs to 
1b130 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  number of object
1b140 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  s */...num_ids =
1b150 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45   (CKO_PRIVATE_KE
1b160 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  Y - CKO_CERTIFIC
1b170 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63  ATE + 1) * num_c
1b180 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63  erts;....if (inc
1b190 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1b1a0 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b  ) {....num_ids +
1b1b0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  = cackey_read_do
1b1c0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c  d_identities(NUL
1b1d0 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  L, num_dod_certs
1b1e0 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69  );...}....identi
1b1f0 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75  ties = malloc(nu
1b200 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a  m_ids * sizeof(*
1b210 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09  identities));...
1b220 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63  ./* Add certific
1b230 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79  ates, public key
1b240 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b  s, and private k
1b250 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61  eys from the sma
1b260 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69  rtcard */...id_i
1b270 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63  dx = 0;...for (c
1b280 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72  ert_idx = 0; cer
1b290 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74  t_idx < num_cert
1b2a0 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b  s; cert_idx++) {
1b2b0 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64  ....for (curr_id
1b2c0 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54  _type = CKO_CERT
1b2d0 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64  IFICATE; curr_id
1b2e0 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49  _type <= CKO_PRI
1b2f0 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69  VATE_KEY; curr_i
1b300 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09  d_type++) {.....
1b310 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1b320 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1b330 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1b340 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79  butes(curr_id_ty
1b350 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  pe, &pcsc_identi
1b360 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1b370 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1b380 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1b390 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1b3a0 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1b3b0 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b3c0 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
1b3d0 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1b3e0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b3f0 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09  identity));.....
1b400 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65  memcpy(identitie
1b410 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1b420 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69  dentity, &pcsc_i
1b430 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1b440 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65  dx], sizeof(*ide
1b450 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b460 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
1b470 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73  ......identities
1b480 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b490 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1b4a0 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73  ate = malloc(pcs
1b4b0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1b4c0 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
1b4d0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
1b4e0 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69  cpy(identities[i
1b4f0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1b500 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
1b510 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
1b520 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
1b530 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69  tificate, pcsc_i
1b540 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1b550 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
1b560 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64  len);......id_id
1b570 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  x++;....}...}...
1b580 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74  .if (include_ext
1b590 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43  ra_certs) {....C
1b5a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b5b0 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53  TF("Including US
1b5c0 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74   Government Cert
1b5d0 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64  ificates on hard
1b5e0 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09  ware slot");....
1b5f0 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1b600 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1b610 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c  tities + id_idx,
1b620 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1b630 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66  ...}....cackey_f
1b640 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69  ree_certs(pcsc_i
1b650 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63  dentities, num_c
1b660 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64  erts, 1);....*id
1b670 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64  s_found = num_id
1b680 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65  s;....return(ide
1b690 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09  ntities);..}....
1b6a0 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a  *ids_found = 0;.
1b6b0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d  .return(NULL);.}
1b6c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1b6d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1b6e0 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  itialize)(CK_VOI
1b6f0 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29  D_PTR pInitArgs)
1b700 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   {..CK_C_INITIAL
1b710 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20  IZE_ARGS CK_PTR 
1b720 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20  args;..uint32_t 
1b730 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f  idx, highest_slo
1b740 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e  t;..int mutex_in
1b750 69 74 5f 72 65 74 3b 0a 09 69 6e 74 20 69 6e 63  it_ret;..int inc
1b760 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a  lude_dod_certs;.
1b770 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b780 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1b790 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  ;...if (cackey_i
1b7a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b7b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b7c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
1b7d0 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1b7e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b7f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
1b800 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
1b810 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74  ;..}...if (pInit
1b820 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
1b830 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
1b840 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
1b850 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
1b860 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
1b870 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
1b880 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1b890 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1b8a0 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
1b8b0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1b8c0 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1b8d0 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1b8e0 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
1b8f0 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1b900 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
1b910 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1b920 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
1b930 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1b940 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1b950 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1b960 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
1b970 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b980 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
1b990 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
1b9a0 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
1b9b0 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
1b9c0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1b9d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1b9e0 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  ..}...}..} else 
1b9f0 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  {...cackey_args.
1ba00 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55  CreateMutex = NU
1ba10 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1ba20 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  s.DestroyMutex =
1ba30 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1ba40 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
1ba50 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1ba60 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
1ba70 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1ba80 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30  y_args.flags = 0
1ba90 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
1baa0 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
1bab0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1bac0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1bad0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1bae0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
1baf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1bb00 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
1bb10 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1bb20 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1bb30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1bb40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1bb50 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
1bb60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
1bb70 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1bb80 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1bb90 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1bba0 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
1bbb0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1bbc0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
1bbd0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1bbe0 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
1bbf0 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
1bc00 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ck = 0;...cackey
1bc10 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
1bc20 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61  _reset = 0;...ca
1bc30 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1bc40 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
1bc50 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1bc60 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  idx].label = NUL
1bc70 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1bc80 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20  s[idx].internal 
1bc90 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  = 0;..}..#ifdef 
1bca0 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1bcb0 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65 6e  CERTS..if (geten
1bcc0 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41 5f  v("CACKEY_EXTRA_
1bcd0 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1bce0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1bcf0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20 65  _certs = 1;..} e
1bd00 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  lse {...include_
1bd10 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
1bd20 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65 74  }.#else..if (get
1bd30 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45  env("CACKEY_NO_E
1bd40 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20  XTRA_CERTS") != 
1bd50 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
1bd60 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  e_dod_certs = 0;
1bd70 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63  ..} else {...inc
1bd80 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1bd90 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09   1;..}.#endif...
1bda0 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  if (include_dod_
1bdb0 63 65 72 74 73 20 3d 3d 20 30 29 20 7b 0a 09 09  certs == 0) {...
1bdc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bdd0 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74  NTF("Asked not t
1bde0 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65  o include DoD ce
1bdf0 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d  rtificates");..}
1be00 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73   else {...highes
1be10 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66  t_slot = (sizeof
1be20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1be30 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1be40 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a  lots[0])) - 1;..
1be50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1be60 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67  RINTF("Including
1be70 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c   DoD certs in sl
1be80 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ot %lu", (unsign
1be90 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74  ed long) highest
1bea0 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65  _slot);....cacke
1beb0 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1bec0 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31  slot].active = 1
1bed0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1bee0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69  [highest_slot].i
1bef0 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63  nternal = 1;...c
1bf00 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1bf10 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20  est_slot].label 
1bf20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
1bf30 20 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65   *) "US Governme
1bf40 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73 22  nt Certificates"
1bf50 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1bf60 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70  [highest_slot].p
1bf70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41  csc_reader = "CA
1bf80 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f  CKey";...cackey_
1bf90 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1bfa0 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1bfb0 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  = 0;..}...cackey
1bfc0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31  _initialized = 1
1bfd0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1bfe0 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a  biglock_init) {.
1bff0 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  ..mutex_init_ret
1c000 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1c010 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62  create(&cackey_b
1c020 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
1c030 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21  mutex_init_ret !
1c040 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
1c050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c060 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69  rror.  Mutex ini
1c070 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c  tialization fail
1c080 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ed.");.....retur
1c090 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29  n(CKR_CANT_LOCK)
1c0a0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1c0b0 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31  biglock_init = 1
1c0c0 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69 6e 65  ;..}.../* Define
1c0d0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72   a command to pr
1c0e0 6f 6d 70 74 20 75 73 65 72 20 66 6f 72 20 61 20  ompt user for a 
1c0f0 50 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20 43 41  PIN */.#ifdef CA
1c100 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1c110 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b 65 79  _DEFAULT..cackey
1c120 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 43  _pin_command = C
1c130 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c140 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  D_DEFAULT_XSTR(C
1c150 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c160 44 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65 6e 64  D_DEFAULT);.#end
1c170 69 66 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  if..#ifdef CACKE
1c180 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f  Y_PIN_COMMAND_XO
1c190 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 69 66 20  NLY_DEFAULT..if 
1c1a0 28 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59  (getenv("DISPLAY
1c1b0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c1c0 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1c1d0 6e 64 20 3d 20 43 41 43 4b 45 59 5f 50 49 4e 5f  nd = CACKEY_PIN_
1c1e0 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f  COMMAND_DEFAULT_
1c1f0 58 53 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f  XSTR(CACKEY_PIN_
1c200 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1c210 46 41 55 4c 54 29 3b 0a 09 7d 0a 23 65 6e 64 69  FAULT);..}.#endi
1c220 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  f...if (getenv("
1c230 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1c240 4e 44 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ND") != NULL) {.
1c250 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  ..cackey_pin_com
1c260 6d 61 6e 64 20 3d 20 67 65 74 65 6e 76 28 22 43  mand = getenv("C
1c270 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c280 44 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  D");..}...if (ge
1c290 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1c2a0 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29  _COMMAND_XONLY")
1c2b0 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65 74 65   != NULL && gete
1c2c0 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d  nv("DISPLAY") !=
1c2d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1c2e0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20  y_pin_command = 
1c2f0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1c300 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1c310 22 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ");..}...CACKEY_
1c320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1c330 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1c340 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1c350 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1c360 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1c370 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c380 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49  Finalize)(CK_VOI
1c390 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
1c3a0 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
1c3b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c3c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c3d0 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
1c3e0 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
1c3f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c400 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
1c410 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
1c420 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1c430 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c440 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1c450 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1c460 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1c470 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c480 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1c490 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1c4a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1c4b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1c4c0 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
1c4d0 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   0; idx < (sizeo
1c4e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1c4f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1c500 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1c510 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1c520 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c530 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
1c540 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  ...C_CloseSessio
1c550 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  n(idx);...}..}..
1c560 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
1c570 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
1c580 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1c590 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1c5a0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1c5b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1c5c0 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1c5d0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1c5e0 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61  ots[idx].interna
1c5f0 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65  l) {....continue
1c600 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
1c610 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1c620 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09  csc_reader) {...
1c630 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1c640 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1c650 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  der);...}....if 
1c660 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1c670 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29  x].cached_certs)
1c680 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
1c690 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73  e_certs(cackey_s
1c6a0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1c6b0 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73  _certs, cackey_s
1c6c0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1c6d0 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
1c6e0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
1c6f0 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63  ts[idx].cached_c
1c700 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  erts = NULL;...}
1c710 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73  ..}...cackey_pcs
1c720 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1c730 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1c740 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  ized = 0;...CACK
1c750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c760 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1c770 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1c780 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1c790 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1c7a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1c7b0 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49   C_GetInfo)(CK_I
1c7c0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1c7d0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1c7e0 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
1c7f0 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
1c800 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
1c810 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c  ic CK_UTF8CHAR l
1c820 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1c830 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  n[] = "CACKey";.
1c840 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c850 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1c860 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1c870 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c890 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1c8a0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1c8b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1c8c0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1c8d0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1c8e0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1c8f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c900 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1c910 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1c920 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1c930 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1c940 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63  );..}...pInfo->c
1c950 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d  ryptokiVersion.m
1c960 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  ajor = ((CACKEY_
1c970 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
1c980 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20  _CODE) >> 16) & 
1c990 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72  0xff;..pInfo->cr
1c9a0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69  yptokiVersion.mi
1c9b0 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  nor = ((CACKEY_C
1c9c0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1c9d0 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78  CODE) >> 8) & 0x
1c9e0 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  ff;...memset(pIn
1c9f0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1ca00 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1ca10 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ca20 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79  rerID));..memcpy
1ca30 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1ca40 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74  urerID, manufact
1ca50 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d  urerID, sizeof(m
1ca60 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d  anufacturerID) -
1ca70 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c   1);...pInfo->fl
1ca80 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65  ags = 0x00;...me
1ca90 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  mset(pInfo->libr
1caa0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
1cab0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1cac0 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69  o->libraryDescri
1cad0 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
1cae0 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
1caf0 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72  escription, libr
1cb00 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  aryDescription, 
1cb10 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65  sizeof(libraryDe
1cb20 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
1cb30 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  ...pInfo->librar
1cb40 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  yVersion.major =
1cb50 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1cb60 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1cb70 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  xff;..pInfo->lib
1cb80 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f  raryVersion.mino
1cb90 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1cba0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26  ersion() >> 8) &
1cbb0 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f   0xff;...CACKEY_
1cbc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1cbd0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1cbe0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1cbf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1cc00 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73  .}../*. * Proces
1cc10 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72  s list of reader
1cc20 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61  s, and create ma
1cc30 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65  pping between re
1cc40 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c  ader name and sl
1cc50 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46  ot ID. */.CK_DEF
1cc60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1cc70 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73  RV, C_GetSlotLis
1cc80 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65  t)(CK_BBOOL toke
1cc90 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f  nPresent, CK_SLO
1cca0 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69  T_ID_PTR pSlotLi
1ccb0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1ccc0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
1ccd0 61 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63  atic int first_c
1cce0 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  all = 1;..int mu
1ccf0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1cd00 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
1cd10 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75  t;..CK_ULONG cou
1cd20 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  nt, slot_count =
1cd30 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c   0, currslot, sl
1cd40 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70  ot_idx;..char *p
1cd50 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63  csc_readers, *pc
1cd60 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70  sc_readers_s, *p
1cd70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09  csc_readers_e;..
1cd80 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65  DWORD pcsc_reade
1cd90 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  rs_len;..LONG sc
1cda0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1cdb0 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72  ret;..size_t cur
1cdc0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69  r_reader_len;..i
1cdd0 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a  nt slot_reset;..
1cde0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cdf0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ce00 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
1ce10 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1ce20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ce30 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e  ("Error. pulCoun
1ce40 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
1ce50 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1ce60 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1ce70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
1ce80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
1ce90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cea0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
1ceb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1cec0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1ced0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
1cee0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  LIZED);..}...mut
1cef0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1cf00 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
1cf10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1cf20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1cf30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1cf40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf50 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
1cf60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1cf70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1cf80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
1cf90 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73   Clear list of s
1cfa0 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65  lots */..slot_re
1cfb0 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53  set = 0;..if (pS
1cfc0 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20  lotList) {...if 
1cfd0 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09  (first_call) {..
1cfe0 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30  ..first_call = 0
1cff0 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74  ;.....slot_reset
1d000 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20   = 1;...}..../* 
1d010 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c  If any of the sl
1d020 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ots have been re
1d030 73 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61  set then purge a
1d040 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
1d050 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a  nd check again *
1d060 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  /...for (currslo
1d070 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
1d080 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1d090 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1d0a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1d0b0 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20  )); currslot++) 
1d0c0 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  {....if (cackey_
1d0d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d0e0 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09  internal) {.....
1d0f0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
1d100 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d110 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1d120 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e  ctive) {.....con
1d130 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
1d140 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1d150 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f  [currslot].slot_
1d160 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f  reset) {.....slo
1d170 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09  t_reset = 1;....
1d180 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
1d190 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65  }....if (slot_re
1d1a0 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  set) {....CACKEY
1d1b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
1d1c0 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20  urging all slot 
1d1d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a  information.");.
1d1e0 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
1d1f0 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
1d200 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
1d210 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75  ctually being su
1d220 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e  pply the slot in
1d230 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09  formation */....
1d240 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
1d250 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
1d260 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1d270 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1d280 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d290 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1d2a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1d2b0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1d2c0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d2d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d2e0 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09  internal) {.....
1d2f0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d  .continue;.....}
1d300 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79  ......if (cackey
1d310 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1d320 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
1d330 09 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
1d340 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1d350 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a  .pcsc_reader);..
1d360 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1d370 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1d380 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a  _reader = NULL;.
1d390 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
1d3a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d3b0 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  slot].label) {..
1d3c0 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1d3d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d3e0 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61  label);.......ca
1d3f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d400 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  lot].label = NUL
1d410 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61  L;.....}......ca
1d420 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d430 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b  lot].active = 0;
1d440 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
1d450 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a  .......}..}.../*
1d460 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20   Determine list 
1d470 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70  of readers */..p
1d480 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
1d490 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  = cackey_pcsc_co
1d4a0 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63  nnect();..if (pc
1d4b0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21  sc_connect_ret !
1d4c0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1d4d0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
1d4e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
1d4f0 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43  nection to PC/SC
1d500 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e   failed, assumin
1d510 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09  g no slots");...
1d520 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b  .slot_count = 0;
1d530 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73  ..} else {...pcs
1d540 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20  c_readers_len = 
1d550 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74  0;....scard_list
1d560 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43  readers_ret = SC
1d570 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a  ardListReaders(*
1d580 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
1d590 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  le, NULL, NULL, 
1d5a0 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65  &pcsc_readers_le
1d5b0 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  n);....if (scard
1d5c0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d5d0 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d   == SCARD_F_COMM
1d5e0 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43  _ERROR) {....CAC
1d5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d600 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69  ("Error. SCardLi
1d610 73 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75  stReaders() retu
1d620 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d  rned SCARD_F_COM
1d630 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e  M_ERROR, assumin
1d640 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  g Connection to 
1d650 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e  PC/SC went away.
1d660 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29   Reconnecting.")
1d670 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  ;.....cackey_pcs
1d680 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a  c_disconnect();.
1d690 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  ...cackey_pcsc_c
1d6a0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41  onnect();.....CA
1d6b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d6c0 46 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c  F("Trying SCardL
1d6d0 69 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61  istReaders() aga
1d6e0 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c  in");....scard_l
1d6f0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1d700 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1d710 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1d720 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
1d730 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
1d740 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  _len);...}....if
1d750 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
1d760 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
1d770 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63  _S_SUCCESS && pc
1d780 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21  sc_readers_len !
1d790 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72  = 0) {....pcsc_r
1d7a0 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28  eaders = malloc(
1d7b0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1d7c0 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65  );....pcsc_reade
1d7d0 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_s = pcsc_read
1d7e0 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c  ers;.....scard_l
1d7f0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1d800 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1d810 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1d820 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73  andle, NULL, pcs
1d830 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63  c_readers, &pcsc
1d840 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
1d850 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74  ..if (scard_list
1d860 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53  readers_ret == S
1d870 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
1d880 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  {.....pcsc_reade
1d890 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64  rs_e = pcsc_read
1d8a0 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65  ers + pcsc_reade
1d8b0 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20  rs_len;....../* 
1d8c0 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20  Start with Slot 
1d8d0 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61  ID 1, to avoid a
1d8e0 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52   bug in GDM on R
1d8f0 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75  HEL */...../* Bu
1d900 67 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a  g 594911: https:
1d910 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61  //bugzilla.redha
1d920 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63  t.com/show_bug.c
1d930 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a  gi?id=594911 */.
1d940 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31  ....currslot = 1
1d950 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ;.....slot_count
1d960 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20   = 0;.....while 
1d970 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20  (pcsc_readers < 
1d980 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
1d990 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e  {....../* Find n
1d9a0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c  ext available sl
1d9b0 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28  ot */......for (
1d9c0 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1d9d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d9e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d9f0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1da00 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1da10 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1da20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1da30 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09  ctive) {........
1da40 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09  break;.......}..
1da50 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72  ....}.......curr
1da60 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74  _reader_len = st
1da70 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72  rlen(pcsc_reader
1da80 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70  s);.......if ((p
1da90 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75  csc_readers + cu
1daa0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e  rr_reader_len) >
1dab0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29   pcsc_readers_e)
1dac0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1dad0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1dae0 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e  (curr_reader_len
1daf0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62   == 0) {.......b
1db00 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1db10 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20  ...if (currslot 
1db20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1db30 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1db40 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1db50 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ]))) {.......CAC
1db60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1db70 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61  ("Found more rea
1db80 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20  ders than slots 
1db90 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29  are available!")
1dba0 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
1dbb0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43  .....}.......CAC
1dbc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dbd0 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20  ("Found reader: 
1dbe0 25 73 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 25  %s (currslot = %
1dbf0 6c 75 29 22 2c 20 70 63 73 63 5f 72 65 61 64 65  lu)", pcsc_reade
1dc00 72 73 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  rs, (unsigned lo
1dc10 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1dc20 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64  ...../* Only upd
1dc30 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ate the list of 
1dc40 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20  slots if we are 
1dc50 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61  actually being a
1dc60 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20  sked supply the 
1dc70 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  slot information
1dc80 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c   */......if (pSl
1dc90 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09  otList) {.......
1dca0 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20  if (slot_reset) 
1dcb0 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  {........cackey_
1dcc0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1dcd0 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09  active = 1;.....
1dce0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1dcf0 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1dd00 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  al = 0;........c
1dd10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1dd20 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1dd30 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f  r = strdup(pcsc_
1dd40 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09  readers);.......
1dd50 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1dd60 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72  rrslot].pcsc_car
1dd70 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
1dd80 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1dd90 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
1dda0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
1ddb0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
1ddc0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1ddd0 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot].transaction_
1dde0 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
1ddf0 3b 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63  ;........if (cac
1de00 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1de10 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09  == NULL) {......
1de20 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1de30 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
1de40 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
1de50 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09  N_REQUIRED;.....
1de60 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1de70 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1de80 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
1de90 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09  _flags = 0;.....
1dea0 09 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b  ...}........cack
1deb0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1dec0 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  t].label = NULL;
1ded0 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  .........cackey_
1dee0 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
1def0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  &cackey_slots[cu
1df00 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09  rrslot]);.......
1df10 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  }......} else {.
1df20 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
1df30 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1df40 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
1df50 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c  .../* Artificial
1df60 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  ly increase the 
1df70 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65  number of active
1df80 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77   slots by what w
1df90 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76  ill become activ
1dfa0 65 20 2a 2f 0a 09 09 09 09 09 09 09 43 41 43 4b  e */........CACK
1dfb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dfc0 22 46 6f 75 6e 64 20 69 6e 2d 61 63 74 69 76 65  "Found in-active
1dfd0 20 73 6c 6f 74 20 25 6c 75 2c 20 62 75 74 20 69   slot %lu, but i
1dfe0 74 20 77 69 6c 6c 20 62 65 20 61 63 74 69 76 65  t will be active
1dff0 20 61 66 74 65 72 20 61 20 72 65 73 65 74 20 2d   after a reset -
1e000 2d 20 6d 61 72 6b 69 6e 67 20 61 73 20 61 63 74  - marking as act
1e010 69 76 65 20 66 6f 72 20 61 63 63 6f 75 6e 74 69  ive for accounti
1e020 6e 67 20 70 75 72 70 6f 73 65 73 22 2c 20 28 75  ng purposes", (u
1e030 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1e040 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09  rrslot);........
1e050 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
1e060 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 09 09  .....}......}...
1e070 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
1e080 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
1e090 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
1e0a0 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
1e0b0 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
1e0c0 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
1e0d0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1e0e0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1e0f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1e100 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1e110 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b   {......if (cack
1e120 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1e130 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1e140 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e150 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
1e160 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 2c 20 72  tive slot %lu, r
1e170 65 61 64 65 72 20 3d 20 25 73 22 2c 20 28 75 6e  eader = %s", (un
1e180 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1e190 72 73 6c 6f 74 2c 20 63 61 63 6b 65 79 5f 73 6c  rslot, cackey_sl
1e1a0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1e1b0 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09  sc_reader);.....
1e1c0 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
1e1d0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
1e1e0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
1e1f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e200 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74  F("Second call t
1e210 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
1e220 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
1e230 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
1e240 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
1e250 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
1e260 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1e270 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
1e280 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1e290 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65  t);....}.....fre
1e2a0 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  e(pcsc_readers_s
1e2b0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1e2c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e2d0 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c  INTF("First call
1e2e0 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
1e2f0 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
1e300 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
1e310 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
1e320 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
1e330 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1e340 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
1e350 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1e360 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ret);...}..}...m
1e370 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e380 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e390 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e3a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1e3b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1e3c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e3d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1e3e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e3f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e400 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e410 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  }...if (pSlotLis
1e420 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
1e430 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
1e440 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59  count;....CACKEY
1e450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e460 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1e470 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
1e480 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f   readers, but no
1e490 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70  t storing IDs (p
1e4a0 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
1e4b0 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73  )", CKR_OK, (uns
1e4c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74  igned long) slot
1e4d0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
1e4e0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
1e4f0 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75  .count = *pulCou
1e500 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c  nt;..if (count <
1e510 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09   slot_count) {..
1e520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e530 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
1e540 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
1e550 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
1e560 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73  have %lu entries
1e570 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  .", count, slot_
1e580 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
1e590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e5a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
1e5b0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  FFER_TOO_SMALL")
1e5c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e5d0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1e5e0 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  );...}...mutex_r
1e5f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e600 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1e610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e620 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e630 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e640 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e650 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1e660 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e670 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1e680 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69  OR);..}...slot_i
1e690 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
1e6a0 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72  rrslot = 0; (cur
1e6b0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1e6c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1e6d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e6e0 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73  ots[0]))); currs
1e6f0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  lot++) {...if (!
1e700 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1e710 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1e720 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1e730 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64  }....if (slot_id
1e740 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09  x >= count) {...
1e750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e760 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
1e770 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
1e780 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
1e790 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72  just tried to wr
1e7a0 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69  ite to the %lu i
1e7b0 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67  ndex -- ignoring
1e7c0 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69  ", count, slot_i
1e7d0 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  dx);.....continu
1e7e0 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c  e;...}....pSlotL
1e7f0 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20  ist[slot_idx] = 
1e800 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74  currslot;...slot
1e810 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74  _idx++;..}...mut
1e820 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1e830 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e840 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e850 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1e860 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1e870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e880 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1e890 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1e8a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1e8b0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1e8c0 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
1e8d0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
1e8e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e8f0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1e900 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
1e910 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
1e920 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1e930 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1e940 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1e950 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
1e960 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
1e970 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
1e980 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
1e990 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
1e9a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e9b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
1e9c0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
1e9d0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
1e9e0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1e9f0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1ea00 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
1ea10 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
1ea20 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
1ea30 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1ea40 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
1ea50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ea60 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1ea70 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1ea80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1ea90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1eaa0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1eab0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1eac0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ead0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1eae0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1eaf0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1eb00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1eb20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1eb30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1eb40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1eb50 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1eb60 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1eb70 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1eb80 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1eb90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1eba0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1ebb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ebc0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1ebd0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1ebe0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1ebf0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1ec00 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1ec10 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1ec20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1ec30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ec40 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ec50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ec60 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ec70 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ec80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ec90 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1eca0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ecb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1ecc0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ecd0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1ece0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1ecf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1ed00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ed10 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1ed20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1ed30 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1ed40 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1ed50 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1ed60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ed70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ed80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1ed90 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1eda0 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1edb0 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a  = CKF_HW_SLOT;..
1edc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
1edd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72  ts[slotID].inter
1ede0 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  nal) {...pInfo->
1edf0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d  flags |= CKF_REM
1ee00 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09  OVABLE_DEVICE;..
1ee10 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
1ee20 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1ee30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1ee40 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  D]) == CACKEY_PC
1ee50 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1ee60 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  T) {...pInfo->fl
1ee70 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e  ags |= CKF_TOKEN
1ee80 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62  _PRESENT;..}...b
1ee90 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
1eea0 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f  trlen(cackey_slo
1eeb0 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
1eec0 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69  reader);..if (si
1eed0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1eee0 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79  facturerID) < by
1eef0 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
1ef00 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
1ef10 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1ef20 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a  anufacturerID);.
1ef30 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  .}..memcpy(pInfo
1ef40 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1ef50 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
1ef60 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1ef70 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  er, bytes_to_cop
1ef80 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y);...mutex_retv
1ef90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1efa0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1efb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1efc0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1efd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1efe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1eff0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1f000 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1f010 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1f020 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
1f030 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  t(pInfo->slotDes
1f040 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1f050 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f  izeof(pInfo->slo
1f060 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  tDescription));.
1f070 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73  .memcpy(pInfo->s
1f080 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1f090 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
1f0a0 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63   sizeof(slotDesc
1f0b0 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
1f0c0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
1f0d0 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
1f0e0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1f0f0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1f100 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1f110 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1f120 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1f130 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1f140 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1f150 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1f160 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1f170 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1f180 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1f190 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1f1a0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1f1b0 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1f1c0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1f1d0 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45   = 0x00;...CACKE
1f1e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f1f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1f200 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1f210 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f220 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f230 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f240 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28  C_GetTokenInfo)(
1f250 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1f260 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  D, CK_TOKEN_INFO
1f270 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
1f280 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1f290 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
1f2a0 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
1f2b0 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
1f2c0 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61  CK_UTF8CHAR defa
1f2d0 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e  ultLabel[] = "Un
1f2e0 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73  known Token";..s
1f2f0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1f300 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43  R model[] = "CAC
1f310 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74   Token";..struct
1f320 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
1f330 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
1f340 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
1f350 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
1f360 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c  ;..ssize_t label
1f370 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
1f380 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73  _retval;..int us
1f390 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b  e_default_label;
1f3a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f3b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f3c0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1f3d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1f3e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f3f0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1f400 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1f410 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1f420 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1f430 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f440 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f460 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f470 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f480 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f490 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f4a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1f4b0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1f4c0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1f4d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1f4e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1f4f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1f500 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f510 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1f520 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1f530 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1f540 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1f550 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1f560 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1f570 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1f580 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1f590 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1f5a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1f5b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1f5c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1f5d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f5e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1f5f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1f600 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1f610 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1f620 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1f630 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1f640 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1f650 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f660 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1f670 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1f680 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1f690 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1f6a0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1f6b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1f6c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1f6d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1f6e0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1f6f0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
1f700 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
1f710 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1f720 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
1f730 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
1f740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f750 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f  UG_PRINTF("No to
1f760 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ken is present i
1f770 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c  n slotID = %lu",
1f780 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1f790 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f7a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f7b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f7c0 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e  TOKEN_NOT_PRESEN
1f7d0 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  T);..}...mutex_r
1f7e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1f7f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1f800 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1f810 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1f820 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f840 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1f850 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1f860 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1f870 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
1f880 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e   Determine token
1f890 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74   label from cert
1f8a0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d  ificates */..mem
1f8b0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
1f8c0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1f8d0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75  nfo->label));..u
1f8e0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1f8f0 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 1;...if (cack
1f900 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f910 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20  .label == NULL) 
1f920 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74  {...pcsc_identit
1f930 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1f940 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f  d_certs(&cackey_
1f950 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e  slots[slotID], N
1f960 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
1f970 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65  ;...if (pcsc_ide
1f980 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
1f990 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65   {....if (num_ce
1f9a0 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c  rts > 0) {.....l
1f9b0 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65  abel_ret = cacke
1f9c0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
1f9d0 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64  to_label(pcsc_id
1f9e0 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d  entities, pInfo-
1f9f0 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1fa00 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1fa10 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74  ...if (label_ret
1fa20 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65   > 0) {......use
1fa30 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
1fa40 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
1fa50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1fa60 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  abel = malloc(si
1fa70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1fa80 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70  l));.......memcp
1fa90 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  y(cackey_slots[s
1faa0 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49  lotID].label, pI
1fab0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
1fac0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1fad0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1fae0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1faf0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
1fb00 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
1fb10 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
1fb20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
1fb30 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f  ->label, cackey_
1fb40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1fb50 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1fb60 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75  o->label));....u
1fb70 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1fb80 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75   = 0;..}...if (u
1fb90 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1fba0 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
1fbb0 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
1fbc0 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
1fbd0 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
1fbe0 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
1fbf0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1fc00 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1fc10 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1fc20 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1fc30 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1fc40 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1fc50 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1fc60 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1fc70 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1fc80 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
1fc90 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1fca0 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
1fcb0 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
1fcc0 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
1fcd0 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
1fce0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
1fcf0 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
1fd00 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
1fd10 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
1fd20 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
1fd30 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
1fd40 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
1fd50 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1fd60 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1fd70 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1fd80 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1fd90 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1fda0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1fdb0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1fdc0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1fdd0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1fde0 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1fdf0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1fe00 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1fe10 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1fe20 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
1fe30 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
1fe40 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
1fe50 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
1fe60 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
1fe70 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
1fe80 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   | cackey_slots[
1fe90 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1fea0 61 67 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  ags;...if (cacke
1feb0 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d  y_pin_command !=
1fec0 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f   NULL) {...pInfo
1fed0 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50  ->flags |= CKF_P
1fee0 52 4f 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54  ROTECTED_AUTHENT
1fef0 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d  ICATION_PATH;..}
1ff00 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
1ff10 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
1ff20 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1ff30 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1ff40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1ff50 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
1ff60 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
1ff70 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1ff80 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1ff90 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
1ffa0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
1ffb0 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
1ffc0 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
1ffd0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1ffe0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1fff0 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
20000 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
20010 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
20020 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
20030 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
20040 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
20050 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
20060 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
20070 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
20080 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
20090 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
200a0 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
200b0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
200c0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
200d0 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
200e0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
200f0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
20100 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
20110 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20120 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
20130 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
20140 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
20150 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20160 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
20170 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
20180 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
20190 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
201a0 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
201b0 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
201c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
201d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
201e0 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
201f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
20200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20210 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
20220 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
20230 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20240 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
20250 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
20260 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20290 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
202a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
202b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
202c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
202d0 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
202e0 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
202f0 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
20300 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20310 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
20320 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
20330 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
20340 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20350 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20360 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20370 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
20380 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20390 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
203a0 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
203b0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
203c0 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
203d0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
203e0 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
203f0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
20400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20410 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
20420 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
20430 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
20440 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20450 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20460 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20470 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20480 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20490 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
204a0 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
204b0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
204c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
204d0 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
204e0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
204f0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
20500 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
20510 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
20520 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
20530 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....CAC
20540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20550 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20560 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
20570 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20580 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
20590 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
205a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
205b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
205c0 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
205d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
205e0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
205f0 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
20600 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
20610 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
20620 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
20630 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20640 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20650 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
20660 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
20670 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
20680 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20690 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
206a0 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
206b0 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
206c0 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
206d0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
206e0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
206f0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
20700 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
20710 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20720 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
20730 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
20740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20750 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
20760 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
20770 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
20780 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
20790 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
207a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
207b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
207c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
207d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
207e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
207f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20800 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
20810 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
20820 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
20830 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
20840 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
20850 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
20860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20870 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
20880 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
20890 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
208a0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
208b0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
208c0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
208d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
208e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
208f0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
20900 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20910 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
20920 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
20930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20940 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
20950 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20960 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20970 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20980 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
20990 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
209a0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
209b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
209c0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
209d0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
209e0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
209f0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
20a00 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
20a10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20a20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20a30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
20a40 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
20a50 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
20a60 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20a70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20a80 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20a90 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
20aa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20ab0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20ac0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
20ad0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20ae0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20af0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
20b00 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
20b10 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
20b20 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
20b30 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
20b40 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
20b50 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
20b60 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
20b70 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
20b80 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
20b90 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
20ba0 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
20bb0 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
20bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
20bd0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
20be0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
20bf0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
20c00 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
20c10 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
20c20 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
20c30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20c40 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
20c50 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
20c60 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
20c70 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
20c80 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
20c90 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
20ca0 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
20cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20cc0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20cd0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20ce0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20cf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20d00 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20d10 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20d20 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
20d30 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20d40 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
20d50 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20d60 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
20d70 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
20d80 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
20d90 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
20da0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
20db0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
20dc0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
20dd0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
20de0 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
20df0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20e00 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
20e10 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20e20 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20e30 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
20e40 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
20e50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
20e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20e70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20e80 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20e90 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20ea0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20eb0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20ec0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20ed0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20ee0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20ef0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20f10 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
20f20 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20f30 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
20f40 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
20f50 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20f60 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
20f70 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
20f80 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
20f90 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
20fa0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20fb0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50  ON(CK_RV, C_SetP
20fc0 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  IN)(CK_SESSION_H
20fd0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20fe0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
20ff0 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pOldPin, CK_ULON
21000 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43  G ulOldPinLen, C
21010 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
21020 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  NewPin, CK_ULONG
21030 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a   ulNewPinLen) {.
21040 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21050 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21060 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21070 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21090 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
210a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
210b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
210c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
210d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
210e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
210f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21100 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
21110 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
21120 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21130 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
21140 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
21150 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
21160 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21170 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21180 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
21190 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
211a0 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
211b0 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
211c0 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
211d0 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
211e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
211f0 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
21200 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
21210 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
21220 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
21230 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
21240 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21250 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
21260 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
21270 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
21280 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
21290 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
212a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
212b0 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
212c0 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
212d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
212e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
212f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21300 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
21310 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
21320 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
21330 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
21340 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
21350 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
21360 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
21370 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
21380 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21390 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
213a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
213b0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
213c0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
213d0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
213e0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
213f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
21400 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
21410 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21420 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21430 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
21440 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21450 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21460 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
21470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21480 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
21490 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
214a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
214b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
214c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
214d0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
214e0 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
214f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21500 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21510 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21520 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
21530 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
21540 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
21550 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21560 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21570 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21580 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21590 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
215a0 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
215b0 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
215c0 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
215d0 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
215e0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
215f0 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
21600 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
21610 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
21620 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
21630 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
21640 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
21650 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
21660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21680 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
21690 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
216a0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
216b0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
216c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
216d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
216e0 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
216f0 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
21700 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
21710 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
21720 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
21730 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21740 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
21750 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
21760 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
21770 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
21780 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
21790 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
217a0 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
217b0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
217c0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
217d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
217e0 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
217f0 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
21800 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
21810 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
21820 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
21830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
21840 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
21850 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
21860 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
21870 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
21880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21890 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
218a0 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
218b0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
218c0 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
218d0 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
218e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
218f0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
21900 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
21910 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
21920 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
21930 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
21940 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
21950 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
21960 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
21970 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
21980 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
21990 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
219a0 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
219b0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
219c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
219d0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
219e0 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
219f0 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
21a00 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
21a10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21a20 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
21a30 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
21a40 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
21a50 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
21a60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21a70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21a80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21a90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21aa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21ab0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
21ac0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
21ad0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21ae0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21af0 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
21b00 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
21b10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21b20 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
21b30 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
21b40 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
21b50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21b60 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
21b70 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21b80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21b90 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
21ba0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
21bb0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
21bc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
21bd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
21be0 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
21bf0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21c00 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
21c10 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
21c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21c30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21c40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21c50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21c70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21c80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21c90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21ca0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21cb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
21cc0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
21cd0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
21ce0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21cf0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21d00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21d10 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21d30 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
21d40 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
21d50 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21d60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21d70 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
21d80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21d90 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
21da0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21db0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21dc0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21de0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21df0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21e00 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21e10 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21e20 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
21e30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21e40 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
21e50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21e60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21e70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21e80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
21e90 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
21ea0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21eb0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21ec0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21ed0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21ee0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21ef0 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
21f00 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
21f10 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21f20 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
21f30 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
21f40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21f50 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
21f60 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
21f70 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21f80 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21f90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21fa0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21fb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21fc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21fd0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21fe0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21ff0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22000 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
22010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22020 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
22030 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
22040 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
22050 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22060 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22070 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
22080 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
22090 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
220a0 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
220b0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
220c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
220d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
220e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
220f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
22100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22110 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
22120 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
22130 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
22140 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22150 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
22160 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
22170 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
22180 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
22190 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
221a0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
221b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
221c0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
221d0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
221e0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
221f0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
22200 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
22210 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
22220 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
22230 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
22240 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
22250 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22260 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22270 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22290 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
222a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
222b0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
222c0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
222d0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
222e0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
222f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22310 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
22320 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
22330 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
22340 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
22350 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
22360 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22370 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22380 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
22390 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
223a0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
223b0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
223c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
223d0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
223e0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
223f0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
22400 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22410 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
22420 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
22430 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
22440 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
22450 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
22460 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
22470 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22480 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
22490 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
224a0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
224b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
224c0 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
224d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
224e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
224f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22500 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22510 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22520 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22530 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
22540 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
22550 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22560 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22570 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22580 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22590 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
225a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
225b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
225c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
225d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
225e0 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
225f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
22600 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
22610 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
22620 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
22630 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
22640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22650 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22660 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
22670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22680 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22690 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
226a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
226b0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
226c0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
226d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
226e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
226f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22700 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22710 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22720 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22730 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22740 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
22750 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
22760 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
22770 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22780 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22790 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
227a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
227b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
227c0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
227d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
227e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
227f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22800 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
22810 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
22820 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
22830 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22840 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
22850 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22860 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
22870 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
22880 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22890 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
228a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
228b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
228c0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
228d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
228e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
228f0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
22900 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22910 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
22920 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
22930 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22940 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22950 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
22960 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
22970 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22980 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
22990 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
229a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
229b0 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
229c0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
229d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
229e0 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
229f0 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
22a00 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
22a10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
22a20 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
22a30 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
22a40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
22a50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22a60 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
22a70 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
22a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22a90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
22aa0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22ab0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22ac0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22ad0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22ae0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22af0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
22b00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
22b10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
22b20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22b30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
22b40 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
22b50 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22b60 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
22b70 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
22b80 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
22b90 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
22ba0 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
22bb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22bc0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22bd0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22be0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22bf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22c00 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22c10 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22c20 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22c30 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22c40 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
22c50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22c60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22c70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22c80 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
22c90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22ca0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
22cb0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
22cc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22cd0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22ce0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
22cf0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
22d00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22d10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22d20 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
22d30 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
22d40 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
22d50 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
22d60 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
22d70 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
22d80 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
22d90 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
22da0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22db0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22dc0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22dd0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22df0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22e00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22e10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22e20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22e30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e50 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22e60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22e70 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22e80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22e90 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22ea0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22eb0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22ec0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22ed0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22ee0 20 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72   _C_LoginMutexAr
22ef0 67 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  g)(CK_SESSION_HA
22f00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22f10 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
22f20 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
22f30 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
22f40 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 69  LONG ulPinLen, i
22f50 6e 74 20 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  nt lock_mutex) {
22f60 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
22f70 74 49 44 3b 0a 09 46 49 4c 45 20 2a 70 69 6e 66  tID;..FILE *pinf
22f80 64 3b 0a 09 63 68 61 72 20 2a 70 69 6e 63 6d 64  d;..char *pincmd
22f90 2c 20 70 69 6e 62 75 66 5b 36 34 5d 2c 20 2a 66  , pinbuf[64], *f
22fa0 67 65 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  gets_ret;..int m
22fb0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
22fc0 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
22fd0 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65  g;..int login_re
22fe0 74 3b 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72  t;..int pclose_r
22ff0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
23000 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23010 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23020 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23030 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23040 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23050 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23060 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23070 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23080 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23090 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
230a0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
230b0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
230c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
230d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
230e0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
230f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23100 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23110 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
23120 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23130 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23140 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23150 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70  .}...if (userTyp
23160 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b  e != CKU_USER) {
23170 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23180 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23190 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
231a0 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64  USER mode, asked
231b0 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c   for %lu mode.",
231c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
231d0 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65   userType)....re
231e0 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59  turn(CKR_USER_TY
231f0 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  PE_INVALID);..}.
23200 0a 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78  ..if (lock_mutex
23210 29 20 7b 0a 09 09 6d 75 74 65 78 5f 72 65 74 76  ) {...mutex_retv
23220 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
23230 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
23240 67 6c 6f 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75  glock);...if (mu
23250 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
23260 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
23270 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23280 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
23290 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  d.");.....return
232a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
232b0 4f 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  OR);...}..}...if
232c0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
232d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
232e0 69 76 65 29 20 7b 0a 09 09 69 66 20 28 6c 6f 63  ive) {...if (loc
232f0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61  k_mutex) {....ca
23300 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
23310 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23320 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
23330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23340 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
23350 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
23360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
23370 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
23380 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
23390 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
233a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
233b0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
233c0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
233d0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
233e0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
233f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
23400 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
23410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23420 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
23430 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
23440 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
23450 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
23460 6f 74 49 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  otID);....if (lo
23470 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 63  ck_mutex) {....c
23480 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23490 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
234a0 6b 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  k);...}....retur
234b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
234c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
234d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
234e0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
234f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23500 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23510 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23520 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
23530 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
23540 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
23550 44 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f  D);....if (lock_
23560 6d 75 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b  mutex) {....cack
23570 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23580 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23590 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43  ...}....return(C
235a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
235b0 29 3b 0a 09 7d 0a 0a 09 70 69 6e 63 6d 64 20 3d  );..}...pincmd =
235c0 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
235d0 61 6e 64 3b 0a 09 69 66 20 28 70 69 6e 63 6d 64  and;..if (pincmd
235e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
235f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23600 46 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  F("CACKEY_PIN_CO
23610 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20 70 69 6e  MMAND = %s", pin
23620 63 6d 64 29 3b 0a 0a 09 09 69 66 20 28 70 50 69  cmd);....if (pPi
23630 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  n != NULL) {....
23640 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23650 4e 54 46 28 22 50 72 6f 74 65 63 74 65 64 20 61  NTF("Protected a
23660 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 70 61  uthentication pa
23670 74 68 20 69 6e 20 65 66 66 65 63 74 20 61 6e 64  th in effect and
23680 20 50 49 4e 20 70 72 6f 76 69 64 65 64 20 21 3f   PIN provided !?
23690 22 29 3b 0a 09 09 7d 0a 0a 09 09 70 69 6e 66 64  ");...}....pinfd
236a0 20 3d 20 70 6f 70 65 6e 28 70 69 6e 63 6d 64 2c   = popen(pincmd,
236b0 20 22 72 22 29 3b 0a 09 09 69 66 20 28 70 69 6e   "r");...if (pin
236c0 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
236d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
236e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73  INTF("Error.  %s
236f0 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22  : Unable to run"
23700 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 69  , pincmd);.....i
23710 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
23720 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
23730 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23740 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a  biglock);....}..
23750 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23760 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23770 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
23780 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29  ECT (%i)", (int)
23790 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
237a0 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  CT);.....return(
237b0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
237c0 54 29 3b 0a 09 09 7d 0a 0a 09 09 66 67 65 74 73  T);...}....fgets
237d0 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 69 6e  _ret = fgets(pin
237e0 62 75 66 2c 20 73 69 7a 65 6f 66 28 70 69 6e 62  buf, sizeof(pinb
237f0 75 66 29 2c 20 70 69 6e 66 64 29 3b 0a 09 09 69  uf), pinfd);...i
23800 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d 20  f (fgets_ret == 
23810 4e 55 4c 4c 29 20 7b 0a 09 09 09 70 69 6e 62 75  NULL) {....pinbu
23820 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d  f[0] = '\0';...}
23830 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20 3d  ....pclose_ret =
23840 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b 0a   pclose(pinfd);.
23850 09 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65 74  ..if (pclose_ret
23860 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
23870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23880 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65 78 69  "Error.  %s: exi
23890 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72  ted with non-zer
238a0 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69 22 2c  o status of %i",
238b0 20 70 69 6e 63 6d 64 2c 20 70 63 6c 6f 73 65 5f   pincmd, pclose_
238c0 72 65 74 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f  ret);.....if (lo
238d0 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09  ck_mutex) {.....
238e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
238f0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23900 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  ck);....}.....CA
23910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23920 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23930 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28  _PIN_INCORRECT (
23940 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
23950 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
23960 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
23970 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
23980 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6c 65 6e  .}....if (strlen
23990 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b 0a  (pinbuf) < 1) {.
239a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
239b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
239c0 25 73 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f 20  %s: returned no 
239d0 64 61 74 61 22 2c 20 70 69 6e 63 6d 64 29 3b 0a  data", pincmd);.
239e0 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
239f0 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ex) {.....cackey
23a00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23a20 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
23a30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23a40 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
23a50 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
23a60 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
23a70 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
23a80 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
23a90 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
23aa0 69 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65  if (pinbuf[strle
23ab0 6e 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d  n(pinbuf) - 1] =
23ac0 3d 20 27 5c 6e 27 29 20 7b 0a 09 09 09 70 69 6e  = '\n') {....pin
23ad0 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75  buf[strlen(pinbu
23ae0 66 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a  f) - 1] = '\0';.
23af0 09 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20 28 43  ..}....pPin = (C
23b00 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20  K_UTF8CHAR_PTR) 
23b10 70 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69 6e 4c  pinbuf;...ulPinL
23b20 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69 6e 62  en = strlen(pinb
23b30 75 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f  uf);..}...login_
23b40 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67  ret = cackey_log
23b50 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  in(&cackey_slots
23b60 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20  [slotID], pPin, 
23b70 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73  ulPinLen, &tries
23b80 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66  _remaining);..if
23b90 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43   (login_ret != C
23ba0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
23bb0 20 7b 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75   {...if (lock_mu
23bc0 74 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  tex) {....cackey
23bd0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23be0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23bf0 09 7d 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f  .}....if (login_
23c00 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
23c10 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09  SC_E_LOCKED) {..
23c20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23c30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54  RINTF("Error.  T
23c40 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22  oken is locked."
23c50 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
23c60 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
23c70 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
23c80 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a  SER_PIN_LOCKED;.
23c90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23ca0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23cb0 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  ng CKR_PIN_LOCKE
23cc0 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43  D (%i)", (int) C
23cd0 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a  KR_PIN_LOCKED);.
23ce0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
23cf0 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20  IN_LOCKED);...} 
23d00 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72  else if (login_r
23d10 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
23d20 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09  C_E_BADPIN) {...
23d30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23d40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e  INTF("Error.  In
23d50 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09  valid PIN.");...
23d60 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
23d70 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
23d80 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
23d90 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09  IN_COUNT_LOW;...
23da0 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61  ..if (tries_rema
23db0 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09  ining == 1) {...
23dc0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
23dd0 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
23de0 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
23df0 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09  IN_FINAL_TRY;...
23e00 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
23e10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23e20 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e  rning CKR_PIN_IN
23e30 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20 28  CORRECT (%i)", (
23e40 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43  int) CKR_PIN_INC
23e50 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 74  ORRECT);.....ret
23e60 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
23e70 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43  RRECT);...}....C
23e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23e90 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e  TF("Error.  Unkn
23ea0 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e  own error return
23eb0 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c  ed from cackey_l
23ec0 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f  ogin() (%i)", lo
23ed0 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  gin_ret);....ret
23ee0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23ef0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63  ERROR);..}...cac
23f00 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
23f10 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d  ].token_flags &=
23f20 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   ~(CKF_USER_PIN_
23f30 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45  LOCKED | CKF_USE
23f40 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20  R_PIN_COUNT_LOW 
23f50 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  | CKF_LOGIN_REQU
23f60 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  IRED | CKF_USER_
23f70 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a  PIN_FINAL_TRY);.
23f80 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
23f90 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
23fa0 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f  e = CKS_RO_USER_
23fb0 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 69 66 20  FUNCTIONS;...if 
23fc0 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09  (lock_mutex) {..
23fd0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23fe0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23ff0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24000 63 6b 29 3b 0a 09 09 69 66 20 28 6d 75 74 65 78  ck);...if (mutex
24010 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
24020 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24040 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
24050 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
24060 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
24070 52 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  R);...}..}...CAC
24080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24090 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
240a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
240b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
240c0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
240d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
240e0 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45  , C_Login)(CK_SE
240f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24100 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54  ssion, CK_USER_T
24110 59 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b  YPE userType, CK
24120 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
24130 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
24140 69 6e 4c 65 6e 29 20 7b 0a 09 72 65 74 75 72 6e  inLen) {..return
24150 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72  (_C_LoginMutexAr
24160 67 28 68 53 65 73 73 69 6f 6e 2c 20 75 73 65 72  g(hSession, user
24170 54 79 70 65 2c 20 70 50 69 6e 2c 20 75 6c 50 69  Type, pPin, ulPi
24180 6e 4c 65 6e 2c 20 31 29 29 3b 0a 7d 0a 0a 43 4b  nLen, 1));.}..CK
24190 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
241a0 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74  (CK_RV, C_Logout
241b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
241c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
241d0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
241e0 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ID;..int mutex_r
241f0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
24200 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24210 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24220 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24230 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24250 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24260 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24270 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24280 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24290 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
242a0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
242b0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
242c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
242d0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
242e0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
242f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24300 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24310 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
24320 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
24330 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24340 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24350 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
24360 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
24370 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
24380 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
24390 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
243a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
243b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
243c0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
243d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
243e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
243f0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
24400 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24410 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
24420 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
24430 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24440 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
24450 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24460 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
24470 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
24480 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24490 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
244a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c  NVALID);..}...sl
244b0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
244c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
244d0 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
244e0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
244f0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
24500 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
24510 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
24520 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
24530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24540 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
24550 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
24560 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
24570 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
24580 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
24590 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
245a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
245b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
245c0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
245d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
245e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
245f0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
24600 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
24610 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
24620 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
24630 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
24640 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24650 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
24660 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24670 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24690 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20  hSession].state 
246a0 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
246b0 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66 20 28 63  SESSION;...if (c
246c0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
246d0 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  d == NULL) {...c
246e0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
246f0 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
24700 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
24710 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  IRED;..} else {.
24720 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
24730 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
24740 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  gs = 0;..}...mut
24750 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
24760 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24770 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24780 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
24790 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
247a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
247b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
247c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
247d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
247e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
247f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24800 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24810 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
24820 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
24830 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
24840 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
24850 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f  CK_RV, C_CreateO
24860 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
24870 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24880 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
24890 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
248a0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
248b0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
248c0 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20  E_PTR phObject) 
248d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
248e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
248f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24900 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24910 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24920 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24930 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24940 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24950 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24960 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24980 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24990 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
249a0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
249b0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
249c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
249d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
249e0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
249f0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
24a00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24a10 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28  , C_CopyObject)(
24a20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
24a30 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
24a40 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
24a50 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
24a60 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
24a70 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
24a80 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
24a90 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62  NDLE_PTR phNewOb
24aa0 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
24ab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24ac0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24ad0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24ae0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24af0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24b00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24b10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24b20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24b30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24b40 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24b50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24b60 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
24b70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24b80 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
24b90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24ba0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
24bb0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24bc0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
24bd0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24be0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f  (CK_RV, C_Destro
24bf0 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
24c00 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
24c10 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
24c20 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b  ANDLE hObject) {
24c30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24c40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24c50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24c60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24c90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24ca0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24cb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24cc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ce0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24cf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24d00 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24d10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24d20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24d30 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
24d40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24d50 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24d60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24d70 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
24d80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24d90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24da0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
24db0 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
24dc0 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a  _PTR pulSize) {.
24dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24de0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
24df0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
24e00 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
24e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24e20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
24e30 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
24e40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24e50 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24e60 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
24e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24e80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
24e90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24ea0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
24eb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24ec0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
24ed0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
24ee0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24ef0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
24f00 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
24f10 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
24f20 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
24f30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24f40 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
24f50 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
24f60 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
24f70 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
24f80 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  ulCount) {..CK_A
24f90 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
24fa0 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ttr;..struct cac
24fb0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
24fc0 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65  entity;..unsigne
24fd0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
24fe0 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73  idx, attr_idx, s
24ff0 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75  ess_attr_idx, nu
25000 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65  m_ids;..int mute
25010 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  x_retval;..CK_RV
25020 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b   retval = CKR_OK
25030 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
25040 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
25050 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43   ulValueLen;...C
25060 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25070 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
25080 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
25090 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
250a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
250b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
250c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
250d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
250e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
250f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
25100 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
25110 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
25120 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25130 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
25140 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25150 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25170 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
25180 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
25190 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
251a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
251b0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
251c0 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20   (hObject == 0) 
251d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
251e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
251f0 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
25200 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
25210 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25220 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
25230 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
25240 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  (ulCount == 0) {
25250 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
25260 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
25270 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
25280 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
25290 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
252a0 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  y */...CACKEY_DE
252b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
252c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
252d0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
252e0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
252f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
25300 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61  .}...if (pTempla
25310 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
25320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65  NTF("Error.  pTe
25340 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22  mplate is NULL."
25350 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25360 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
25370 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69  ..}...identity_i
25380 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31  dx = hObject - 1
25390 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
253a0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
253b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
253c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
253d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
253e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
253f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
25400 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
25410 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25420 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25430 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
25440 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25450 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
25460 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25480 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
254a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
254b0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
254c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
254d0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
254e0 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64  ID);..}...num_id
254f0 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
25500 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
25510 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
25520 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69  ..if (identity_i
25530 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b  dx >= num_ids) {
25540 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
25550 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
25560 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
25570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25580 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
25590 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
255a0 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64  ge.  identity_id
255b0 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73  x = %lu, num_ids
255c0 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67   = %lu.", (unsig
255d0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
255e0 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ty_idx, (unsigne
255f0 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29  d long) num_ids)
25600 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25610 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
25620 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  VALID);..}...ide
25630 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
25640 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25650 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64  n].identities[id
25660 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66  entity_idx];...f
25670 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
25680 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43  ; attr_idx < ulC
25690 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
256a0 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20  ) {...curr_attr 
256b0 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74  = &pTemplate[att
256c0 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75  r_idx];....pValu
256d0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61  e = NULL;...ulVa
256e0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
256f0 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59  G) -1;....CACKEY
25700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c  _DEBUG_PRINTF("L
25710 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ooking for attri
25720 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64  bute 0x%08lx (id
25730 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22  entity:%lu) ..."
25740 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25750 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
25760 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
25770 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29  g) identity_idx)
25780 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61  ;....for (sess_a
25790 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
257a0 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  s_attr_idx < ide
257b0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
257c0 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
257d0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69  tr_idx++) {....i
257e0 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  f (identity->att
257f0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
25800 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63  r_idx].type == c
25810 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20  urr_attr->type) 
25820 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
25830 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
25840 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65  found it, pValue
25850 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65   = %p, ulValueLe
25860 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69  n = %lu", identi
25870 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
25880 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
25890 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  alue, identity->
258a0 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
258b0 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
258c0 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09  eLen);..........
258d0 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74  pValue = identit
258e0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
258f0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
25900 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lue;.....ulValue
25910 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  Len = identity->
25920 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
25930 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
25940 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  eLen;....}...}..
25950 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
25960 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75  >pValue && pValu
25970 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72  e) {....if (curr
25980 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
25990 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29  n >= ulValueLen)
259a0 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75   {.....memcpy(cu
259b0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
259c0 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65   pValue, ulValue
259d0 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  Len);....} else 
259e0 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  {.....ulValueLen
259f0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
25a00 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
25a10 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
25a20 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ALL;....}...}...
25a30 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  .curr_attr->ulVa
25a40 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
25a50 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  Len;..}...mutex_
25a60 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
25a70 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
25a80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
25a90 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
25aa0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
25ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25ac0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
25ad0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25ae0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25af0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
25b00 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
25b10 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
25b20 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43  INVALID) {...CAC
25b30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25b40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25b50 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
25b60 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69  NVALID (%i)", (i
25b70 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
25b80 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
25b90 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
25ba0 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43  O_SMALL) {...CAC
25bb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25bc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25bd0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
25be0 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
25bf0 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
25c00 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
25c10 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
25c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
25c30 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
25c40 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
25c50 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  al);..} else {..
25c60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25c70 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25c80 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
25c90 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  l);..}...return(
25ca0 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
25cb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
25cc0 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69  K_RV, C_SetAttri
25cd0 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
25ce0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25cf0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
25d00 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
25d10 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
25d20 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
25d30 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
25d40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25d50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25d60 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25d70 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25d80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25d90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25da0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25db0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25dc0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25dd0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25de0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25df0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
25e00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
25e10 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
25e20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25e30 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
25e40 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
25e50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
25e60 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
25e70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
25e80 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
25e90 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
25ea0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25eb0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
25ec0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
25ed0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
25ee0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
25ef0 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ID;..CK_ULONG id
25f00 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
25f10 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
25f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
25f30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
25f40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
25f50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
25f60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25f70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
25f80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
25f90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
25fa0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
25fb0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
25fc0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
25fd0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
25fe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
25ff0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
26000 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
26010 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26020 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26030 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
26040 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
26050 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26060 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26070 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
26080 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26090 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
260a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
260b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
260c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
260d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
260e0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
260f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26100 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26110 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
26120 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26130 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
26140 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26150 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26160 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
26170 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26180 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26190 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
261a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
261b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
261c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
261d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
261e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
261f0 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
26200 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26210 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26220 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
26230 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26240 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61 64  .  Search alread
26250 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  y active.");....
26260 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
26270 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
26280 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
26290 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
262a0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
262b0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
262c0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
262d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
262e0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
262f0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
26300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26320 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
26330 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
26340 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
26350 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
26360 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26370 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26380 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
26390 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
263a0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
263b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
263c0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
263d0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
263e0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
263f0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
26400 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
26410 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
26420 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
26430 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
26440 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
26450 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
26460 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
26470 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
26480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26490 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61  NTF("The slot ha
264a0 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e  s been reset sin
264b0 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65  ce we last looke
264c0 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73  d for identities
264d0 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29   -- rescanning")
264e0 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
264f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26500 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d  n].identities !=
26510 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b   NULL) {....cack
26520 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
26530 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  es(cackey_sessio
26540 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26550 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f  ntities, cackey_
26560 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26570 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
26580 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  unt);.....cackey
26590 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
265a0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
265b0 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
265c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
265d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
265e0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  ount = 0;...}...
265f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
26600 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
26610 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72  != NULL) {....fr
26620 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
26630 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a  slotID].label);.
26640 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
26650 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
26660 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
26670 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
26680 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  set(&cackey_slot
26690 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61  s[slotID]);...ca
266a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
266b0 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
266c0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
266d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
266e0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
266f0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
26700 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26710 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
26720 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
26730 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
26740 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
26750 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
26760 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26770 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
26780 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
26790 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate != NULL) {..
267a0 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
267b0 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  0) {....cackey_s
267c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
267d0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
267e0 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a  ount = ulCount;.
267f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26800 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26810 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c  rch_query = mall
26820 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  oc(ulCount * siz
26830 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
26840 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ;.....memcpy(cac
26850 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26860 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26870 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20  ery, pTemplate, 
26880 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
26890 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09  (*pTemplate));..
268a0 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
268b0 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69  idx < ulCount; i
268c0 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
268d0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
268e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20  lValueLen == 0) 
268f0 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  {......cackey_se
26900 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26910 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
26920 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  x].pValue = NULL
26930 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
26940 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
26950 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26960 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26970 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
26980 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61  = malloc(pTempla
26990 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
269a0 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61  en);......if (ca
269b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
269c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
269d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
269e0 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
269f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26a00 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26a10 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
26a20 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
26a30 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
26a40 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
26a50 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09  eLen);.....}....
26a60 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
26a70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26a80 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26a90 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
26aa0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26ab0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26ac0 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
26ad0 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
26ae0 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
26af0 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
26b00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
26b10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
26b20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26b30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26b40 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
26b50 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
26b60 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
26b70 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
26b80 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
26b90 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
26ba0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26bb0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
26bc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26bd0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
26be0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
26bf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26c00 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
26c10 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
26c20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26c30 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26c40 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
26c50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26c60 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
26c70 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
26c80 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
26c90 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26ca0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26cb0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
26cc0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
26cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26ce0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
26cf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26d00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26d10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26d20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26d30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26d40 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
26d50 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
26d60 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(CKR_OK);.}..st
26d70 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
26d80 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
26d90 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54  ttributes(CK_ATT
26da0 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54  RIBUTE *a, CK_AT
26db0 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75  TRIBUTE *b) {..u
26dc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d  nsigned char *sm
26dd0 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75  allbuf, *largebu
26de0 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c  f;..size_t small
26df0 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75  buf_len, largebu
26e00 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e  f_len;...if (a->
26e10 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29  type != b->type)
26e20 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
26e30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26e40 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e  G_PRINTF("    ..
26e50 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67  . found matching
26e60 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43   type ...");...C
26e70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26e80 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
26e90 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56  r value:", a->pV
26ea0 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65  alue, a->ulValue
26eb0 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70  Len);...if (b->p
26ec0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
26ed0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26ee0 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
26ef0 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
26f00 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  d match");....re
26f10 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
26f20 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (a->pValue == N
26f30 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
26f40 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d  0);..}.. .if (b-
26f50 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61  >ulValueLen == a
26f60 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20  ->ulValueLen && 
26f70 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65  memcmp(a->pValue
26f80 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  , b->pValue, b->
26f90 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30  ulValueLen) == 0
26fa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26fb0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
26fc0 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
26fd0 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  t match");....re
26fe0 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77  turn(1);..}...sw
26ff0 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b  itch (a->type) {
27000 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
27010 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75  LUS:....if (a->u
27020 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e  lValueLen == b->
27030 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
27040 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
27050 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
27060 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65  Len > b->ulValue
27070 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  Len) {.....small
27080 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
27090 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
270a0 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
270b0 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
270c0 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
270d0 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
270e0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
270f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
27100 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56  smallbuf = a->pV
27110 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62  alue;.....smallb
27120 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
27130 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72  lueLen;......lar
27140 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  gebuf = b->pValu
27150 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f  e;.....largebuf_
27160 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
27170 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f  Len;....}.....fo
27180 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65  r (; largebuf_le
27190 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
271a0 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61  n; largebuf++,la
271b0 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a  rgebuf_len--) {.
271c0 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66  ....if (largebuf
271d0 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  [0] != 0) {.....
271e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
271f0 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65  .}.....if (large
27200 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
27210 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62  buf_len) {.....b
27220 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
27230 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62  f (memcmp(largeb
27240 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d  uf, smallbuf, sm
27250 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30  allbuf_len) == 0
27260 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
27270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
27280 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70      ... found ap
27290 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22  proximate match"
272a0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31  );......return(1
272b0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  );....}.....brea
272c0 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  k;..}...return(0
272d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
272e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
272f0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
27300 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27310 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
27320 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
27330 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
27340 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
27350 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
27360 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
27370 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
27380 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
27390 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
273a0 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
273b0 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
273c0 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
273d0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
273e0 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
273f0 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
27400 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
27410 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
27420 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
27430 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43 41 43  tval;.#ifdef CAC
27440 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
27450 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74 72 75  _SPEEDTEST..stru
27460 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61 72 74  ct timeval start
27470 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f 74  , end;..uint64_t
27480 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64 5f   start_int, end_
27490 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  int;.#endif...CA
274a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
274b0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
274c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
274d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
274e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
274f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27500 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27510 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27520 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27530 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
27540 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
27550 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
27560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27570 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65  "Error.  pulObje
27580 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ctCount is NULL.
27590 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
275a0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
275b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
275c0 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  ect == NULL && u
275d0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
275e0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
275f0 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
27600 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
27610 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
27620 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
27630 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70  ediately */...*p
27640 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20  ulObjectCount = 
27650 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  0;....CACKEY_DEB
27660 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27670 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
27680 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
27690 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
276a0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
276b0 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74  }...if (phObject
276c0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
276d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
276e0 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a  F("Error.  phObj
276f0 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ect is NULL.");.
27700 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
27710 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
27720 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65  ...if (ulMaxObje
27730 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
27740 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27750 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
27760 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
27770 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 69   objects specifi
27780 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a  ed as zero.");..
27790 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
277a0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
277b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
277c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
277d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
277e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
277f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27800 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
27810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27820 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27830 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
27840 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27850 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27860 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27870 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27880 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
27890 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
278a0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
278b0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
278c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
278d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
278e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
278f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27900 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27910 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
27920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27930 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
27940 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27950 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27960 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27970 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27980 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27990 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
279a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
279b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
279c0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
279d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
279e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
279f0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
27a00 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27a10 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27a20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27a30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27a40 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
27a50 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27a60 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
27a70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27a80 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
27a90 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
27aa0 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 74  _SPEEDTEST..gett
27ab0 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72 74 2c  imeofday(&start,
27ac0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a   NULL);.#endif..
27ad0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
27ae0 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
27af0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
27b00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27b10 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
27b20 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
27b30 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
27b40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
27b50 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
27b60 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
27b70 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
27b80 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
27b90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27ba0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
27bb0 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
27bc0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
27bd0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
27be0 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
27bf0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
27c00 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
27c10 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
27c20 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
27c30 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
27c40 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
27c50 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
27c60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
27c70 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
27c80 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
27c90 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
27ca0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
27cb0 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
27cc0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
27cd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27ce0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
27cf0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
27d00 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
27d10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
27d20 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
27d30 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38 6c  ibute %s (0x%08l
27d40 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25  x) in identity:%
27d50 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  i...", CACKEY_DE
27d60 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
27d70 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61  TE_TO_STR(curr_a
27d80 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73  ttr->type), (uns
27d90 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
27da0 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e  _attr->type, (in
27db0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
27dc0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27dd0 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56  _PRINTBUF("    V
27de0 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  alue looking for
27df0 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70  :", curr_attr->p
27e00 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
27e10 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
27e20 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
27e30 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
27e40 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f  attr_idx < curr_
27e50 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  id->attributes_c
27e60 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
27e70 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
27e80 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63  (cackey_pkcs11_c
27e90 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
27ea0 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  s(&curr_id->attr
27eb0 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
27ec0 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72  _idx], curr_attr
27ed0 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65  )) {......matche
27ee0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
27ef0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
27f00 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
27f10 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
27f20 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
27f30 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
27f40 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
27f50 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
27f60 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
27f70 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
27f80 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
27f90 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
27fa0 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
27fb0 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
27fc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27fd0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
27fe0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
27ff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28000 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
28010 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
28020 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
28030 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
28040 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
28050 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
28060 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28070 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
28080 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
28090 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
280a0 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
280b0 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
280c0 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
280d0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
280e0 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
280f0 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
28100 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
28110 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
28120 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
28130 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
28140 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
28150 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
28160 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
28170 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
28180 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28190 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
281a0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
281b0 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
281c0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
281d0 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
281e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
281f0 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
28200 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
28210 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
28220 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
28230 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43 41 43  idx;..#ifdef CAC
28240 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
28250 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 74  _SPEEDTEST..gett
28260 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c 20 4e  imeofday(&end, N
28270 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e 74  ULL);..start_int
28280 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73 65 63   = (start.tv_sec
28290 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 73 74   * 1000000) + st
282a0 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65 6e  art.tv_usec;..en
282b0 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76 5f  d_int = (end.tv_
282c0 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b  sec * 1000000) +
282d0 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09 66   end.tv_usec;..f
282e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
282f0 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75 20  Search took %lu 
28300 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c  microseconds\n",
28310 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28320 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61 72   (end_int - star
28330 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a  t_int));.#endif.
28340 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
28350 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
28360 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28370 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
28380 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
28390 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
283a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
283b0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
283c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
283d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
283e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
283f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
28400 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
28410 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d  ), num objects =
28420 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a   %lu", CKR_OK, *
28430 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b  pulObjectCount);
28440 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
28450 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
28460 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
28470 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
28480 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
28490 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
284a0 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  {..CK_ULONG idx;
284b0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
284c0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
284d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
284e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
284f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28500 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28510 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28520 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28530 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28540 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28550 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28560 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
28570 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
28580 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
28590 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
285a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
285b0 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
285c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
285d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
285e0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
285f0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
28600 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28610 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28620 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
28630 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28640 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
28650 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
28660 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
28670 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28680 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28690 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
286a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
286b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
286c0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
286d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
286e0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
286f0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28700 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28710 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
28720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28730 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
28740 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
28750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
28760 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
28770 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
28780 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28790 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
287a0 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
287b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
287c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
287d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
287e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
287f0 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
28800 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
28810 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
28820 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
28830 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
28840 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28850 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
28860 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78   = 0;...for (idx
28870 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63 6b   = 0; idx < cack
28880 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28890 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
288a0 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29  ry_count; idx++)
288b0 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
288c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
288d0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
288e0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
288f0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
28900 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28910 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
28920 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a  x].pValue);...}.
28930 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
28940 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28950 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29  n].search_query)
28960 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
28970 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28980 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
28990 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
289a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
289b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
289c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
289d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
289e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
289f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28a00 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
28a10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
28a20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28a30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
28a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28a50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
28a60 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
28a70 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28a80 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
28a90 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28aa0 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29  , C_EncryptInit)
28ab0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
28ac0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
28ad0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
28ae0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
28af0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
28b00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
28b10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28b20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28b30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28b40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28b50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28b60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28b70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28b80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
28b90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28ba0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28bb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28bc0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
28bd0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
28be0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
28bf0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
28c00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
28c10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28c20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
28c30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28c40 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b  V, C_Encrypt)(CK
28c50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28c60 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
28c70 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
28c80 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
28c90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
28ca0 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
28cb0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
28cc0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b  ryptedDataLen) {
28cd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28ce0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
28cf0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
28d00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
28d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28d20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
28d30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
28d40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28d50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
28d60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
28d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28d80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28d90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28da0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
28db0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
28dc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
28dd0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
28de0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
28df0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
28e00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
28e10 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
28e20 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28e30 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28e40 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
28e50 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
28e60 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
28e70 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
28e80 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
28e90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
28ea0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
28eb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28ec0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28ed0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28ee0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28ef0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28f00 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28f10 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28f20 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
28f30 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28f40 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
28f50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
28f60 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
28f70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
28f80 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
28f90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
28fa0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
28fb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28fc0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
28fd0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28fe0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69  _RV, C_EncryptFi
28ff0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
29000 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29010 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
29020 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c  stEncryptedPart,
29030 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
29040 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  lLastEncryptedPa
29050 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
29060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29070 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29080 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29090 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
290a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
290b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
290c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
290d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
290e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
290f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29110 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29120 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29130 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29140 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29150 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29160 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29170 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29180 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29190 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
291a0 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
291b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
291c0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
291d0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
291e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
291f0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
29200 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
29210 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
29220 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29230 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29240 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29250 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29270 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29280 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29290 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
292a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
292b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
292c0 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
292d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
292e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
292f0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
29300 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
29310 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29320 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
29330 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
29340 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
29350 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
29360 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29370 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
29380 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
29390 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
293a0 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
293b0 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
293c0 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
293d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
293e0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
293f0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
29400 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
29410 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
29420 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
29430 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29440 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29450 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
29460 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
29470 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29480 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29490 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
294a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
294b0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
294c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
294d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
294e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
294f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29500 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
29510 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29520 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29530 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
29540 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29550 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
29560 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
29570 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
29580 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
29590 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
295a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
295b0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
295c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
295d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
295e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
295f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
29600 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29610 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
29620 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29630 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29640 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
29650 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29660 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c  ror.  Decrypt al
29670 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
29680 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
29690 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
296a0 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
296b0 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
296c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
296d0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
296e0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
296f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29700 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29720 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
29730 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
29740 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
29750 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
29760 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
29770 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
29780 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
29790 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
297a0 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
297b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
297c0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
297d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
297e0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
297f0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
29800 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29810 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
29820 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
29830 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29840 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
29850 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
29860 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61  ->mechanism;..ca
29870 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29880 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
29890 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63  mech_parm = pMec
298a0 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74  hanism->pParamet
298b0 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  er;..cackey_sess
298c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
298d0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
298e0 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  len = pMechanism
298f0 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e  ->ulParameterLen
29900 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
29910 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29920 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20  rypt_identity = 
29930 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
29940 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
29950 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
29960 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
29970 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
29980 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29990 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
299a0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
299b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
299c0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
299d0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
299e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
299f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
29a00 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29a10 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29a20 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
29a30 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
29a40 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
29a50 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29a60 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
29a70 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
29a80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29a90 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
29aa0 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55  ryptedData, CK_U
29ab0 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
29ac0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
29ad0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
29ae0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
29af0 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  Len) {..CK_ULONG
29b00 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c   datalen_update,
29b10 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a   datalen_final;.
29b20 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72  .CK_RV decrypt_r
29b30 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
29b40 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
29b50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29b60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29b70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29b80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29b90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29ba0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29bb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29bc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29bd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29be0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61  ;..}...if (pulDa
29bf0 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  taLen == NULL) {
29c00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29c10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
29c20 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c  ulDataLen is NUL
29c30 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
29c40 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29c50 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e  D);..}...datalen
29c60 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61  _update = *pulDa
29c70 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74  taLen;...decrypt
29c80 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
29c90 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  Update(hSession,
29ca0 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
29cb0 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61   ulEncryptedData
29cc0 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74  Len, pData, &dat
29cd0 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69  alen_update);..i
29ce0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
29cf0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
29d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29d10 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
29d20 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72  ptUpdate() retur
29d30 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
29d40 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
29d50 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
29d60 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 64  t_ret);....if (d
29d70 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
29d80 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
29d90 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d  LL) {..../* Term
29da0 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f 6e  inate decryption
29db0 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09   operation */...
29dc0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29dd0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
29de0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29df0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
29e00 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29e10 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29e20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29e30 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
29e40 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
29e50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29e60 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
29e70 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
29e80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
29e90 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
29ea0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29eb0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29ec0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29ed0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29ee0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
29ef0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
29f00 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
29f10 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
29f20 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
29f30 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
29f40 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
29f50 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  pt_active) {....
29f60 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29f70 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29f80 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
29f90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29fa0 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
29fb0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
29fc0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29fd0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
29fe0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09  NITIALIZED);....
29ff0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
2a000 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a010 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
2a020 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   0;.....mutex_re
2a030 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2a040 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a050 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
2a060 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a070 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
2a080 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a090 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2a0a0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2a0b0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2a0c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
2a0d0 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
2a0e0 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
2a0f0 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b  }...if (pData) {
2a100 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61  ...pData += data
2a110 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09  len_update;..}..
2a120 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20  datalen_final = 
2a130 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61  *pulDataLen - da
2a140 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09  talen_update;...
2a150 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
2a160 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65  DecryptFinal(hSe
2a170 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64  ssion, pData, &d
2a180 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09  atalen_final);..
2a190 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
2a1a0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
2a1b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a1c0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
2a1d0 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72  yptFinal() retur
2a1e0 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
2a1f0 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
2a200 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
2a210 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  t_ret);....retur
2a220 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
2a230 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e  .}...*pulDataLen
2a240 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   = datalen_updat
2a250 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  e + datalen_fina
2a260 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2a270 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a280 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
2a290 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
2a2a0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
2a2b0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2a2c0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2a2d0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2a2e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2a2f0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2a300 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2a310 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
2a320 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
2a330 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2a340 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2a350 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73  pulPartLen) {..s
2a360 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75  tatic CK_BYTE bu
2a370 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65  f[16384];..ssize
2a380 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53  _t buflen;..CK_S
2a390 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
2a3a0 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
2a3b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2a3c0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2a3d0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2a3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a3f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a400 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a410 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a420 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a430 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a440 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a450 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a460 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a470 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2a480 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2a490 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2a4a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2a4b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2a4c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2a4d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a4e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2a4f0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2a500 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2a510 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2a520 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2a530 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
2a540 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
2a550 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50   && ulEncryptedP
2a560 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2a570 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
2a580 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
2a590 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74  d to decrypt not
2a5a0 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
2a5b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a5c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2a5d0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
2a5e0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
2a5f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a600 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
2a610 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
2a620 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2a630 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a640 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65  Error. pEncrypte
2a650 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  dPart is NULL, b
2a660 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  ut ulEncryptedPa
2a670 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
2a680 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a690 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2a6a0 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72  ..}...if (ulEncr
2a6b0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
2a6c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2a6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a6e0 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  r. ulEncryptedPa
2a6f0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
2a700 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
2a710 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2a720 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2a730 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2a740 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
2a750 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a760 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a770 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e   pulPartLen is N
2a780 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2a790 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2a7a0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
2a7b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2a7c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2a7d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a7e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a7f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a810 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2a820 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2a830 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2a840 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2a850 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2a860 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2a870 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2a880 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a890 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2a8a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a8b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a8c0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a8d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2a8e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2a8f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2a900 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2a910 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a920 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2a930 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2a940 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a950 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2a960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a970 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2a980 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2a990 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a9a0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2a9b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a9c0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
2a9d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a9e0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
2a9f0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
2aa00 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
2aa10 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
2aa20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2aa30 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
2aa40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2aa50 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2aa60 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2aa70 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
2aa80 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
2aa90 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
2aaa0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2aab0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
2aac0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
2aad0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
2aae0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2aaf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ab00 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
2ab10 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
2ab20 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
2ab30 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
2ab40 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
2ab50 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ab60 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ab70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2ab80 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2ab90 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
2aba0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2abb0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
2abc0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
2abd0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
2abe0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
2abf0 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62   decrypt */....b
2ac00 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
2ac10 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
2ac20 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2ac30 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2ac40 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2ac50 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45  ypt_identity, pE
2ac60 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c  ncryptedPart, ul
2ac70 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ac80 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
2ac90 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69  f), 0, 1);.....i
2aca0 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2acb0 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
2acc0 4f 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f 70  OGIN && cackey_p
2acd0 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55  in_command != NU
2ace0 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 5f 43  LL) {.....if (_C
2acf0 5f 4c 6f 67 69 6e 4d 75 74 65 78 41 72 67 28 68  _LoginMutexArg(h
2ad00 53 65 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45  Session, CKU_USE
2ad10 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 29 20 3d  R, NULL, 0, 0) =
2ad20 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
2ad30 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  .buflen = cackey
2ad40 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2ad50 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2ad60 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2ad70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2ad80 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
2ad90 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2ada0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2adb0 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
2adc0 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 09 09 09  buf), 0, 1);....
2add0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  .}....}.....if (
2ade0 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
2adf0 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20  ../* Decryption 
2ae00 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
2ae10 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
2ae20 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
2ae30 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
2ae40 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
2ae50 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
2ae60 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66  ..} else if (buf
2ae70 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2ae80 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
2ae90 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
2aea0 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
2aeb0 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
2aec0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
2aed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
2aee0 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55  led to send APDU
2aef0 2c 20 65 72 72 6f 72 20 3d 20 25 6c 69 22 2c 20  , error = %li", 
2af00 28 6c 6f 6e 67 20 69 6e 74 29 20 62 75 66 6c 65  (long int) bufle
2af10 6e 29 3b 0a 0a 09 09 09 09 09 72 65 74 76 61 6c  n);.......retval
2af20 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2af30 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2af40 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2af50 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65  gned long) bufle
2af60 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e  n) > *pulPartLen
2af70 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09   && pPart) {....
2af80 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64 61  ./* Decrypted da
2af90 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
2afa0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2afb0 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2afc0 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  L;....} else {..
2afd0 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a  ...if (pPart) {.
2afe0 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72  .....memcpy(pPar
2aff0 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  t, buf, buflen);
2b000 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
2b010 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e  PartLen = buflen
2b020 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
2b030 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09  CKR_OK;....}....
2b040 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74  .break;..}...mut
2b050 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2b060 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b070 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b080 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2b090 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2b0a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b0b0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2b0c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2b0d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2b0e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2b0f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b100 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2b110 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
2b120 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
2b130 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
2b140 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b150 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e  RV, C_DecryptFin
2b160 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
2b170 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2b180 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73  CK_BYTE_PTR pLas
2b190 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tPart, CK_ULONG_
2b1a0 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c  PTR pulLastPartL
2b1b0 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  en) {..int mutex
2b1c0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65  _retval;..int te
2b1d0 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20  rminate_decrypt 
2b1e0 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 1;...CACKEY_DE
2b1f0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b200 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b210 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b220 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b230 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b240 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b250 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b260 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b270 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b280 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2b290 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2b2a0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2b2b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2b2c0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2b2d0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2b2e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b2f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b300 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2b310 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2b320 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2b330 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b340 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73  ..}...if (pulLas
2b350 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  tPartLen == NULL
2b360 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b370 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b380 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  . pulLastPartLen
2b390 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2b3a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2b3b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2b3c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b3d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2b3e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b3f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2b400 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2b410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b420 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2b430 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2b440 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2b450 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2b460 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b470 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b480 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2b490 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b4a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b4b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b4c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b4d0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2b4e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2b4f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2b500 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b510 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2b520 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b530 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2b540 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2b550 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b560 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2b570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b580 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
2b590 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65  crypt not active
2b5a0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b5b0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2b5c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b5d0 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61  ..}...*pulLastPa
2b5e0 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20  rtLen = 0;...if 
2b5f0 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55  (pLastPart == NU
2b600 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74  LL) {...terminat
2b610 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09  e_decrypt = 0;..
2b620 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74  }...if (terminat
2b630 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63  e_decrypt) {...c
2b640 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b650 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
2b660 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2b670 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2b680 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2b690 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b6a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2b6b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2b6c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b6d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2b6e0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2b6f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b700 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2b710 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2b720 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b730 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2b740 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2b750 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2b760 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b770 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2b780 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  gestInit)(CK_SES
2b790 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b7a0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2b7b0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2b7c0 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  m) {..CACKEY_DEB
2b7d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2b7e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2b7f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
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 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2b830 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b840 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2b850 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b860 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2b870 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2b880 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2b890 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2b8a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2b8b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2b8c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2b8d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b8e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2b8f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2b900 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43  _RV, C_Digest)(C
2b910 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2b920 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2b930 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2b940 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2b950 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2b960 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  igest, CK_ULONG_
2b970 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e  PTR pulDigestLen
2b980 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2b990 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2b9a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2b9b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2b9c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b9d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b9e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2b9f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ba00 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ba10 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ba20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ba30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ba40 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ba50 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ba60 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ba70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ba80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ba90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2baa0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2bab0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2bac0 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61  RV, C_DigestUpda
2bad0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2bae0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2baf0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2bb00 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2bb10 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2bb20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2bb30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2bb40 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2bb50 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2bb60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bb70 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2bb80 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2bb90 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2bba0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2bbb0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2bbc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2bbd0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2bbe0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2bbf0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2bc00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2bc10 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2bc20 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bc30 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2bc40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2bc50 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
2bc60 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tKey)(CK_SESSION
2bc70 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2bc80 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2bc90 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2bca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bcb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2bcc0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2bcd0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2bce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bcf0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2bd00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2bd10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2bd20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2bd30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2bd40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2bd50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2bd60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2bd70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2bd80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2bd90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2bda0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2bdb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2bdc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2bdd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2bde0 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  estFinal)(CK_SES
2bdf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2be00 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2be10 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
2be20 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
2be30 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2be40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2be50 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2be60 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2be70 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2be80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2be90 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2bea0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2beb0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2bec0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2bed0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2bee0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2bef0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2bf00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bf10 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2bf20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2bf30 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2bf40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bf50 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2bf60 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bf70 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e  (CK_RV, C_SignIn
2bf80 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2bf90 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2bfa0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2bfb0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2bfc0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2bfd0 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  ey) {..int mutex
2bfe0 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d  _retval;...hKey-
2bff0 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  -;...CACKEY_DEBU
2c000 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2c010 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2c020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2c030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c050 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2c060 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c070 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2c080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2c090 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
2c0a0 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  m == NULL) {...C
2c0b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c0c0 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2c0d0 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29  anism is NULL.")
2c0e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c0f0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2c100 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
2c110 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21  ism->mechanism !
2c120 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20  = CKM_RSA_PKCS) 
2c130 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c140 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c150 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
2c160 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66  anism not specif
2c170 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50  ied as CKM_RSA_P
2c180 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  KCS");....return
2c190 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  (CKR_MECHANISM_P
2c1a0 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  ARAM_INVALID);..
2c1b0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2c1c0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2c1d0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2c1e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2c1f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c200 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2c210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2c230 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2c240 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2c250 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2c260 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2c270 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2c280 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2c290 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2c2a0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2c2b0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2c2c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c2d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c2e0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2c2f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c300 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2c310 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2c320 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c330 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2c340 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2c350 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c360 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2c370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c380 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2c390 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2c3a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2c3b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2c3c0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
2c3d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c3e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2c3f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2c400 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2c410 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2c420 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c430 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2c440 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70  ign already in p
2c450 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09  rogress.");.....
2c460 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2c470 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09  ATION_ACTIVE);..
2c480 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20  }...if (hKey >= 
2c490 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c4a0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2c4b0 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ties_count) {...
2c4c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2c4d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2c4e0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2c4f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c500 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20  or.  Key handle 
2c510 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65  out of range (re
2c520 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c  quested key %lu,
2c530 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69   only %lu identi
2c540 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e  ties available).
2c550 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2c560 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e  g) hKey, (unsign
2c570 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f  ed long) cackey_
2c580 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c590 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
2c5a0 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  unt);....return(
2c5b0 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49  CKR_KEY_HANDLE_I
2c5c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61  NVALID);..}...ca
2c5d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c5e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2c5f0 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
2c600 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c610 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
2c620 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
2c630 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63  ->mechanism;...c
2c640 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c650 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c660 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63  flen = 128;..cac
2c670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c680 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2c690 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  sed = 0;..cackey
2c6a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c6b0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 6d  on].sign_buf = m
2c6c0 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61  alloc(sizeof(*ca
2c6d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c6e0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c6f0 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
2c700 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c710 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41  gn_buflen);...CA
2c720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c730 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73  F("Session %lu s
2c740 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20  ign_identity is 
2c750 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c  %p (identity #%l
2c760 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
2c770 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 28  ong) hSession, (
2c780 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79 5f  void *) &cackey_
2c790 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c7a0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
2c7b0 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ey], (unsigned l
2c7c0 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63  ong) hKey);..cac
2c7d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c7e0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
2c7f0 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
2c800 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c810 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
2c820 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
2c830 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2c840 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c850 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2c860 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2c870 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c880 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c890 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2c8a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2c8b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2c8c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2c8d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c8e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2c8f0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2c900 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2c910 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c920 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c930 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49  C_Sign)(CK_SESSI
2c940 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2c950 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2c960 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2c970 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2c980 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2c990 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
2c9a0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
2c9b0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
2c9c0 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  g start_sign_buf
2c9d0 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67  used;..CK_RV sig
2c9e0 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  n_ret;..int mute
2c9f0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2ca00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ca10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2ca20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2ca30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2ca40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ca50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2ca60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2ca70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2ca80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2ca90 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
2caa0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
2cab0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
2cac0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2cad0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
2cae0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
2caf0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2cb00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cb10 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
2cb20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
2cb30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2cb40 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2cb50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74  LID);..}...start
2cb60 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20  _sign_bufused = 
2cb70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cb80 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2cb90 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72  ufused;...sign_r
2cba0 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74  et = C_SignUpdat
2cbb0 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74  e(hSession, pDat
2cbc0 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09  a, ulDataLen);..
2cbd0 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
2cbe0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
2cbf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cc00 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64  "Error.  SignUpd
2cc10 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
2cc20 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2cc30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2cc40 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
2cc50 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
2cc60 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  != CKR_BUFFER_TO
2cc70 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75  O_SMALL) {....mu
2cc80 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2cc90 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
2cca0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ccb0 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2ccc0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2ccd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cce0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2ccf0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2cd00 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2cd10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2cd20 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
2cd30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cd40 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2cd50 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
2cd60 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2cd70 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
2cd80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cd90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2cda0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2cdb0 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72  ");........retur
2cdc0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2cdd0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2cde0 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2cdf0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ce00 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
2ce10 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
2ce20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2ce30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2ce40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ce50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ce60 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
2ce70 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
2ce80 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2ce90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2cea0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
2ceb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2cec0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
2ced0 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
2cee0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2cef0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2cf00 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2cf10 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2cf20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2cf30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cf40 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2cf50 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2cf60 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2cf70 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2cf80 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
2cf90 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
2cfa0 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43  }...sign_ret = C
2cfb0 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73  _SignFinal(hSess
2cfc0 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c  ion, pSignature,
2cfd0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2cfe0 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
2cff0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
2d000 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20  if (sign_ret == 
2d010 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2d020 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  MALL) {....CACKE
2d030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d040 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
2d050 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f  rned CKR_BUFFER_
2d060 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20  TOO_SMALL (rv = 
2d070 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f  %lu), undoing C_
2d080 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28  SignUpdate()", (
2d090 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2d0a0 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61  ign_ret);.....ca
2d0b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d0c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2d0d0 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67  used = start_sig
2d0e0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72  n_bufused;.....r
2d0f0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
2d100 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
2d110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d120 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29  or.  SignFinal()
2d130 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2d140 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2d150 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2d160 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65  sign_ret);....re
2d170 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
2d180 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74  .}...if (pSignat
2d190 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ure == NULL) {..
2d1a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d1b0 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72 65  INTF("pSignature
2d1c0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
2d1d0 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69  LL, undoing C_Si
2d1e0 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09  gnUpdate()");...
2d1f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2d200 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2d210 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
2d220 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
2d230 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2d240 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2d250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2d260 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2d270 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2d280 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2d290 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2d2a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2d2b0 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ignUpdate)(CK_SE
2d2c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d2d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2d2e0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2d2f0 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
2d300 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2d310 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2d320 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d330 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d340 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d350 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d370 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d380 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d390 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d3a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d3b0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2d3c0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2d3d0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2d3e0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2d3f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2d400 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2d410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d420 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2d430 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2d440 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2d450 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2d460 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2d470 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d  }...if (pPart ==
2d480 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c   NULL && ulPartL
2d490 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  en == 0) {.../* 
2d4a0 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66  Short circuit if
2d4b0 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f   we are asked to
2d4c0 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e   sign nothing...
2d4d0 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
2d4e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d4f0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2d500 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
2d510 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
2d520 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
2d530 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d  }...if (pPart ==
2d540 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d560 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20  Error. pPart is 
2d570 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74  NULL, but ulPart
2d580 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b  Len is not 0.");
2d590 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2d5a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2d5b0 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65  }...if (ulPartLe
2d5c0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  n == 0) {...CACK
2d5d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d5e0 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65  "Error. ulPartLe
2d5f0 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72  n is 0, but pPar
2d600 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29  t is not NULL.")
2d610 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d620 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2d630 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2d640 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2d650 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2d660 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2d670 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2d680 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d690 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d6a0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2d6b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d6c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2d6d0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2d6e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d6f0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2d700 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2d710 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d720 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2d730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2d740 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2d750 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2d760 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2d770 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2d780 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2d790 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d7a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2d7b0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2d7c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2d7d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2d7e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d7f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d800 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
2d810 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2d820 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2d830 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d840 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
2d850 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d860 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68  ssion].sign_mech
2d870 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20  anism) {...case 
2d880 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
2d890 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64  ./* Accumulate d
2d8a0 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66  irectly */....if
2d8b0 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   ((cackey_sessio
2d8c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d8d0 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61  n_bufused + ulPa
2d8e0 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f  rtLen) > cackey_
2d8f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d900 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20  n].sign_buflen) 
2d910 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73  {.....cackey_ses
2d920 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d930 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32  sign_buflen *= 2
2d940 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  ;......cackey_se
2d950 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d960 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c  .sign_buf = real
2d970 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69  loc(cackey_sessi
2d980 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2d990 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a  gn_buf, sizeof(*
2d9a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d9b0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2d9c0 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73  uf) * cackey_ses
2d9d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d9e0 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09  sign_buflen);...
2d9f0 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61  .}.....memcpy(ca
2da00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2da10 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2da20 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   + cackey_sessio
2da30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2da40 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72 74  n_bufused, pPart
2da50 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09  , ulPartLen);...
2da60 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2da70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2da80 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61  _bufused += ulPa
2da90 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b  rtLen;.....break
2daa0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2dab0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2dac0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2dad0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2dae0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2daf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2db00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2db10 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2db20 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2db30 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2db40 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2db50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2db60 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2db70 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2db80 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2db90 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2dba0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2dbb0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b   C_SignFinal)(CK
2dbc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2dbd0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2dbe0 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
2dbf0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2dc00 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20  ulSignatureLen) 
2dc10 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
2dc20 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a  E sigbuf[1024];.
2dc30 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c  .ssize_t sigbufl
2dc40 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  en;..CK_SLOT_ID 
2dc50 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72  slotID;..CK_RV r
2dc60 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
2dc70 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20  RAL_ERROR;..int 
2dc80 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2dc90 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72   1;..int mutex_r
2dca0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2dcb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2dcc0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2dcd0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2dce0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2dcf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2dd00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2dd10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2dd20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2dd30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2dd40 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69  ;..}...if (pulSi
2dd50 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55  gnatureLen == NU
2dd60 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2dd70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2dd80 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65  or. pulSignature
2dd90 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2dda0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2ddb0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2ddc0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
2ddd0 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
2dde0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2ddf0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
2de00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2de10 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
2de20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2de30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2de40 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
2de50 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2de60 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
2de70 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
2de80 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
2de90 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2dea0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2deb0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2dec0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2ded0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dee0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
2def0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2df00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2df10 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2df20 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2df30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2df40 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2df50 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2df60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2df70 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2df80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2df90 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2dfa0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2dfb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2dfc0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2dfd0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
2dfe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dff0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2e000 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
2e010 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e020 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2e030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e040 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2e050 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ign not active."
2e060 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2e070 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2e080 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e090 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
2e0a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e0b0 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
2e0c0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
2e0d0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
2e0e0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
2e0f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2e100 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
2e110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e120 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2e130 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2e140 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
2e150 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
2e160 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
2e170 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e180 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e190 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
2e1a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
2e1b0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
2e1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e1d0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
2e1e0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
2e1f0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
2e200 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
2e210 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
2e220 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2e230 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e250 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2e260 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
2e270 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e280 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
2e290 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
2e2a0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
2e2b0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
2e2c0 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b   sign */....CACK
2e2d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e2e0 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20  "Asking to sign 
2e2f0 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70  from identity %p
2e300 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22   in session %lu"
2e310 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b 65  , (void *) cacke
2e320 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e330 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
2e340 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ty, (unsigned lo
2e350 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09  ng) hSession);..
2e360 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61  ..sigbuflen = ca
2e370 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74  ckey_signdecrypt
2e380 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
2e390 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73  lotID], cackey_s
2e3a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e3b0 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c  ].sign_identity,
2e3c0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2e3d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2e3e0 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  buf, cackey_sess
2e3f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2e400 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67  ign_bufused, sig
2e410 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62  buf, sizeof(sigb
2e420 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09  uf), 1, 0);.....
2e430 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d  if (sigbuflen ==
2e440 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e   CACKEY_PCSC_E_N
2e450 45 45 44 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b  EEDLOGIN && cack
2e460 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21  ey_pin_command !
2e470 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66  = NULL) {.....if
2e480 20 28 5f 43 5f 4c 6f 67 69 6e 4d 75 74 65 78 41   (_C_LoginMutexA
2e490 72 67 28 68 53 65 73 73 69 6f 6e 2c 20 43 4b 55  rg(hSession, CKU
2e4a0 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c 20 30 2c 20  _USER, NULL, 0, 
2e4b0 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  0) == CKR_OK) {.
2e4c0 09 09 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d  .....sigbuflen =
2e4d0 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2e4e0 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2e4f0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2e500 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e510 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
2e520 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ty, cackey_sessi
2e530 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2e540 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73  gn_buf, cackey_s
2e550 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e560 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
2e570 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  sigbuf, sizeof(s
2e580 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 09  igbuf), 1, 0);..
2e590 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
2e5a0 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29   (sigbuflen < 0)
2e5b0 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e   {...../* Signin
2e5c0 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  g failed. */....
2e5d0 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d  .if (sigbuflen =
2e5e0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2e5f0 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
2e600 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
2e610 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
2e620 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
2e630 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
2e640 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
2e650 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
2e660 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
2e670 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
2e680 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
2e690 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2e6a0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
2e6b0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
2e6c0 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
2e6d0 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70   sigbuflen) > *p
2e6e0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26  ulSignatureLen &
2e6f0 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a  & pSignature) {.
2e700 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61  ..../* Signed da
2e710 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
2e720 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2e730 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20  _PRINTF("retval 
2e740 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2e750 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c  _SMALL;  sigbufl
2e760 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67  en = %lu, pulSig
2e770 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22  natureLen = %lu"
2e780 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2e790 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e  ) sigbuflen, (un
2e7a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75  signed long) *pu
2e7b0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
2e7c0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2e7d0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2e7e0 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61  LL;......termina
2e7f0 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09  te_sign = 0;....
2e800 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72  } else {.....ter
2e810 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
2e820 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e 61  ......if (pSigna
2e830 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  ture) {......mem
2e840 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20  cpy(pSignature, 
2e850 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65  sigbuf, sigbufle
2e860 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e  n);.......termin
2e870 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09  ate_sign = 1;...
2e880 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67  ..}......*pulSig
2e890 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62  natureLen = sigb
2e8a0 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
2e8b0 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
2e8c0 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
2e8d0 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
2e8e0 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61  sign) {...if (ca
2e8f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2e900 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2e910 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
2e920 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e930 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
2e940 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
2e950 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2e960 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2e970 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
2e980 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2e990 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2e9a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2e9b0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2e9c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2e9d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e9e0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2e9f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2ea00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2ea10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2ea20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ea30 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2ea40 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2ea50 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2ea60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ea70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ea80 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
2ea90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2eaa0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2eab0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2eac0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2ead0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2eae0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2eaf0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2eb00 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2eb10 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2eb20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2eb30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2eb40 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2eb50 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2eb60 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2eb70 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2eb80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2eb90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2eba0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ebb0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ebc0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ebd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ebe0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ebf0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ec00 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ec10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ec20 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
2ec30 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2ec40 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2ec50 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2ec60 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2ec70 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2ec80 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2ec90 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2eca0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
2ecb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ecc0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ecd0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ece0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ecf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ed00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ed10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ed20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ed30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ed40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2ed50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ed60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ed70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ed80 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ed90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eda0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2edb0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2edc0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2edd0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ede0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2edf0 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53  VerifyInit)(CK_S
2ee00 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2ee10 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2ee20 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2ee30 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2ee40 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2ee50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ee60 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ee70 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ee80 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ee90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eea0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2eeb0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2eec0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2eed0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2eee0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2eef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ef00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2ef10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ef20 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2ef30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ef40 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2ef50 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2ef60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ef70 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2ef80 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2ef90 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49  Verify)(CK_SESSI
2efa0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2efb0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2efc0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2efd0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2efe0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2eff0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2f000 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
2f010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f020 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f030 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f040 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f060 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f070 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f080 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f090 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f0a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f0c0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f0d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f0e0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f0f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f100 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f110 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f120 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f130 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f140 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f150 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
2f160 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f170 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2f180 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2f190 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2f1a0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2f1b0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2f1c0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2f1d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2f1e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f1f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f200 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2f210 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2f220 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2f230 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2f240 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f250 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f260 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f270 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2f280 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2f290 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f2a0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2f2b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f2c0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2f2d0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2f2e0 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  V, C_VerifyFinal
2f2f0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f300 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f310 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2f320 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
2f330 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2f340 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f350 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2f360 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2f370 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2f380 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f390 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2f3a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2f3b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f3c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2f3d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2f3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f3f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2f400 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f410 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2f420 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f430 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2f440 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2f450 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f460 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2f470 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2f480 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2f490 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2f4a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f4b0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2f4c0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2f4d0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2f4e0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2f4f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f500 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f510 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f520 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f540 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f550 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f560 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f570 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f580 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f590 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f5a0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f5b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f5c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f5d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f5e0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f5f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f600 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f610 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f620 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2f630 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
2f640 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2f650 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2f660 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2f670 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2f680 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  eLen, CK_BYTE_PT
2f690 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2f6a0 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e  G_PTR pulDataLen
2f6b0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f6c0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f6d0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2f6e0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2f6f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f700 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f710 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2f720 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2f730 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2f740 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2f750 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f760 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2f770 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2f780 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2f790 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2f7a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f7b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f7c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f7d0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2f7e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f7f0 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72  RV, C_DigestEncr
2f800 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2f810 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2f820 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2f830 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2f840 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2f850 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2f860 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2f870 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2f880 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2f890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f8a0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f8b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f8c0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f8d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f8e0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f8f0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f900 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f910 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f920 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f940 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f950 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f960 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f970 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f980 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f990 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f9a0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f9b0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f9c0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f9d0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2f9e0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2f9f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2fa00 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2fa10 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2fa20 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2fa30 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2fa40 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2fa50 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2fa60 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2fa70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2fa80 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2fa90 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2faa0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2fab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fac0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2fad0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2fae0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2faf0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2fb00 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fb10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2fb20 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2fb30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fb40 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2fb50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fb60 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2fb70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fb80 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2fb90 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2fba0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e  (CK_RV, C_SignEn
2fbb0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2fbc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2fbd0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2fbe0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2fbf0 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
2fc00 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2fc10 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2fc20 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
2fc30 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2fc40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fc50 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2fc60 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2fc70 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2fc80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fc90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2fca0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2fcb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2fcc0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2fcd0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2fce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fcf0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2fd00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fd10 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2fd20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fd30 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2fd40 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2fd50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fd60 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2fd70 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2fd80 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2fd90 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2fda0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2fdb0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2fdc0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2fdd0 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
2fde0 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
2fdf0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2fe00 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
2fe10 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2fe20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fe30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2fe40 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2fe50 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2fe60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2fe70 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2fe80 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2fe90 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2fea0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2feb0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2fec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2fed0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2fee0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fef0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2ff00 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ff10 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2ff20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ff30 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2ff40 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2ff50 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
2ff60 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  rateKey)(CK_SESS
2ff70 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ff80 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2ff90 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2ffa0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2ffb0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
2ffc0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
2ffd0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2ffe0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
2fff0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30000 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30010 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30020 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30030 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30040 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30050 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30060 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30070 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30080 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
300a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
300b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
300c0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
300d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
300e0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
300f0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30100 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30110 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
30120 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
30130 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29  GenerateKeyPair)
30140 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30150 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30160 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
30170 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
30180 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c  RIBUTE_PTR pPubl
30190 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  icKeyTemplate, C
301a0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63  K_ULONG ulPublic
301b0 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
301c0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
301d0 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54  PTR pPrivateKeyT
301e0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
301f0 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74  G ulPrivateKeyAt
30200 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
30210 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
30220 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20  TR phPublicKey, 
30230 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30240 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65  _PTR phPrivateKe
30250 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
30260 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
30270 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
30280 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
30290 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
302a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
302b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
302c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
302d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
302e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
302f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
30300 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
30310 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
30320 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
30330 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
30340 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30350 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
30360 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30370 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
30380 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
30390 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28  _RV, C_WrapKey)(
303a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
303b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
303c0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
303d0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
303e0 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70  CT_HANDLE hWrapp
303f0 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ingKey, CK_OBJEC
30400 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43  T_HANDLE hKey, C
30410 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
30420 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
30430 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b  _PTR pulWrappedK
30440 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  eyLen) {..CACKEY
30450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
30460 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
30470 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
30480 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
30490 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
304a0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
304b0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
304c0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
304d0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
304e0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
304f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
30500 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
30510 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30520 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
30530 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30540 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
30550 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30560 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
30570 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
30580 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61  N(CK_RV, C_Unwra
30590 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
305a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
305b0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
305c0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
305d0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
305e0 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20  hUnwrappingKey, 
305f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
30600 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
30610 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65  G ulWrappedKeyLe
30620 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
30630 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
30640 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
30650 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
30660 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
30670 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
30680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30690 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
306a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
306b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
306c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
306d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
306e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
306f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30700 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
30710 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30720 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30730 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30740 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30750 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30760 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30770 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30780 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30790 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
307a0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
307b0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65  (CK_RV, C_Derive
307c0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
307d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
307e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
307f0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
30800 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
30810 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52  BaseKey, CK_ATTR
30820 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
30830 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
30840 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
30850 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30860 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
30870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30880 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30890 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
308a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
308b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
308c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
308d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
308e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
308f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30900 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30920 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30930 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30940 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30950 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30960 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30970 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30980 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30990 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
309a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
309b0 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  SeedRandom)(CK_S
309c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
309d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
309e0 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c  PTR pSeed, CK_UL
309f0 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b  ONG ulSeedLen) {
30a00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30a10 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
30a20 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
30a30 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
30a40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30a50 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
30a60 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
30a70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
30a80 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
30a90 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
30aa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30ab0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
30ac0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30ad0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
30ae0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30af0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
30b00 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
30b10 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30b20 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
30b30 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
30b40 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
30b50 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
30b60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30b70 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64  K_BYTE_PTR pRand
30b80 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  omData, CK_ULONG
30b90 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a   ulRandomLen) {.
30ba0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30bb0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
30bc0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
30bd0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
30be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30bf0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
30c00 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30c10 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30c20 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
30c30 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
30c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30c50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30c60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30c70 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30c80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30c90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30ca0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
30cb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30cc0 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  );.}../* Depreca
30cd0 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
30ce0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30cf0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
30d00 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43  unctionStatus)(C
30d10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30d20 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
30d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30d40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30d60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
30d70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30d80 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
30d90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30da0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
30db0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30dc0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
30dd0 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
30de0 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
30df0 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
30e00 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
30e10 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
30e20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
30e30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
30e40 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e  _RV, C_CancelFun
30e50 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ction)(CK_SESSIO
30e60 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30e70 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
30e80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
30e90 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
30ea0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
30eb0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
30ec0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
30ed0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30ee0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
30ef0 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
30f00 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
30f10 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
30f20 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
30f30 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
30f40 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
30f50 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
30f60 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
30f70 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
30f80 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f  List)(CK_FUNCTIO
30f90 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70  N_LIST_PTR_PTR p
30fa0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b  pFunctionList) {
30fb0 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  ..CK_FUNCTION_LI
30fc0 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e  ST_PTR pFunction
30fd0 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
30fe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30ff0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70  led.");...if (pp
31000 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20  FunctionList == 
31010 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
31020 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
31030 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e  rror. ppFunction
31040 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  List is NULL.");
31050 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
31060 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
31070 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  }...pFunctionLis
31080 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  t = malloc(sizeo
31090 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  f(*pFunctionList
310a0 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ));...pFunctionL
310b0 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a  ist->version.maj
310c0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
310d0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
310e0 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
310f0 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ff;..pFunctionLi
31100 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f  st->version.mino
31110 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
31120 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
31130 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
31140 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
31150 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20  t->C_Initialize 
31160 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a  = C_Initialize;.
31170 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31180 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46  C_Finalize = C_F
31190 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  inalize;..pFunct
311a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e  ionList->C_GetIn
311b0 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a  fo = C_GetInfo;.
311c0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
311d0 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20  C_GetSlotList = 
311e0 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09  C_GetSlotList;..
311f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31200 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43  _GetSlotInfo = C
31210 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70  _GetSlotInfo;..p
31220 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31230 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43  GetTokenInfo = C
31240 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09  _GetTokenInfo;..
31250 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31260 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
31270 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  t = C_WaitForSlo
31280 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69  tEvent;..pFuncti
31290 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
312a0 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47  hanismList = C_G
312b0 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b  etMechanismList;
312c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
312d0 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49  >C_GetMechanismI
312e0 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  nfo = C_GetMecha
312f0 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  nismInfo;..pFunc
31300 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
31310 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f  Token = C_InitTo
31320 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ken;..pFunctionL
31330 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d  ist->C_InitPIN =
31340 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75   C_InitPIN;..pFu
31350 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
31360 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b  tPIN = C_SetPIN;
31370 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31380 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d  >C_OpenSession =
31390 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a   C_OpenSession;.
313a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
313b0 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d  C_CloseSession =
313c0 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b   C_CloseSession;
313d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
313e0 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69  >C_CloseAllSessi
313f0 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c  ons = C_CloseAll
31400 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63  Sessions;..pFunc
31410 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
31420 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47  essionInfo = C_G
31430 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09  etSessionInfo;..
31440 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31450 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
31460 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74  te = C_GetOperat
31470 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
31480 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f  tionList->C_SetO
31490 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
314a0 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
314b0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
314c0 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43  ist->C_Login = C
314d0 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69  _Login;..pFuncti
314e0 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74  onList->C_Logout
314f0 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46   = C_Logout;..pF
31500 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
31510 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f  reateObject = C_
31520 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70  CreateObject;..p
31530 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31540 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43  CopyObject = C_C
31550 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  opyObject;..pFun
31560 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73  ctionList->C_Des
31570 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44  troyObject = C_D
31580 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70  estroyObject;..p
31590 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
315a0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20  GetObjectSize = 
315b0 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b  C_GetObjectSize;
315c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
315d0 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56  >C_GetAttributeV
315e0 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72  alue = C_GetAttr
315f0 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
31600 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
31610 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
31620 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  = C_SetAttribute
31630 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
31640 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
31650 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e  ectsInit = C_Fin
31660 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70  dObjectsInit;..p
31670 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31680 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f  FindObjects = C_
31690 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46  FindObjects;..pF
316a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
316b0 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20  indObjectsFinal 
316c0 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  = C_FindObjectsF
316d0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
316e0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49  List->C_EncryptI
316f0 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49  nit = C_EncryptI
31700 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
31710 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d  ist->C_Encrypt =
31720 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75   C_Encrypt;..pFu
31730 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
31740 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
31750 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
31760 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31770 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _EncryptFinal = 
31780 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_EncryptFinal;.
31790 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
317a0 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20  C_DecryptInit = 
317b0 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_DecryptInit;..
317c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
317d0 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63  _Decrypt = C_Dec
317e0 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
317f0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55  List->C_DecryptU
31800 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
31810 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
31820 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
31830 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72  ptFinal = C_Decr
31840 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
31850 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
31860 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73  stInit = C_Diges
31870 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
31880 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20  nList->C_Digest 
31890 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75  = C_Digest;..pFu
318a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
318b0 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
318c0 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
318d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
318e0 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67  igestKey = C_Dig
318f0 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  estKey;..pFuncti
31900 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
31910 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74  Final = C_Digest
31920 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
31930 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69  nList->C_SignIni
31940 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a  t = C_SignInit;.
31950 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31960 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b  C_Sign = C_Sign;
31970 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31980 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20  >C_SignUpdate = 
31990 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70  C_SignUpdate;..p
319a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
319b0 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69  SignFinal = C_Si
319c0 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  gnFinal;..pFunct
319d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
319e0 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53  ecoverInit = C_S
319f0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ignRecoverInit;.
31a00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31a10 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20  C_SignRecover = 
31a20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09  C_SignRecover;..
31a30 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31a40 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f  _VerifyInit = C_
31a50 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75  VerifyInit;..pFu
31a60 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
31a70 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b  rify = C_Verify;
31a80 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31a90 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20  >C_VerifyUpdate 
31aa0 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  = C_VerifyUpdate
31ab0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31ac0 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20  ->C_VerifyFinal 
31ad0 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b  = C_VerifyFinal;
31ae0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31af0 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72  >C_VerifyRecover
31b00 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52  Init = C_VerifyR
31b10 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75  ecoverInit;..pFu
31b20 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
31b30 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f  rifyRecover = C_
31b40 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09  VerifyRecover;..
31b50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31b60 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
31b70 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45  date = C_DigestE
31b80 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
31b90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31ba0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
31bb0 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44  ate = C_DecryptD
31bc0 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
31bd0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
31be0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
31bf0 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74   = C_SignEncrypt
31c00 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
31c10 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
31c20 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  tVerifyUpdate = 
31c30 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
31c40 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
31c50 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
31c60 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74  eKey = C_Generat
31c70 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  eKey;..pFunction
31c80 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
31c90 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65  KeyPair = C_Gene
31ca0 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46  rateKeyPair;..pF
31cb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
31cc0 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b  rapKey = C_WrapK
31cd0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
31ce0 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20  st->C_UnwrapKey 
31cf0 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09  = C_UnwrapKey;..
31d00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31d10 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44  _DeriveKey = C_D
31d20 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63  eriveKey;..pFunc
31d30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64  tionList->C_Seed
31d40 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52  Random = C_SeedR
31d50 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
31d60 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
31d70 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65  eRandom = C_Gene
31d80 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75  rateRandom;..pFu
31d90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31da0 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20  tFunctionStatus 
31db0 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  = C_GetFunctionS
31dc0 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f  tatus;..pFunctio
31dd0 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46  nList->C_CancelF
31de0 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63  unction = C_Canc
31df0 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75  elFunction;..pFu
31e00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31e10 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  tFunctionList = 
31e20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
31e30 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e  t;...*ppFunction
31e40 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e  List = pFunction
31e50 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
31e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
31e70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
31e80 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
31e90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
31ea0 7d 0a 0a                                         }..