Hex Artifact Content

Artifact 8c591e35484d16a6e2336c72735782f6edf59beb:


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 2c 20 4c 50  ult_protocol, LP
74b0: 44 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70  DWORD selected_p
74c0: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20  rotocol);. *. * 
74d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
74e0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
74f0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
7500: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
7510: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
7520: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7530: 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20  rotocol. *      
7540: 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61     Protocol to a
7550: 74 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a  ttempt first. *.
7560: 20 2a 20 20 20 20 20 4c 50 44 57 4f 52 44 20 73   *     LPDWORD s
7570: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7580: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
7590: 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  ] Protocol selec
75a0: 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ted. *. * RETURN
75b0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
75c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
75d0: 72 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  rom SCardReconne
75e0: 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ct(). *. * NOTES
75f0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
7600: 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
7610: 65 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52  er around SCardR
7620: 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a  econnect(). *. *
7630: 20 20 20 20 20 54 68 65 20 53 43 61 72 64 52 65       The SCardRe
7640: 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69  connect() functi
7650: 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  on call will be 
7660: 63 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74  called first wit
7670: 68 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50  h the. *     dwP
7680: 72 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c  referredProtocol
7690: 73 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72  s of "default_pr
76a0: 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61  otocol".  If tha
76b0: 74 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  t call returns. 
76c0: 2a 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52  *     SCARD_E_PR
76d0: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79  OTO_MISMATCH try
76e0: 20 61 67 61 69 6e 20 77 69 74 68 20 61 20 70 72   again with a pr
76f0: 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61  otocol of T=0, a
7700: 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20  nd failing. *   
7710: 20 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20    that T=1.. *. 
7720: 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63  */.static LONG c
7730: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
7740: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
7750: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44  ey_slot *slot, D
7760: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7770: 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73  tocol, LPDWORD s
7780: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7790: 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ) {..LONG scard_
77a0: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61 72  conn_ret;...scar
77b0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
77c0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
77d0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
77e0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
77f0: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7800: 6c 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  l, SCARD_RESET_C
7810: 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72  ARD, selected_pr
7820: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73  otocol);...if (s
7830: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
7840: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7850: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43  ISMATCH) {...CAC
7860: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7870: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
7880: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7890: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
78a0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
78b0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61  just T=0")...sca
78c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
78d0: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
78e0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
78f0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7900: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7910: 5f 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T0, SCARD_RESET
7920: 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f  _CARD, selected_
7930: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66  protocol);....if
7940: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7950: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7960: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
7970: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7980: 49 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e  INTF("SCardRecon
7990: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
79a0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
79b0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
79c0: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
79d0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
79e0: 20 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63   = SCardReconnec
79f0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
7a00: 64 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  d, SCARD_SHARE_S
7a10: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
7a20: 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f  TOCOL_T1, SCARD_
7a30: 52 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65  RESET_CARD, sele
7a40: 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a  cted_protocol);.
7a50: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ..}..}...return(
7a60: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
7a70: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
7a80: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
7a90: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
7aa0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
7ab0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
7ac0: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
7ad0: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
7ae0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
7af0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
7b00: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
7b10: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
7b20: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
7b30: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
7b40: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
7b50: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
7b60: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
7b70: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
7b80: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
7b90: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
7ba0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
7bb0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72  connect_card(str
7bc0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
7bd0: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
7be0: 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
7bf0: 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72  t_ret;..DWORD pr
7c00: 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63  otocol;..LONG sc
7c10: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09  ard_conn_ret;...
7c20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7c30: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7c40: 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09  ..if (!slot) {..
7c50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7c60: 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c  INTF("Invalid sl
7c70: 6f 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65  ot specified, re
7c80: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
7c90: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
7ca0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
7cb0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73  NERIC);..}...pcs
7cc0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
7cd0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
7ce0: 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63  ect();..if (pcsc
7cf0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
7d00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7d10: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
7d20: 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65  UG_PRINTF("Conne
7d30: 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66  ction to PC/SC f
7d40: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
7d50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
7d60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
7d70: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
7d80: 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74  ..}.../* Connect
7d90: 20 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e   to reader, if n
7da0: 65 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73  eeded */..if (!s
7db0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
7dc0: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
7dd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7de0: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
7df0: 25 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f  %s) called", slo
7e00: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
7e10: 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7e20: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7e30: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7e40: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7e50: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7e60: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7e70: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
7e80: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7e90: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
7ea0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
7eb0: 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  ;....if (scard_c
7ec0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7ed0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7ee0: 48 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  H) {....CACKEY_D
7ef0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7f00: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7f10: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7f20: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7f30: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7f40: 30 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  0")....scard_con
7f50: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
7f60: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
7f70: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
7f80: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
7f90: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
7fa0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
7fb0: 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T0, &slot->pcsc_
7fc0: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
7fd0: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
7fe0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
7ff0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
8000: 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  CH) {.....CACKEY
8010: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
8020: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65  CardConnect() re
8030: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
8040: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
8050: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
8060: 54 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f  T=1").....scard_
8070: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
8080: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
8090: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
80a0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
80b0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
80c0: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
80d0: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
80e0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
80f0: 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ol);....}...}...
8100: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
8110: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55  ret == SCARD_W_U
8120: 4e 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b  NPOWERED_CARD) {
8130: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8140: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
8150: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
8160: 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52   SCARD_W_UNPOWER
8170: 45 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20  ED_CARD, trying 
8180: 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e  to re-connect...
8190: 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f  ");.....scard_co
81a0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
81b0: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
81c0: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
81d0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
81e0: 41 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54  ARD_SHARE_DIRECT
81f0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8200: 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
8210: 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e  OCOL_T1, &slot->
8220: 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74  pcsc_card, &prot
8230: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73  ocol);.....if (s
8240: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8250: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
8260: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43  ISMATCH) {.....C
8270: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8280: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
8290: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
82a0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
82b0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
82c0: 6a 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73  just T=0").....s
82d0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
82e0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
82f0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
8300: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
8310: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
8320: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
8330: 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f  ROTOCOL_T0, &slo
8340: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8350: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69  rotocol);......i
8360: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8370: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f  t == SCARD_E_PRO
8380: 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09  TO_MISMATCH) {..
8390: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
83a0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
83b0: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
83c0: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
83d0: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
83e0: 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a  with just T=1").
83f0: 09 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  .....scard_conn_
8400: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
8410: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
8420: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
8430: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
8440: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
8450: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
8460: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
8470: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8480: 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73  ....}....}.....s
8490: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
84a0: 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74  cackey_reconnect
84b0: 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74  _card(slot, prot
84c0: 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  ocol, &protocol)
84d0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61  ;...}....if (sca
84e0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53  rd_conn_ret != S
84f0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
8500: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8510: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
8520: 74 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69  tion to card fai
8530: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
8540: 6e 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64  n failure (SCard
8550: 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25  Connect() = %s/%
8560: 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  li)", CACKEY_DEB
8570: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
8580: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f  _TO_STR(scard_co
8590: 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  nn_ret), (long) 
85a0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b  scard_conn_ret);
85b0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
85c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
85d0: 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d  C);...}....slot-
85e0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
85f0: 63 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74  cted = 1;...slot
8600: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8610: 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d  pth = 0;...slot-
8620: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
8630: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
8640: 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
8650: 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a  = protocol;..}..
8660: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8670: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
8680: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09  in success");...
8690: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
86a0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
86b0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
86c0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
86d0: 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
86e0: 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61  action(struct ca
86f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
8700: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
8710: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8720: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
8730: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
8740: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
8750: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
8760: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
8770: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
8780: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
8790: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
87a0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
87b0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
87c0: 53 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61  S. *     The tra
87d0: 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  nsaction should 
87e0: 62 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73  be terminated us
87f0: 69 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f  ing "cackey_end_
8800: 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a  transaction". *.
8810: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
8820: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67  y_ret cackey_beg
8830: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
8840: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8850: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
8860: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f  ey_ret cackey_co
8870: 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63  nn_ret;..LONG sc
8880: 61 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a  ard_trans_ret;..
8890: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
88a0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
88b0: 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  ...cackey_conn_r
88c0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
88d0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
88e0: 09 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e  .if (cackey_conn
88f0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
8900: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
8910: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8920: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
8930: 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
8940: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
8950: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
8960: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
8970: 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d  RIC);..}...slot-
8980: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8990: 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  th++;...if (slot
89a0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
89b0: 70 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74  pth > 1 && !slot
89c0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ->transaction_ne
89d0: 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09  ed_hw_lock) {...
89e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
89f0: 4e 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20  NTF("Already in 
8a00: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70  a transaction, p
8a10: 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74  erforming no act
8a20: 69 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d  ion (new depth =
8a30: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
8a40: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
8a50: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8a60: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
8a70: 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
8a80: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
8a90: 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74  k = 0;...scard_t
8aa0: 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64  rans_ret = SCard
8ab0: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
8ac0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
8ad0: 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72  );..if (scard_tr
8ae0: 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ans_ret != SCARD
8af0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8b00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8b10: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62  NTF("Unable to b
8b20: 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
8b30: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65  , returning in e
8b40: 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  rror");....retur
8b50: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
8b60: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
8b70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8b80: 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20  TF("Sucessfully 
8b90: 62 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f  began transactio
8ba0: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
8bb0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
8bc0: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
8bd0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
8be0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
8bf0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
8c00: 5f 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f  _ret cackey_end_
8c10: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8c20: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8c30: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
8c40: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
8c50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
8c60: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
8c70: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
8c80: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
8c90: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
8ca0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
8cb0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
8cc0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
8cd0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
8ce0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
8cf0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
8d00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75  is function requ
8d10: 69 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67  ires "cackey_beg
8d20: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20  in_transaction" 
8d30: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  to be called fir
8d40: 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  st. *. */.static
8d50: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
8d60: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
8d70: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
8d80: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
8d90: 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73  LONG scard_trans
8da0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
8db0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
8dc0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73  led.");...if (!s
8dd0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
8de0: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41  onnected) {...CA
8df0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8e00: 46 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63  F("Card is not c
8e10: 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65  onnected, unable
8e20: 20 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74   to end transact
8e30: 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a  ion on card");..
8e40: 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8e50: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
8e60: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
8e70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63  EBUG_PRINTF("Dec
8e80: 72 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74  reasing transact
8e90: 69 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73  ion depth and as
8ea0: 6b 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77  king for a hardw
8eb0: 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  are lock on the 
8ec0: 6e 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73  next begin trans
8ed0: 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20  action (current 
8ee0: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c  depth = %i)", sl
8ef0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8f00: 64 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74  depth);.....slot
8f10: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8f20: 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73  pth--;.....if (s
8f30: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8f40: 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
8f50: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8f60: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
8f70: 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a   = 1;....}...}..
8f80: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8f90: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8fa0: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
8fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8fc0: 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  h == 0) {...CACK
8fd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8fe0: 22 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74  "Terminating a t
8ff0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
9000: 68 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29  has not begun!")
9010: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9020: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9030: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
9040: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9050: 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  --;...if (slot->
9060: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
9070: 68 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  h > 0) {...CACKE
9080: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9090: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
90a0: 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  ll in progress, 
90b0: 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  not terminating 
90c0: 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74  on-card Transact
90d0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
90e0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
90f0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
9100: 74 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  th);....return(C
9110: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9120: 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61  ;..}...scard_tra
9130: 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e  ns_ret = SCardEn
9140: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  dTransaction(slo
9150: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
9160: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
9170: 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e  ..if (scard_tran
9180: 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
9190: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
91a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
91b0: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64  F("Unable to end
91c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
91d0: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
91e0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
91f0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9200: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
9210: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9220: 53 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d  Sucessfully term
9230: 69 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69  inated transacti
9240: 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22  on on slot (%s)"
9250: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
9260: 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  der);...return(C
9270: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
9280: 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c  ;.}../* APDU Rel
9290: 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a  ated Functions *
92a0: 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  /./*. * SYNPOSIS
92b0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
92c0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61  et cackey_send_a
92d0: 70 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65  pdu(struct cacke
92e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
92f0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73  signed char clas
9300: 73 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  s, unsigned char
9310: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e   instruction, un
9320: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20  signed char p1, 
9330: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32  unsigned char p2
9340: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9350: 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  lc, unsigned cha
9360: 72 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65  r *data, unsigne
9370: 64 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31  d char le, uint1
9380: 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75  6_t *respcode, u
9390: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65  nsigned char *re
93a0: 73 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a  spdata, size_t *
93b0: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20  respdata_len);. 
93c0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
93d0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
93e0: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
93f0: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
9400: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
9410: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9420: 68 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20  har class. *    
9430: 20 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20       APDU Class 
9440: 28 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f  (GSCIS_CLASS_ISO
9450: 37 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c  7816 or GSCIS_CL
9460: 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
9470: 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75  ORM. *         u
9480: 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20  sually), (CLA). 
9490: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
94a0: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
94b0: 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  on. *         AP
94c0: 44 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28  DU Instruction (
94d0: 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75  INS). *. *     u
94e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a  nsigned char p1.
94f0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9500: 50 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29  Parameter 1 (P1)
9510: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9520: 6e 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20  ned char p2. *  
9530: 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61         APDU Para
9540: 6d 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a  meter 2 (P2). *.
9550: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9560: 63 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20  char lc. *      
9570: 20 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f     APDU Length o
9580: 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d  f Content (Lc) -
9590: 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65  - this is the le
95a0: 6e 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20  ngth of "data". 
95b0: 2a 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65  *         parame
95c0: 74 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20  ter.  If "data" 
95d0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
95e0: 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d  NULL, this param
95f0: 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20  eter will. *    
9600: 20 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e       be ignored.
9610: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9620: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20  ned char *data. 
9630: 2a 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65  *         Pointe
9640: 72 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73  r to buffer to s
9650: 65 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20  end.  It should 
9660: 62 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f  be "Lc" bytes lo
9670: 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20  ng.  If. *      
9680: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9690: 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20  NULL, "Lc" will 
96a0: 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64  not be sent, and
96b0: 20 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c   this buffer wil
96c0: 6c 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20  l be. *         
96d0: 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20  ignored.. *. *  
96e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
96f0: 20 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41   le. *         A
9700: 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78  PDU Length of Ex
9710: 70 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d  pectation (Le) -
9720: 2d 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65  - this is the le
9730: 6e 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20  ngth of the. *  
9740: 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20         expected 
9750: 72 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20  reply.  If this 
9760: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
9770: 30 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e  0 then it will n
9780: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65  ot. *         be
9790: 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20   sent.. *. *    
97a0: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
97b0: 6f 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  ode. *         [
97c0: 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT] Pointer to 
97d0: 73 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20  storage of APDU 
97e0: 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20  response code.  
97f0: 49 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20  If this is. *   
9800: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
9810: 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73  as NULL, the res
9820: 70 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20  ponse code will 
9830: 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a  be discarded.. *
9840: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9850: 20 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a   char *respdata.
9860: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
9870: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72   Pointer to stor
9880: 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70  age of APDU resp
9890: 6f 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74  onse data.  If t
98a0: 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20  his is. *       
98b0: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
98c0: 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73  ULL, the respons
98d0: 65 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64  e data will be d
98e0: 69 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a  iscarded.  If. *
98f0: 20 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65           the "re
9900: 73 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61  spdata_len" para
9910: 6d 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69  meter is specifi
9920: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73  ed as NULL, this
9930: 20 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20   buffer. *      
9940: 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75     will not be u
9950: 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  pdated.. *. *   
9960: 20 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61    size_t *respda
9970: 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  ta_len. *       
9980: 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e    [IN, OUT] Poin
9990: 74 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63  ter initialing c
99a0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69  ontaining the si
99b0: 7a 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64  ze of the "respd
99c0: 61 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20  ata". *         
99d0: 62 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20  buffer.  Before 
99e0: 72 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70  returning, the p
99f0: 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20  ointed to value 
9a00: 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68  is updated to th
9a10: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d  e. *         num
9a20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
9a30: 74 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66  tten to the buff
9a40: 65 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  er.  If this is 
9a50: 73 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20  specified as. * 
9a60: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74          NULL, it
9a70: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
9a80: 61 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64  ated, and "respd
9a90: 61 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e  ata" will be ign
9aa0: 6f 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20  ored causing. * 
9ab0: 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70          the resp
9ac0: 6f 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20  onse data to be 
9ad0: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
9ae0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
9af0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
9b00: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  _S_OK           
9b10: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
9b20: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
9b30: 47 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20  GENERIC      On 
9b40: 65 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43  error. *     CAC
9b50: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
9b60: 41 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73  ABSENT  If the s
9b70: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65  ending failed be
9b80: 63 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20  cause the token 
9b90: 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20  is. *           
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20       absent. *. 
9bc0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
9bd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
9be0: 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65  l connect to the
9bf0: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
9c00: 6e 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a  n Manager via. *
9c10: 20 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63       cackey_pcsc
9c20: 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65  _connect() if ne
9c30: 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  eded.. *. *     
9c40: 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20  It will connect 
9c50: 74 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74  to the card in t
9c60: 68 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68  he reader attach
9c70: 65 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20  ed to the slot. 
9c80: 2a 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e  *     specified.
9c90: 20 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e    It will reconn
9ca0: 65 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20  ect to the card 
9cb0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
9cc0: 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77  n. *     goes aw
9cd0: 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  ay.. *. */.stati
9ce0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
9cf0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74  key_send_apdu(st
9d00: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
9d10: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
9d20: 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73   char class, uns
9d30: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72  igned char instr
9d40: 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64  uction, unsigned
9d50: 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e   char p1, unsign
9d60: 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69  ed char p2, unsi
9d70: 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73  gned int lc, uns
9d80: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
9d90: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c  , unsigned int l
9da0: 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73  e, uint16_t *res
9db0: 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20  pcode, unsigned 
9dc0: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20  char *respdata, 
9dd0: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
9de0: 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74  _len) {..uint8_t
9df0: 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72   major_rc, minor
9e00: 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74  _rc;..size_t byt
9e10: 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f  es_to_copy, tmp_
9e20: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c  respdata_len;..L
9e30: 50 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45  PCSCARD_IO_REQUE
9e40: 53 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09  ST pioSendPci;..
9e50: 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a  DWORD protocol;.
9e60: 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c  .DWORD xmit_len,
9e70: 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47   recv_len;..LONG
9e80: 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c   scard_xmit_ret,
9e90: 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65   scard_reconn_re
9ea0: 74 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75  t;..BYTE xmit_bu
9eb0: 66 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75  f[1024], recv_bu
9ec0: 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63  f[1024];..int pc
9ed0: 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20  sc_connect_ret, 
9ee0: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
9ef0: 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41  ;..int idx;...CA
9f00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9f10: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
9f20: 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43  if (!slot) {...C
9f30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9f40: 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74  TF("Invalid slot
9f50: 20 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a   specified.");..
9f60: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
9f70: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
9f80: 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
9f90: 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
9fa0: 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
9fb0: 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
9fc0: 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
9fd0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
9fe0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9ff0: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
a000: 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
a010: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
a020: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
a030: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
a040: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
a050: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  ../* Determine w
a060: 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f  hich protocol to
a070: 20 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09   send using */..
a080: 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72  switch (slot->pr
a090: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65  otocol) {...case
a0a0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a0b0: 54 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  T0:....CACKEY_DE
a0c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
a0d0: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74  ocol to send dat
a0e0: 61 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a  agram is T=0");.
a0f0: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
a100: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
a110: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
a120: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a130: 54 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  T1:....CACKEY_DE
a140: 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
a150: 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74  ocol to send dat
a160: 61 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a  agram is T=1");.
a170: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
a180: 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a   SCARD_PCI_T1;..
a190: 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61  ...break;...defa
a1a0: 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ult:....CACKEY_D
a1b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
a1c0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f  alid protocol fo
a1d0: 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29  und, aborting.")
a1e0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
a1f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
a200: 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61  IC);..}.../* Tra
a210: 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c  nsmit */..xmit_l
a220: 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75  en = 0;..xmit_bu
a230: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a240: 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66  class;..xmit_buf
a250: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69  [xmit_len++] = i
a260: 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69  nstruction;..xmi
a270: 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b  t_buf[xmit_len++
a280: 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75  ] = p1;..xmit_bu
a290: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a2a0: 70 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b  p2;..if (data) {
a2b0: 0a 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29  ...if (lc > 255)
a2c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
a2d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49  UG_PRINTF("CAUTI
a2e0: 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63  ON!  Using an Lc
a2f0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35   greater than 25
a300: 35 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20  5 is untested.  
a310: 4c 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a  Lc = %u", lc);..
a320: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a330: 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20  _len++] = 0x82; 
a340: 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20  /* XXX UNTESTED 
a350: 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  */....xmit_buf[x
a360: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63  mit_len++] = (lc
a370: 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b   & 0xff00) >> 8;
a380: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a390: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20  t_len++] = lc & 
a3a0: 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  0xff;...} else {
a3b0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a3c0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09  t_len++] = lc;..
a3d0: 09 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
a3e0: 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78  0; idx < lc; idx
a3f0: 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  ++) {....xmit_bu
a400: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a410: 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09  data[idx];...}..
a420: 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78  }...if (le != 0x
a430: 30 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e  00) {...if (le >
a440: 20 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45   256) {....CACKE
a450: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a460: 43 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20  CAUTION!  Using 
a470: 61 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74 68  an Le greater th
a480: 61 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73 74  an 256 is untest
a490: 65 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c  ed.  Le = %u", l
a4a0: 65 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66  e);.....xmit_buf
a4b0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30  [xmit_len++] = 0
a4c0: 78 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45  x82; /* XXX UNTE
a4d0: 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f  STED */....xmit_
a4e0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a4f0: 3d 20 28 6c 65 20 26 20 30 78 66 66 30 30 29 20  = (le & 0xff00) 
a500: 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75  >> 8;....xmit_bu
a510: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a520: 6c 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65  le & 0xff;...} e
a530: 6c 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35  lse if (le == 25
a540: 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  6) {....xmit_buf
a550: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30  [xmit_len++] = 0
a560: 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  x00;...} else {.
a570: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a580: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09  _len++] = le;...
a590: 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20  }..}.../* Begin 
a5a0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
a5b0: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
a5c0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
a5d0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28  on(slot);...if (
a5e0: 63 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43  class == GSCIS_C
a5f0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20  LASS_ISO7816 && 
a600: 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47  instruction == G
a610: 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
a620: 59 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29  Y && p1 == 0x00)
a630: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a640: 47 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e  G_PRINTF("Sendin
a650: 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72  g APDU: <<censor
a660: 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20  ed>>");..} else 
a670: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a680: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69  _PRINTBUF("Sendi
a690: 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f  ng APDU:", xmit_
a6a0: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a  buf, xmit_len);.
a6b0: 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20  .}...recv_len = 
a6c0: 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29  sizeof(recv_buf)
a6d0: 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  ;..scard_xmit_re
a6e0: 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69  t = SCardTransmi
a6f0: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
a700: 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78  d, pioSendPci, x
a710: 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65  mit_buf, xmit_le
a720: 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75  n, NULL, recv_bu
a730: 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a  f, &recv_len);..
a740: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
a750: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e  ret == SCARD_E_N
a760: 4f 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b  OT_TRANSACTED) {
a770: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a780: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
a790: 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63  o send APDU to c
a7a0: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
a7b0: 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20  it() = %s/%lx), 
a7c0: 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67  will ask calling
a7d0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74   function to ret
a7e0: 72 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e  ry (not resettin
a7f0: 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43  g card)...", CAC
a800: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
a810: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
a820: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
a830: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
a840: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a850: 0a 0a 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61  ..../* Begin Sma
a860: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
a870: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
a880: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
a890: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
a8a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
a8b0: 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  TRY);..}...if (s
a8c0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d  card_xmit_ret !=
a8d0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
a8e0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a8f0: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
a900: 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74  d to send APDU t
a910: 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  o card (SCardTra
a920: 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78  nsmit() = %s/%lx
a930: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
a940: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
a950: 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74  O_STR(scard_xmit
a960: 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64  _ret), (unsigned
a970: 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69   long) scard_xmi
a980: 74 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45  t_ret);....CACKE
a990: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a9a0: 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20  Marking slot as 
a9b0: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
a9c0: 74 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  t");...cackey_ma
a9d0: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
a9e0: 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ot);....if (scar
a9f0: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43  d_xmit_ret == SC
aa00: 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44  ARD_W_RESET_CARD
aa10: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
aa20: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65  BUG_PRINTF("Rese
aa30: 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61  t required, plea
aa40: 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09  se hold...");...
aa50: 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  ..scard_reconn_r
aa60: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f  et = cackey_reco
aa70: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c  nnect_card(slot,
aa80: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
aa90: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
aaa0: 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f  COL_T1, &protoco
aab0: 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72  l);.....if (scar
aac0: 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  d_reconn_ret == 
aad0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
aae0: 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65   {...../* Update
aaf0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09   protocol */....
ab00: 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
ab10: 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09  = protocol;.....
ab20: 73 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72  switch (slot->pr
ab30: 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63  otocol) {......c
ab40: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
ab50: 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f  OL_T0:.......pio
ab60: 53 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f  SendPci = SCARD_
ab70: 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62  PCI_T0;........b
ab80: 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
ab90: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
aba0: 31 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64  1:.......pioSend
abb0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
abc0: 54 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  T1;........break
abd0: 3b 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a  ;......default:.
abe0: 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
abf0: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
ac00: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
ac10: 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20  d, but too late 
ac20: 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61  to do anything a
ac30: 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74  bout it now -- t
ac40: 72 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b  rying anyway.");
ac50: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
ac60: 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d  ...}....../* Re-
ac70: 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61  establish transa
ac80: 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73  ction, if it was
ac90: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09   present */.....
aca0: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
acb0: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
acc0: 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72   {......slot->tr
acd0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
ace0: 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72  -;......slot->tr
acf0: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
ad00: 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09  w_lock = 1;.....
ad10: 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
ad20: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
ad30: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
ad40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ad50: 22 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75  "Reset successfu
ad60: 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e  l, retransmittin
ad70: 67 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c  g");......recv_l
ad80: 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76  en = sizeof(recv
ad90: 5f 62 75 66 29 3b 0a 09 09 09 09 73 63 61 72 64  _buf);.....scard
ada0: 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72  _xmit_ret = SCar
adb0: 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e  dTransmit(slot->
adc0: 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65  pcsc_card, pioSe
add0: 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c  ndPci, xmit_buf,
ade0: 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c   xmit_len, NULL,
adf0: 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76   recv_buf, &recv
ae00: 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
ae10: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21  scard_xmit_ret !
ae20: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
ae30: 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
ae40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ae50: 65 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64  etransmit failed
ae60: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ae70: 61 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73  ailure after dis
ae80: 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63  connecting the c
ae90: 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d  ard (SCardTransm
aea0: 69 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43  it = %s/%li)", C
aeb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
aec0: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
aed0: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29  (scard_xmit_ret)
aee0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  , (long) scard_x
aef0: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09  mit_ret);.......
af00: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
af10: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
af20: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
af30: 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70  D);......slot->p
af40: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
af50: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a  ed = 0;......./*
af60: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
af70: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
af80: 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
af90: 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a  tion_depth = 1;.
afa0: 09 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  .....cackey_end_
afb0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
afc0: 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
afd0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
afe0: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
aff0: 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
b000: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b010: 52 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63  RINTF("Disconnec
b020: 74 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09  ting card");....
b030: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
b040: 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  t(slot->pcsc_car
b050: 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43  d, SCARD_LEAVE_C
b060: 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e  ARD);.....slot->
b070: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
b080: 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a  ted = 0;....../*
b090: 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54   End Smartcard T
b0a0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09  ransaction */...
b0b0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
b0c0: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
b0d0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
b0e0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b0f0: 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
b100: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
b110: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
b120: 29 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
b130: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
b140: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09  NABSENT);....}..
b150: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
b160: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b170: 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  ("Disconnecting 
b180: 63 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72  card");.....SCar
b190: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
b1a0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
b1b0: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
b1c0: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
b1d0: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
b1e0: 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61  ;...../* End Sma
b1f0: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
b200: 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74  on */....slot->t
b210: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
b220: 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 1;....cackey_
b230: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b240: 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45  slot);.....CACKE
b250: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b260: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
b270: 6c 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72  lure");....retur
b280: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
b290: 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
b2a0: 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
b2b0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65  BUG_PRINTBUF("Re
b2c0: 74 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20  turned Value:", 
b2d0: 72 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c  recv_buf, recv_l
b2e0: 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f  en);...if (recv_
b2f0: 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20  len < 2) {.../* 
b300: 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65  Minimal response
b310: 20 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74   length is 2 byt
b320: 65 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  es, returning in
b330: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41   failure */...CA
b340: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b350: 46 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20  F("Response too 
b360: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
b370: 20 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63   in failure (rec
b380: 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28  v_len = %lu)", (
b390: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
b3a0: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20  ecv_len);..../* 
b3b0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
b3c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
b3d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b3e0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b3f0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b400: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
b410: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
b420: 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   result code */.
b430: 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76  .major_rc = recv
b440: 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20  _buf[recv_len - 
b450: 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20  2];..minor_rc = 
b460: 72 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65  recv_buf[recv_le
b470: 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73  n - 1];..if (res
b480: 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70  pcode) {...*resp
b490: 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63  code = (major_rc
b4a0: 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72   << 8) | minor_r
b4b0: 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73  c;..}.../* Adjus
b4c0: 74 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72  t message buffer
b4d0: 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d   */..recv_len -=
b4e0: 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74   2;.../* Add byt
b4f0: 65 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c  es to return val
b500: 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64  ue */..tmp_respd
b510: 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66  ata_len = 0;..if
b520: 20 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65   (respdata && re
b530: 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09  spdata_len) {...
b540: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b550: 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e   = *respdata_len
b560: 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f  ;....bytes_to_co
b570: 70 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c  py = *respdata_l
b580: 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f  en;....if (recv_
b590: 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  len < bytes_to_c
b5a0: 6f 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f  opy) {....bytes_
b5b0: 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c  to_copy = recv_l
b5c0: 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  en;...}....CACKE
b5d0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b5e0: 43 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65  Copying %lu byte
b5f0: 73 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  s to the buffer 
b600: 28 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65  (recv'd %lu byte
b610: 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20  s, but only %lu 
b620: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75  bytes left in ou
b630: 72 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73  r buffer)", (uns
b640: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65  igned long) byte
b650: 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69  s_to_copy, (unsi
b660: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
b670: 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
b680: 6f 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c  ong) *respdata_l
b690: 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72  en);....memcpy(r
b6a0: 65 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75  espdata, recv_bu
b6b0: 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  f, bytes_to_copy
b6c0: 29 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d  );...respdata +=
b6d0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
b6e0: 0a 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  ...*respdata_len
b6f0: 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   = bytes_to_copy
b700: 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61  ;...tmp_respdata
b710: 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  _len -= bytes_to
b720: 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b  _copy;..} else {
b730: 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
b740: 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
b750: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b760: 54 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c  Throwing away %l
b770: 75 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65  u bytes, nowhere
b780: 20 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20   to put them!", 
b790: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
b7a0: 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09  recv_len);...}..
b7b0: 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63  }...if (major_rc
b7c0: 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a   == 0x61) {.../*
b7d0: 20 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44   We need to READ
b7e0: 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42   */...CACKEY_DEB
b7f0: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
b800: 72 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22  r read required"
b810: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
b820: 72 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  rc == 0x00) {...
b830: 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b  .minor_rc = CACK
b840: 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
b850: 0a 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70  ....pcsc_getresp
b860: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
b870: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
b880: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
b890: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47  6, GSCIS_INSTR_G
b8a0: 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30  ET_RESPONSE, 0x0
b8b0: 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c  0, 0x00, 0, NULL
b8c0: 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70  , minor_rc, resp
b8d0: 63 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20  code, respdata, 
b8e0: 26 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65  &tmp_respdata_le
b8f0: 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f  n);....if (pcsc_
b900: 67 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43  getresp_ret != C
b910: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
b920: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
b930: 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65  UG_PRINTF("Buffe
b940: 72 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20  r read failed!  
b950: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
b960: 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45  lure");...../* E
b970: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b980: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  nsaction */....c
b990: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b9a0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b9b0: 09 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73  .if (pcsc_getres
b9c0: 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  p_ret == CACKEY_
b9d0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
b9e0: 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
b9f0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b  Y_PCSC_E_RETRY);
ba00: 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
ba10: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
ba20: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
ba30: 69 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e  if (respdata_len
ba40: 29 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61  ) {....*respdata
ba50: 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70  _len += tmp_resp
ba60: 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09  data_len;...}...
ba70: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
ba80: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
ba90: 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
baa0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
bab0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bac0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
bad0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62  ng in success (b
bae0: 75 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c  uffer read compl
baf0: 65 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e  ete)");...return
bb00: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
bb10: 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20  K);..}.../* End 
bb20: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
bb30: 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79  ction */..cackey
bb40: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
bb50: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61  (slot);...if (ma
bb60: 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20  jor_rc == 0x90) 
bb70: 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a  {.../* Success *
bb80: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
bb90: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
bba0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d  ng in success (m
bbb0: 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22  ajor_rc = 0x90)"
bbc0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
bbd0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
bbe0: 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
bbf0: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
bc00: 52 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  Returned an erro
bc10: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
bc20: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74  failure");...ret
bc30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
bc40: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73  E_GENERIC);.}..s
bc50: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
bc60: 68 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  har *cackey_read
bc70: 5f 62 65 72 74 6c 76 5f 74 61 67 28 75 6e 73 69  _bertlv_tag(unsi
bc80: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bc90: 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75 66 66 65  r, size_t *buffe
bca0: 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65  r_len_p, unsigne
bcb0: 64 20 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69  d char tag, unsi
bcc0: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75  gned char *outbu
bcd0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75  ffer, size_t *ou
bce0: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b  tbuffer_len_p) {
bcf0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
bd00: 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65  *buffer_p;..size
bd10: 5f 74 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  _t outbuffer_len
bd20: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73  , buffer_len;..s
bd30: 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74  ize_t size;..int
bd40: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
bd50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
bd60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75  led.");...if (bu
bd70: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55  ffer_len_p == NU
bd80: 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
bd90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66  EBUG_PRINTF("buf
bda0: 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c  fer_len_p is NUL
bdb0: 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e  L.  Returning in
bdc0: 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09   failure.");....
bdd0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
bde0: 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72  ...if (outbuffer
bdf0: 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  _len_p == NULL) 
be00: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
be10: 5f 50 52 49 4e 54 46 28 22 6f 75 74 62 75 66 66  _PRINTF("outbuff
be20: 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c  er_len_p is NULL
be30: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
be40: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
be50: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
be60: 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a  ..buffer_len = *
be70: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b  outbuffer_len_p;
be80: 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 20  ..outbuffer_len 
be90: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
bea0: 5f 70 3b 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d  _p;...buffer_p =
beb0: 20 62 75 66 66 65 72 3b 0a 09 69 66 20 28 62 75   buffer;..if (bu
bec0: 66 66 65 72 5f 70 5b 30 5d 20 21 3d 20 74 61 67  ffer_p[0] != tag
bed0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
bee0: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 66  UG_PRINTF("Tag f
bef0: 6f 75 6e 64 20 77 61 73 20 6e 6f 74 20 74 61 67  ound was not tag
bf00: 20 65 78 70 65 63 74 65 64 2e 20 20 54 61 67 20   expected.  Tag 
bf10: 3d 20 25 30 32 78 2c 20 45 78 70 65 63 74 65 64  = %02x, Expected
bf20: 20 3d 20 25 30 32 78 2e 20 20 52 65 74 75 72 6e   = %02x.  Return
bf30: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22  ing in failure."
bf40: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
bf50: 20 62 75 66 66 65 72 5f 70 5b 30 5d 2c 20 74 61   buffer_p[0], ta
bf60: 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  g);....return(NU
bf70: 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72  LL);..}...buffer
bf80: 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65  _p++;..buffer_le
bf90: 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28 62 75 66 66  n--;...if ((buff
bfa0: 65 72 5f 70 5b 30 5d 20 26 20 30 78 38 30 29 20  er_p[0] & 0x80) 
bfb0: 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09 73 69 7a  == 0x80) {...siz
bfc0: 65 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d 20 28  e = 0;...idx = (
bfd0: 62 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78  buffer_p[0] & 0x
bfe0: 37 66 29 3b 0a 0a 09 09 69 66 20 28 69 64 78 20  7f);....if (idx 
bff0: 3e 20 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a  > buffer_len) {.
c000: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c010: 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65  PRINTF("Malforme
c020: 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e  d BER value -- n
c030: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
c040: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61  available to rea
c050: 64 20 6c 65 6e 67 74 68 20 28 69 64 78 20 3d 20  d length (idx = 
c060: 25 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d  %i, buffer_len =
c070: 20 25 6c 75 29 22 2c 20 69 64 78 2c 20 28 75 6e   %lu)", idx, (un
c080: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
c090: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 09 72 65  fer_len);.....re
c0a0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a  turn(NULL);...}.
c0b0: 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20  ...for (; idx > 
c0c0: 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62  0; idx--) {....b
c0d0: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 62 75  uffer_p++;....bu
c0e0: 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09  ffer_len--;.....
c0f0: 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73  size <<= 8;....s
c100: 69 7a 65 20 7c 3d 20 62 75 66 66 65 72 5f 70 5b  ize |= buffer_p[
c110: 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  0];...}..} else 
c120: 7b 0a 09 09 73 69 7a 65 20 3d 20 62 75 66 66 65  {...size = buffe
c130: 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66  r_p[0];..}...buf
c140: 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72  fer_p++;..buffer
c150: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 73 69  _len--;...if (si
c160: 7a 65 20 3e 20 6f 75 74 62 75 66 66 65 72 5f 6c  ze > outbuffer_l
c170: 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  en) {...CACKEY_D
c180: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
c190: 62 6c 65 20 74 6f 20 63 6f 70 79 20 76 61 6c 75  ble to copy valu
c1a0: 65 20 62 75 66 66 65 72 20 74 6f 20 6f 75 74 62  e buffer to outb
c1b0: 75 66 66 65 72 2c 20 6e 6f 74 20 65 6e 6f 75 67  uffer, not enoug
c1c0: 68 20 72 6f 6f 6d 2e 20 20 56 61 6c 75 65 20 62  h room.  Value b
c1d0: 75 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25  uffer length = %
c1e0: 6c 75 2c 20 6f 75 74 20 62 75 66 66 65 72 20 6c  lu, out buffer l
c1f0: 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75  ength = %lu", (u
c200: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
c210: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ze, (unsigned lo
c220: 6e 67 29 20 6f 75 74 62 75 66 66 65 72 5f 6c 65  ng) outbuffer_le
c230: 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  n);....return(NU
c240: 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75  LL);..}...*outbu
c250: 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a  ffer_len_p = siz
c260: 65 3b 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65  e;..if (outbuffe
c270: 72 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 75  r) {...memcpy(ou
c280: 74 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f  tbuffer, buffer_
c290: 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66  p, size);...buff
c2a0: 65 72 5f 70 20 2b 3d 20 73 69 7a 65 3b 0a 09 09  er_p += size;...
c2b0: 62 75 66 66 65 72 5f 6c 65 6e 20 2d 3d 20 73 69  buffer_len -= si
c2c0: 7a 65 3b 0a 0a 09 09 2a 62 75 66 66 65 72 5f 6c  ze;....*buffer_l
c2d0: 65 6e 5f 70 20 3d 20 62 75 66 66 65 72 5f 6c 65  en_p = buffer_le
c2e0: 6e 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  n;....CACKEY_DEB
c2f0: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52  UG_PRINTBUF("BER
c300: 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20  -TLV results:", 
c310: 6f 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 29  outbuffer, size)
c320: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  ;..} else {...me
c330: 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75  mmove(buffer, bu
c340: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09  ffer_p, size);..
c350: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66  .buffer_p = buff
c360: 65 72 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  er;....CACKEY_DE
c370: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 42 45  BUG_PRINTBUF("BE
c380: 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c  R-TLV results:",
c390: 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a   buffer, size);.
c3a0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
c3b0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
c3c0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2e 20  ing in success. 
c3d0: 20 53 69 7a 65 20 6f 66 20 63 6f 6e 74 65 6e 74   Size of content
c3e0: 73 20 66 6f 72 20 74 61 67 20 25 30 32 78 20 69  s for tag %02x i
c3f0: 73 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  s %lu", (unsigne
c400: 64 20 69 6e 74 29 20 74 61 67 2c 20 28 75 6e 73  d int) tag, (uns
c410: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
c420: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66  );...return(buff
c430: 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  er_p);.}../*. * 
c440: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
c450: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67  ssize_t cackey_g
c460: 65 74 5f 64 61 74 61 28 73 74 72 75 63 74 20 63  et_data(struct c
c470: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
c480: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c490: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
c4a0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69  buffer_len, unsi
c4b0: 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d  gned char oid[3]
c4c0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
c4d0: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
c4e0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
c4f0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
c500: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
c510: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
c520: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c530: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
c540: 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20    [OUT] Buffer. 
c550: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
c560: 62 75 66 66 65 72 5f 6c 65 6e 0a 20 2a 20 20 20  buffer_len. *   
c570: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
c580: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
c590: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
c5a0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
c5b0: 20 6f 69 64 5b 33 5d 0a 20 2a 20 20 20 20 20 20   oid[3]. *      
c5c0: 20 20 20 33 2d 62 79 74 65 20 4f 49 44 20 74 6f     3-byte OID to
c5d0: 20 72 65 61 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52   read. *. *. * R
c5e0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c5f0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
c600: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
c610: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
c620: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
c630: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
c640: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
c650: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
c660: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
c670: 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74  _get_data(struct
c680: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
c690: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
c6a0: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
c6b0: 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e  t buffer_len, un
c6c0: 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b  signed char oid[
c6d0: 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  3]) {..unsigned 
c6e0: 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20 7b 30 78  char cmd[] = {0x
c6f0: 35 43 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20  5C, 0x03, 0x00, 
c700: 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 09 75 6e  0x00, 0x00};..un
c710: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c720: 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69  fer_p;..size_t i
c730: 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20  nit_buffer_len, 
c740: 73 69 7a 65 3b 0a 09 75 69 6e 74 31 36 5f 74 20  size;..uint16_t 
c750: 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73  respcode;..int s
c760: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
c770: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c780: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69  Called.");...ini
c790: 74 5f 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 62  t_buffer_len = b
c7a0: 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64  uffer_len;...cmd
c7b0: 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63  [2] = oid[0];..c
c7c0: 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a  md[3] = oid[1];.
c7d0: 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d  .cmd[4] = oid[2]
c7e0: 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e  ;.../* 256 to in
c7f0: 64 69 63 61 74 65 20 74 68 65 20 6c 61 72 67 65  dicate the large
c800: 73 74 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20  st message size 
c810: 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20 69 66 20  -- not clear if 
c820: 74 68 69 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77  this will work w
c830: 69 74 68 20 61 6c 6c 20 6d 65 73 73 61 67 65 73  ith all messages
c840: 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
c850: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
c860: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
c870: 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54  SS_ISO7816, NIST
c880: 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
c890: 5f 47 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c  _GET_DATA, 0x3F,
c8a0: 20 30 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d   0xFF, sizeof(cm
c8b0: 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c 20 26 72  d), cmd, 256, &r
c8c0: 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 2c  espcode, buffer,
c8d0: 20 26 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a   &buffer_len);..
c8e0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
c8f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
c900: 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ETRY) {...CACKEY
c910: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
c920: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
c930: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61  ed, retrying rea
c940: 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72  d buffer");....r
c950: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74  eturn(cackey_get
c960: 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66  _data(slot, buff
c970: 65 72 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 5f  er, init_buffer_
c980: 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a  len, oid));..}..
c990: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
c9a0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
c9b0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
c9c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
c9d0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66  ey_send_apdu() f
c9e0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
c9f0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
ca00: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
ca10: 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
ca20: 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
ca30: 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
ca40: 41 58 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c  AX..if (buffer_l
ca50: 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  en > _POSIX_SSIZ
ca60: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
ca70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ca80: 52 65 61 64 20 62 79 74 65 73 20 28 62 75 66 66  Read bytes (buff
ca90: 65 72 5f 6c 65 6e 29 20 65 78 63 65 65 64 73 20  er_len) exceeds 
caa0: 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
cab0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
cac0: 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
cad0: 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c   buffer_len = %l
cae0: 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53  u)", (long) _POS
caf0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75  IX_SSIZE_MAX, (u
cb00: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
cb10: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65  ffer_len);....re
cb20: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
cb30: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69  endif.#endif...i
cb40: 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20  f (buffer_len < 
cb50: 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  2) {...CACKEY_DE
cb60: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55  BUG_PRINTF("APDU
cb70: 20 47 45 54 20 44 41 54 41 20 72 65 74 75 72 6e   GET DATA return
cb80: 65 64 20 25 6c 75 20 62 79 74 65 73 2c 20 77 68  ed %lu bytes, wh
cb90: 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74  ich is too short
cba0: 20 66 6f 72 20 61 20 42 45 52 2d 54 4c 56 20 72   for a BER-TLV r
cbb0: 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67  esponse", (unsig
cbc0: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
cbd0: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
cbe0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20  (-1);..}...size 
cbf0: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 62  = buffer_len;..b
cc00: 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
cc10: 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
cc20: 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
cc30: 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e 55 4c 4c  _len, 0x53, NULL
cc40: 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28  , &size);...if (
cc50: 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c  buffer_p == NULL
cc60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cc70: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 64  UG_PRINTF("Tag d
cc80: 65 63 6f 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  ecoding failed, 
cc90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
cca0: 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  or.");....return
ccb0: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  (-1);..}...CACKE
ccc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
ccd0: 28 22 47 45 54 20 44 41 54 41 20 72 65 73 75 6c  ("GET DATA resul
cce0: 74 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  t", buffer, size
ccf0: 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
cd00: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
cd10: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
cd20: 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c  read %lu bytes",
cd30: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cd40: 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e   size);...return
cd50: 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (size);.}../*. *
cd60: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
cd70: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
cd80: 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75  read_buffer(stru
cd90: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cda0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
cdb0: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
cdc0: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
cdd0: 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c  ned char t_or_v,
cde0: 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f   size_t initial_
cdf0: 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41  offset);. *. * A
ce00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
ce10: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
ce20: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
ce30: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
ce40: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
ce50: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
ce60: 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20  char *buffer. * 
ce70: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75          [OUT] Bu
ce80: 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ffer. *. *     s
ce90: 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20  ize_t count. *  
cea0: 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66         Number of
ceb0: 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70   bytes to attemp
cec0: 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20  t to read. *. * 
ced0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
cee0: 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20  r t_or_v. *     
cef0: 20 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54      Select the T
cf00: 2d 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20  -buffer (01) or 
cf10: 56 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f  V-buffer (02) to
cf20: 20 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a   read from.  . *
cf30: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69  . *     size_t i
cf40: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a  nitial_offset. *
cf50: 20 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79           Specify
cf60: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62   the offset to b
cf70: 65 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72  egin the read fr
cf80: 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55  om. *. *. * RETU
cf90: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
cfa0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
cfb0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
cfc0: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
cfd0: 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f  ly read, or -1 o
cfe0: 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e  n error.. *. * N
cff0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  OTES. *     None
d000: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
d010: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65  size_t cackey_re
d020: 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74  ad_buffer(struct
d030: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d040: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
d050: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
d060: 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65  t count, unsigne
d070: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73  d char t_or_v, s
d080: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
d090: 66 73 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65  fset) {..unsigne
d0a0: 64 20 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66  d char *init_buf
d0b0: 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  fer;..size_t ini
d0c0: 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74  t_count;..size_t
d0d0: 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66   init_initial_of
d0e0: 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f  fset;...size_t o
d0f0: 66 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f  ffset = 0, max_o
d100: 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74  ffset, max_count
d110: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
d120: 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36   cmd[2];..uint16
d130: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
d140: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
d150: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d160: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
d170: 69 6e 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75  init_buffer = bu
d180: 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e  ffer;..init_coun
d190: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74  t = count;..init
d1a0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20  _initial_offset 
d1b0: 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  = initial_offset
d1c0: 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d  ;...max_offset =
d1d0: 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75   count;..max_cou
d1e0: 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  nt = CACKEY_APDU
d1f0: 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72  _MTU;...if (t_or
d200: 5f 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f  _v != 1 && t_or_
d210: 76 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b  v != 2) {...CACK
d220: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d230: 22 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20  "Invalid T or V 
d240: 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
d250: 69 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ied, returning i
d260: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
d270: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
d280: 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76  .cmd[0] = t_or_v
d290: 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a  ;...while (1) {.
d2a0: 09 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20  ..if (offset >= 
d2b0: 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09  max_offset) {...
d2c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d2d0: 49 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f  INTF("Buffer too
d2e0: 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e   small, returnin
d2f0: 67 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e  g what we got...
d300: 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  ");.....break;..
d310: 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61  .}....count = ma
d320: 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65  x_offset - offse
d330: 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e  t;...if (count >
d340: 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09   max_count) {...
d350: 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75  .count = max_cou
d360: 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31  nt;...}....cmd[1
d370: 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65  ] = count;....se
d380: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
d390: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
d3a0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42  GSCIS_CLASS_GLOB
d3b0: 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43  AL_PLATFORM, GSC
d3c0: 49 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55  IS_INSTR_READ_BU
d3d0: 46 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f  FFER, ((initial_
d3e0: 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29  offset + offset)
d3f0: 20 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28   >> 8) & 0xff, (
d400: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b  initial_offset +
d410: 20 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c   offset) & 0xff,
d420: 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d   sizeof(cmd), cm
d430: 64 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f  d, 0x00, &respco
d440: 64 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66  de, buffer + off
d450: 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09  set, &count);...
d460: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
d470: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
d480: 45 54 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45  ETRY) {....CACKE
d490: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d4a0: 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69  ADPU Sending fai
d4b0: 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65  led, retrying re
d4c0: 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09  ad buffer");....
d4d0: 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72  .return(cackey_r
d4e0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
d4f0: 20 69 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e   init_buffer, in
d500: 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76  it_count, t_or_v
d510: 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f  , init_initial_o
d520: 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09  ffset));...}....
d530: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
d540: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
d550: 29 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63  ) {....if (respc
d560: 6f 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b  ode == 0x6A86) {
d570: 0a 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75  .....if (max_cou
d580: 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09  nt == 1) {......
d590: 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
d5a0: 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61  ..max_count = ma
d5b0: 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09  x_count / 2;....
d5c0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
d5d0: 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
d5e0: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
d5f0: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
d600: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
d610: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
d620: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
d630: 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f  ....offset += co
d640: 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e  unt;....if (coun
d650: 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t < max_count) {
d660: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d670: 5f 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72  _PRINTF("Short r
d680: 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25  ead -- count = %
d690: 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c  i, cmd[1] = %i",
d6a0: 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69   (int) count, (i
d6b0: 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09  nt) cmd[1]);....
d6c0: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
d6d0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
d6e0: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
d6f0: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d700: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
d710: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
d720: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d730: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
d740: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
d750: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
d760: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
d770: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
d780: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
d790: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
d7a0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
d7b0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
d7c0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
d7d0: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
d7e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d7f0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
d800: 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20  n success, read 
d810: 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73  %lu bytes", (uns
d820: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73  igned long) offs
d830: 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66  et);...return(of
d840: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  fset);.}../*. * 
d850: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
d860: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
d870: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
d880: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d890: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
d8a0: 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69  ed char *aid, si
d8b0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20  ze_t aid_len);. 
d8c0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
d8d0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
d8e0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
d8f0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
d900: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
d910: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
d920: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a  igned char *aid.
d930: 20 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65   *         Buffe
d940: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70  r containing App
d950: 6c 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74  let ID to select
d960: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
d970: 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20  t aid_len. *    
d980: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
d990: 79 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64  ytes in the "aid
d9a0: 22 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61  " (Applet ID) pa
d9b0: 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45  rameter. *. * RE
d9c0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
d9d0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
d9e0: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
d9f0: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
da00: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
da10: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
da20: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
da30: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
da40: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
da50: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
da60: 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b  plet(struct cack
da70: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
da80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69  nsigned char *ai
da90: 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65  d, size_t aid_le
daa0: 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  n) {..int send_r
dab0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
dac0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
dad0: 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
dae0: 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53  EBUG_PRINTBUF("S
daf0: 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a  electing applet:
db00: 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29  ", aid, aid_len)
db10: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
db20: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
db30: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
db40: 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53  S_ISO7816, GSCIS
db50: 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47  _INSTR_SELECT, G
db60: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
db70: 54 5f 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20  T_APPLET, 0x00, 
db80: 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78  aid_len, aid, 0x
db90: 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  00, NULL, NULL, 
dba0: 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e  NULL);...if (sen
dbb0: 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  d_ret == CACKEY_
dbc0: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a  PCSC_E_RETRY) {.
dbd0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dbe0: 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
dbf0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72  ing failed, retr
dc00: 79 69 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c  ying select appl
dc10: 65 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  et");....return(
dc20: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70  cackey_select_ap
dc30: 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20  plet(slot, aid, 
dc40: 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09  aid_len));..}...
dc50: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
dc60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
dc70: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
dc80: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
dc90: 64 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74  d to open applet
dca0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
dcb0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
dcc0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
dcd0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
dce0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dcf0: 49 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c  INTF("Successful
dd00: 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65  ly selected file
dd10: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
dd20: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
dd30: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
dd40: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
dd50: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
dd60: 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61  t_file(struct ca
dd70: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
dd80: 20 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20   uint16_t ef);. 
dd90: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
dda0: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
ddb0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
ddc0: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
ddd0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
dde0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e  to. *. *     uin
ddf0: 74 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20  t16_t ef. *     
de00: 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69      Elemental Fi
de10: 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  le to select. *.
de20: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
de30: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
de40: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
de50: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
de60: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
de70: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
de80: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
de90: 20 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65   *     This sele
dea0: 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72  cts an Elementar
deb0: 79 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65  y File (EF) unde
dec0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  r the currently 
ded0: 73 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20  selected. *     
dee0: 44 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28  Dedicated File (
def0: 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79  DF). *. *     Ty
df00: 70 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20  pically this is 
df10: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c  called after sel
df20: 65 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65  ecting the corre
df30: 63 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67  ct Applet (using
df40: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
df50: 65 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f  elect_applet) fo
df60: 72 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a  r VM cards. *. *
df70: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
df80: 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  ret cackey_selec
df90: 74 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61  t_file(struct ca
dfa0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
dfb0: 20 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a   uint16_t ef) {.
dfc0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66  .unsigned char f
dfd0: 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20  id_buf[2];..int 
dfe0: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
dff0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e000: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a  "Called.");.../*
e010: 20 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e   Open the elemen
e020: 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69  tary file */..fi
e030: 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e  d_buf[0] = (ef >
e040: 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69  > 8) & 0xff;..fi
e050: 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20  d_buf[1] = ef & 
e060: 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
e070: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
e080: 65 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34  ecting file: %04
e090: 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lx", (unsigned l
e0a0: 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64  ong) ef);...send
e0b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
e0c0: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
e0d0: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
e0e0: 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  6, GSCIS_INSTR_S
e0f0: 45 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30  ELECT, 0x02, 0x0
e100: 43 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75  C, sizeof(fid_bu
e110: 66 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30  f), fid_buf, 0x0
e120: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
e130: 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  ULL);..if (send_
e140: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
e150: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
e160: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e170: 28 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  ("Failed to open
e180: 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67   file, returning
e190: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e1a0: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
e1b0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
e1c0: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
e1d0: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65  UG_PRINTF("Succe
e1e0: 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64  ssfully selected
e1f0: 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72   file");...retur
e200: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
e210: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
e220: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
e230: 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74  id cackey_free_t
e240: 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  lv(struct cackey
e250: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f  _tlv_entity *roo
e260: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
e270: 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63  NTS. *     struc
e280: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
e290: 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20  ity *root. *    
e2a0: 20 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65       Root of the
e2b0: 20 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61   TLV list to sta
e2c0: 72 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a  rt freeing. *. *
e2d0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
e2e0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
e2f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
e300: 73 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73  s function frees
e310: 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20   the TLV linked 
e320: 6c 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20  listed returned 
e330: 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63  from. *     "cac
e340: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a  key_read_tlv". *
e350: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
e360: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
e370: 28 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 72 6f 6f 74 29  lv_entity *root)
e390: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
e3a0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
e3b0: 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20  rr, *next;...if 
e3c0: 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (root == NULL) {
e3d0: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
e3e0: 66 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74  for (curr = root
e3f0: 3b 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e  ; curr; curr = n
e400: 65 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20  ext) {...next = 
e410: 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09  curr->_next;....
e420: 73 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61  switch (curr->ta
e430: 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43  g) {....case GSC
e440: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
e450: 3a 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  :....case GSCIS_
e460: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
e470: 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76  .....if (curr->v
e480: 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
e490: 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a  e(curr->value);.
e4a0: 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
e4b0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e4c0: 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09  AG_CARDURL:.....
e4d0: 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  if (curr->value_
e4e0: 63 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09  cardurl) {......
e4f0: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
e500: 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d  _cardurl);.....}
e510: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
e520: 0a 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09  ...free(curr);..
e530: 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }...return;.}../
e540: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
e550: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
e560: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
e570: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
e580: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
e590: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
e5a0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
e5b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
e5c0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e5d0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76  *cackey_read_tlv
e5e0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
e5f0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74  lot *slot) {..st
e600: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e610: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74  entity *curr_ent
e620: 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c  ity, *root = NUL
e630: 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b  L, *last = NULL;
e640: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e650: 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61  tlen_buf[2], tva
e660: 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76  l_buf[1024], *tv
e670: 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  al;..unsigned ch
e680: 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar vlen_buf[2], 
e690: 76 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20  vval_buf[8192], 
e6a0: 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *vval;..unsigned
e6b0: 20 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09   char *tmpbuf;..
e6c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d  unsigned long tm
e6d0: 70 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f  pbuflen;..ssize_
e6e0: 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73  t tlen, vlen;..s
e6f0: 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b  size_t read_ret;
e700: 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f  ..size_t offset_
e710: 74 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20  t = 0, offset_v 
e720: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  = 0;..unsigned c
e730: 68 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  har tag;..size_t
e740: 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20   length;.#ifdef 
e750: 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75  HAVE_LIBZ..int u
e760: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23  ncompress_ret;.#
e770: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
e780: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
e790: 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72  led.");...read_r
e7a0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
e7b0: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c  _buffer(slot, tl
e7c0: 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74  en_buf, sizeof(t
e7d0: 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66  len_buf), 1, off
e7e0: 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61  set_t);..if (rea
e7f0: 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28  d_ret != sizeof(
e800: 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43  tlen_buf)) {...C
e810: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e820: 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c  TF("Read failed,
e830: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
e840: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
e850: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  rn(NULL);..}...t
e860: 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b  len = (tlen_buf[
e870: 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f  1] << 8) | tlen_
e880: 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72  buf[0];...read_r
e890: 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  et = cackey_read
e8a0: 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c  _buffer(slot, vl
e8b0: 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76  en_buf, sizeof(v
e8c0: 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66  len_buf), 2, off
e8d0: 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61  set_v);..if (rea
e8e0: 64 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28  d_ret != sizeof(
e8f0: 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43  vlen_buf)) {...C
e900: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e910: 54 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c  TF("Read failed,
e920: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
e930: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
e940: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76  rn(NULL);..}...v
e950: 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b  len = (vlen_buf[
e960: 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f  1] << 8) | vlen_
e970: 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59  buf[0];...CACKEY
e980: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
e990: 61 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c  ag Length = %lu,
e9a0: 20 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20   Value Length = 
e9b0: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
e9c0: 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73  long) tlen, (uns
e9d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e  igned long) vlen
e9e0: 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d  );...offset_t +=
e9f0: 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d   2;..offset_v +=
ea00: 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e   2;...if (tlen >
ea10: 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66   sizeof(tval_buf
ea20: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
ea30: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20  BUG_PRINTF("Tag 
ea40: 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61  length is too la
ea50: 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  rge, returning i
ea60: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
ea70: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
ea80: 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69  ...if (vlen > si
ea90: 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20  zeof(vval_buf)) 
eaa0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
eab0: 5f 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c  _PRINTF("Value l
eac0: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
ead0: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
eae0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
eaf0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
eb00: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
eb10: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
eb20: 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20  slot, tval_buf, 
eb30: 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f  tlen, 1, offset_
eb40: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
eb50: 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43  t != tlen) {...C
eb60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eb70: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
eb80: 61 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66  ad entire T-buff
eb90: 65 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  er, returning in
eba0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
ebb0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
ebc0: 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
ebd0: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
ebe0: 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20  slot, vval_buf, 
ebf0: 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f  vlen, 2, offset_
ec00: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
ec10: 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43  t != vlen) {...C
ec20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ec30: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
ec40: 61 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66  ad entire V-buff
ec50: 65 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  er, returning in
ec60: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
ec70: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
ec80: 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75  ..tval = tval_bu
ec90: 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f  f;..vval = vval_
eca0: 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65  buf;..while (tle
ecb0: 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20  n > 0 && vlen > 
ecc0: 30 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76  0) {...tag = *tv
ecd0: 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  al;...tval++;...
ece0: 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a  tlen--;....if (*
ecf0: 74 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a  tval == 0xff) {.
ed00: 09 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61  ...length = (tva
ed10: 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61  l[2] << 8) | tva
ed20: 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d  l[1];....tval +=
ed30: 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33   3;....tlen -= 3
ed40: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
ed50: 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a  length = *tval;.
ed60: 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c  ...tval++;....tl
ed70: 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  en--;...}....CAC
ed80: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ed90: 28 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29  ("Tag: %s (%02x)
eda0: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
edb0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
edc0: 74 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  tag), (unsigned 
edd0: 69 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43  int) tag);...CAC
ede0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
edf0: 55 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61  UF("Value:", vva
ee00: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63  l, length);....c
ee10: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c  urr_entity = NUL
ee20: 4c 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67  L;...switch (tag
ee30: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ) {....case GSCI
ee40: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
ee50: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
ee60: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
ee70: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
ee80: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ee90: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20  value_cardurl = 
eea0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
eeb0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
eec0: 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09  e_cardurl));....
eed0: 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e  ..memcpy(curr_en
eee0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
eef0: 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20  url->rid, vval, 
ef00: 35 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  5);.....curr_ent
ef10: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
ef20: 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76  rl->apptype = vv
ef30: 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[5];.....curr_
ef40: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
ef50: 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20  rdurl->objectid 
ef60: 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29  = (vval[6] << 8)
ef70: 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09   | vval[7];.....
ef80: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
ef90: 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
efa0: 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20  d = (vval[8] << 
efb0: 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09  8) | vval[9];...
efc0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
efd0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
efe0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
eff0: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
f000: 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53  reak;....case GS
f010: 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c  CIS_TAG_ACR_TABL
f020: 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  E:.....curr_enti
f030: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
f040: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
f050: 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  );.....tmpbuf = 
f060: 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a  malloc(length);.
f070: 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62  .....memcpy(tmpb
f080: 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68  uf, vval, length
f090: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
f0a0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f0b0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f0c0: 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  >length = length
f0d0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f0e0: 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75  y->value = tmpbu
f0f0: 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f;.....curr_enti
f100: 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c  ty->_next = NULL
f110: 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
f120: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
f130: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
f140: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
f150: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
f160: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69  rr_entity));..#i
f170: 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09  fdef HAVE_LIBZ..
f180: 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c  ...tmpbuflen = l
f190: 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74  ength * 2;.....t
f1a0: 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74  mpbuf = malloc(t
f1b0: 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  mpbuflen);......
f1c0: 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d  uncompress_ret =
f1d0: 20 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62   uncompress(tmpb
f1e0: 75 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20  uf, &tmpbuflen, 
f1f0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09  vval, length);..
f200: 09 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73  ...if (uncompres
f210: 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b  s_ret != Z_OK) {
f220: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
f230: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
f240: 64 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c  d to decompress,
f250: 20 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65   uncompress() re
f260: 74 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73  turned %i -- res
f270: 6f 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74  orting to direct
f280: 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65   copy", uncompre
f290: 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74  ss_ret);.......t
f2a0: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
f2b0: 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74  h;......memcpy(t
f2c0: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
f2d0: 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  gth);.....}.....
f2e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f2f0: 49 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65  INTBUF("Decompre
f300: 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75  ssed to:", tmpbu
f310: 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23  f, tmpbuflen);.#
f320: 65 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f  else.....CACKEY_
f330: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69  DEBUG_PRINTF("Mi
f340: 73 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f  ssing ZLIB Suppo
f350: 72 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69  rt, this certifi
f360: 63 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75  cate is likely u
f370: 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09  seless...");....
f380: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
f390: 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79  ngth;.....memcpy
f3a0: 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c  (tmpbuf, vval, l
f3b0: 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a  ength);.#endif..
f3c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f3d0: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
f3e0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
f3f0: 67 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b  gth = tmpbuflen;
f400: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f410: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
f420: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f430: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
f440: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
f450: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50  case GSCIS_TAG_P
f460: 4b 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f  KCS15:.....curr_
f470: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
f480: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
f490: 69 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72  ity));......curr
f4a0: 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74  _entity->tag = t
f4b0: 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  ag;.....curr_ent
f4c0: 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20  ity->value_byte 
f4d0: 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63  = vval[0];.....c
f4e0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78  urr_entity->_nex
f4f0: 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62  t = NULL;......b
f500: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61  reak;...}....vva
f510: 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76  l += length;...v
f520: 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a  len -= length;..
f530: 09 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74  ..if (curr_entit
f540: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  y != NULL) {....
f550: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
f560: 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63  ) {.....root = c
f570: 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d  urr_entity;....}
f580: 0a 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d  .....if (last !=
f590: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73   NULL) {.....las
f5a0: 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f  t->_next = curr_
f5b0: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
f5c0: 09 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74  .last = curr_ent
f5d0: 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  ity;...}..}...re
f5e0: 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f  turn(root);.}../
f5f0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
f600: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
f610: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
f620: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
f630: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
f640: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
f650: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
f660: 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b  static void cack
f670: 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74  ey_free_certs(st
f680: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f690: 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74  _identity *start
f6a0: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
f6b0: 69 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20  int free_start) 
f6c0: 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a  {..size_t idx;..
f6d0: 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55  .if (start == NU
f6e0: 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a  LL) {...return;.
f6f0: 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
f700: 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20  0; idx < count; 
f710: 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73  idx++) {...if (s
f720: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
f730: 69 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65  icate) {....free
f740: 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74  (start[idx].cert
f750: 69 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d  ificate);...}..}
f760: 0a 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72  ...if (free_star
f770: 74 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72  t) {...free(star
f780: 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b  t);..}...return;
f790: 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  .}..static struc
f7a0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
f7b0: 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63  entity *cackey_c
f7c0: 6f 70 79 5f 63 65 72 74 73 28 73 74 72 75 63 74  opy_certs(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 64 65 73 74 2c 20 73 74 72  ntity *dest, str
f7f0: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
f800: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
f810: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b   size_t count) {
f820: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
f830: 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c  if (start == NUL
f840: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55  L) {...return(NU
f850: 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65  LL);..}...if (de
f860: 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
f870: 64 65 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  dest = malloc(si
f880: 7a 65 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f  zeof(*dest) * co
f890: 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  unt);..}...for (
f8a0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
f8b0: 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
f8c0: 09 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79  .dest[idx].id_ty
f8d0: 70 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  pe = start[idx].
f8e0: 69 64 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74  id_type;....swit
f8f0: 63 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64  ch (dest[idx].id
f900: 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
f910: 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
f920: 43 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28  CAC:.....memcpy(
f930: 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  dest[idx].card.c
f940: 61 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74  ac.applet, start
f950: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
f960: 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65  pplet, sizeof(de
f970: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
f980: 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64  .applet));.....d
f990: 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  est[idx].card.ca
f9a0: 63 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69  c.file = start[i
f9b0: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c  dx].card.cac.fil
f9c0: 65 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  e;.....break;...
f9d0: 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
f9e0: 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65  TYPE_PIV:.....de
f9f0: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76  st[idx].card.piv
fa00: 2e 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b  .key_id = start[
fa10: 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65  idx].card.piv.ke
fa20: 79 5f 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79  y_id;.....memcpy
fa30: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
fa40: 70 69 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74  piv.label, start
fa50: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
fa60: 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73  abel, sizeof(des
fa70: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
fa80: 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65  label));.....bre
fa90: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
faa0: 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
fab0: 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ONLY:.....break;
fac0: 0a 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d  ...}...dest[idx]
fad0: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fae0: 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65   = start[idx].ce
faf0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
fb00: 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69  .dest[idx].keysi
fb10: 7a 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  ze = start[idx].
fb20: 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74  keysize;....dest
fb30: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
fb40: 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b  e = malloc(dest[
fb50: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fb60: 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28  _len);...memcpy(
fb70: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
fb80: 69 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78  icate, start[idx
fb90: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64  ].certificate, d
fba0: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fbb0: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  cate_len);..}...
fbc0: 72 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a  return(dest);.}.
fbd0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
fbe0: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
fbf0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
fc00: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
fc10: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
fc20: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
fc30: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
fc40: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
fc50: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
fc60: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
fc70: 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  d_certs(struct c
fc80: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
fc90: 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
fca0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fcb0: 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  erts, unsigned l
fcc0: 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73  ong *count) {..s
fcd0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
fce0: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72  c_identity *curr
fcf0: 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  _id;..struct cac
fd00: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
fd10: 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75  ccc_tlv, *ccc_cu
fd20: 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61  rr, *app_tlv, *a
fd30: 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e  pp_curr;..unsign
fd40: 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b  ed char ccc_aid[
fd50: 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43  ] = {GSCIS_AID_C
fd60: 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d  CC}, piv_aid[] =
fd70: 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
fd80: 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69  _PIV_AID};..unsi
fd90: 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f 6f  gned char *piv_o
fda0: 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 61  id, piv_oid_piva
fdb0: 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  uth[] = {NISTSP8
fdc0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41  00_73_3_OID_PIVA
fdd0: 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69  UTH}, piv_oid_si
fde0: 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53  gnature[] = {NIS
fdf0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
fe00: 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f  SIGNATURE}, piv_
fe10: 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b  oid_keymgt[] = {
fe20: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
fe30: 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73  ID_KEYMGT};..uns
fe40: 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f  igned char curr_
fe50: 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65  aid[7];..unsigne
fe60: 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38 31  d char buffer[81
fe70: 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f 70 3b 0a  92], *buffer_p;.
fe80: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f  .unsigned long o
fe90: 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72  utidx = 0;..char
fea0: 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61   *piv_label;..ca
feb0: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
fec0: 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65  tion_ret;..ssize
fed0: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
fee0: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 3b  ze_t buffer_len;
fef0: 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69  ..int certs_resi
ff00: 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64  zable;..int send
ff10: 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74  _ret, select_ret
ff20: 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20  ;..int piv_key, 
ff30: 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64  piv = 0;..int id
ff40: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
ff50: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
ff60: 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74  .");...if (count
ff70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
ff80: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ff90: 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  F("count is NULL
ffa0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ffb0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
ffc0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
ffd0: 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c  if (certs != NUL
ffe0: 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e  L) {...if (*coun
fff0: 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t == 0) {....CAC
10000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10010 28 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72  ("Requested we r
10020 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c  eturn 0 objects,
10030 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29   short-circuit")
10040 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72  ;.....return(cer
10050 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  ts);...}..}...if
10060 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65   (!slot->slot_re
10070 73 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f  set) {...if (slo
10080 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29  t->cached_certs)
10090 20 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20   {....if (certs 
100a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63  == NULL) {.....c
100b0 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
100c0 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73  zeof(*certs) * s
100d0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
100e0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63  s_count);.....*c
100f0 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
10100 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
10110 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
10120 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
10130 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10140 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
10150 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
10160 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
10170 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
10180 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
10190 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
101a0 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
101b0 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
101c0 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
101d0 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
101e0 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
101f0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
10200 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
10210 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
10220 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
10230 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
10240 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
10250 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
10260 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
10270 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
10280 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
10290 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
102a0 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
102b0 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
102c0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
102d0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
102e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
102f0 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
10300 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
10310 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10320 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
10330 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
10340 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
10350 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10360 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
10370 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
10380 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
10390 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
103a0 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
103b0 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
103c0 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
103d0 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
103e0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
103f0 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
10400 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
10410 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
10420 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
10430 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
10440 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
10450 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
10460 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10470 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10480 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
10490 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
104a0 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
104b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
104c0 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
104d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
104e0 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
104f0 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
10500 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
10510 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
10520 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
10530 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
10540 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10550 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
10560 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c  lect CCC Applet,
10570 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10580 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
10590 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
105a0 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
105b0 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
105c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
105d0 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  t);.....return(N
105e0 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ULL);...}..}...i
105f0 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20  f (piv) {...for 
10600 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
10610 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73  3; idx++) {....s
10620 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09  witch (idx) {...
10630 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70  ..case 0:......p
10640 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
10650 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70  _pivauth;......p
10660 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
10670 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
10680 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61  UTH;......piv_la
10690 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63  bel = "Authentic
106a0 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65  ation";......bre
106b0 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a  ak;.....case 1:.
106c0 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
106d0 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
106e0 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
106f0 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
10700 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09  KEY_SIGNATURE;..
10710 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20  ....piv_label = 
10720 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09  "Signature";....
10730 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
10740 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 2:......piv_oi
10750 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  d = piv_oid_keym
10760 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  gt;......piv_key
10770 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
10780 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09  3_KEY_KEYMGT;...
10790 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
107a0 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b  Key Management";
107b0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
107c0 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d  }.....read_ret =
107d0 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
107e0 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73  (slot, buffer, s
107f0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70  izeof(buffer), p
10800 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20  iv_oid);.....if 
10810 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
10820 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
10830 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64  ...}.....curr_id
10840 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78   = &certs[outidx
10850 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ];....outidx++;.
10860 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
10870 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75  size = -1;....cu
10880 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d  rr_id->id_type =
10890 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
108a0 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  PIV;....curr_id-
108b0 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
108c0 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d   = piv_key;....m
108d0 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
108e0 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70  ard.piv.label, p
108f0 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e  iv_label, strlen
10900 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29  (piv_label) + 1)
10910 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
10920 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10930 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75   read_ret;....cu
10940 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10950 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
10960 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10970 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65  _len);.....buffe
10980 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
10990 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65  uffer);....buffe
109a0 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
109b0 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
109c0 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
109d0 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d  , 0x70, curr_id-
109e0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63  >certificate, &c
109f0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10a00 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66  ate_len);.....if
10a10 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
10a20 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
10a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10a40 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61  eading certifica
10a50 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20  te from BER-TLV 
10a60 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c  response failed,
10a70 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69   skipping key %i
10a80 22 2c 20 69 64 78 29 3b 0a 09 09 09 09 66 72 65  ", idx);.....fre
10a90 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  e(curr_id->certi
10aa0 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 6f 75  ficate);......ou
10ab0 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e  tidx--;......con
10ac0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a  tinue;....}...}.
10ad0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
10ae0 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
10af0 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
10b00 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
10b10 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
10b20 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
10b30 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
10b40 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
10b50 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
10b60 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
10b70 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
10b80 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
10b90 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
10ba0 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
10bb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10bc0 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
10bd0 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
10be0 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
10bf0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
10c00 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
10c10 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
10c20 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
10c30 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10c40 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
10c50 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
10c60 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
10c70 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
10c80 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10c90 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
10ca0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10cb0 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
10cc0 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
10cd0 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
10ce0 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
10cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10d00 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
10d10 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
10d20 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
10d30 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
10d40 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
10d50 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
10d60 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
10d70 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
10d80 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10d90 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
10da0 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
10db0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10dc0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
10dd0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10de0 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
10df0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
10e00 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
10e10 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10e20 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
10e30 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10e40 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
10e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10e60 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
10e70 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
10e80 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
10e90 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
10ea0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10eb0 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
10ec0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
10ed0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
10ee0 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
10ef0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
10f00 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
10f10 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
10f20 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
10f30 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
10f40 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
10f50 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
10f60 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
10f70 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10f80 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
10f90 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
10fa0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10fb0 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
10fc0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
10fd0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10fe0 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
10ff0 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
11000 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
11010 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
11020 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
11030 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
11040 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
11050 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
11060 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
11070 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
11080 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
11090 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
110a0 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
110b0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
110c0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
110d0 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
110e0 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
110f0 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
11100 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
11110 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
11120 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
11130 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
11140 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
11150 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11160 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11170 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11180 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
11190 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
111a0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
111b0 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
111c0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
111d0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
111e0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
111f0 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
11200 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
11210 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
11220 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11230 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
11240 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
11250 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11260 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11270 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11280 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
11290 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
112a0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
112b0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
112c0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
112d0 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
112e0 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
112f0 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
11300 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
11310 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
11320 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
11330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11340 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
11350 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11360 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
11370 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
11380 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
11390 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
113a0 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
113b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
113c0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
113d0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
113e0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
113f0 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
11400 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11410 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
11420 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11430 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
11440 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  +;......curr_id-
11450 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45  >id_type = CACKE
11460 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09  Y_ID_TYPE_CAC;..
11470 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
11480 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11490 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  et, curr_aid, si
114a0 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
114b0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
114c0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  .....curr_id->ca
114d0 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63  rd.cac.file = cc
114e0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
114f0 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
11500 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
11510 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
11520 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11530 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
11540 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11550 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68  applet (%p) with
11560 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75   %lu bytes:", cu
11570 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11580 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65  applet, (unsigne
11590 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63  d long) sizeof(c
115a0 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
115b0 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43  .applet));.....C
115c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
115d0 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
115e0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
115f0 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
11600 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11610 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63  applet));......c
11620 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11630 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
11640 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
11650 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11660 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
11670 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11680 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
11690 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
116a0 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
116b0 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
116c0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
116d0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
116e0 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
116f0 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72  ) {......if (cer
11700 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
11710 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
11720 32 3b 0a 09 09 09 09 09 09 63 65 72 74 73 20 3d  2;.......certs =
11730 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
11740 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
11750 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09   (*count));.....
11760 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
11770 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
11780 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
11790 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
117a0 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _tlv);.....if (o
117b0 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
117c0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
117d0 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
117e0 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
117f0 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20  v);..}...*count 
11800 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
11810 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
11820 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61   {...certs = rea
11830 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
11840 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
11850 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ount));..}...slo
11860 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20  t->cached_certs 
11870 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65  = cackey_copy_ce
11880 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c  rts(NULL, certs,
11890 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d   *count);..slot-
118a0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
118b0 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09  unt = *count;...
118c0 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
118d0 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
118e0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
118f0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
11900 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65  ot);...return(ce
11910 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rts);.}../*. * S
11920 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
11930 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
11940 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
11950 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
11960 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
11970 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
11980 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
11990 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
119a0 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75  signdecrypt(stru
119b0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
119c0 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
119d0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
119e0 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
119f0 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65   char *buf, size
11a00 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67  _t buflen, unsig
11a10 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
11a20 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c  , size_t outbufl
11a30 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74  en, int padInput
11a40 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75  , int unpadOutpu
11a50 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73  t) {..cackey_pcs
11a60 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70  c_id_type id_typ
11a70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  e;..unsigned cha
11a80 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  r dyn_auth_templ
11a90 61 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e  ate[10];..unsign
11aa0 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
11ab0 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
11ac0 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70  buf_s, *outbuf_p
11ad0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
11ae0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
11af0 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69  p1, class;..unsi
11b00 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74  gned char blockt
11b10 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74  ype;..cackey_ret
11b20 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74   send_ret;..uint
11b30 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
11b40 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d  ssize_t retval =
11b50 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   0, unpadoffset;
11b60 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c  ..size_t tmpbufl
11b70 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f  en, padlen, tmpo
11b80 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66  utbuflen, outbuf
11b90 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f  _len;..int free_
11ba0 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74  tmpbuf = 0;..int
11bb0 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45   le;...CACKEY_DE
11bc0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
11bd0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
11be0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
11bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11c00 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74  TF("Error.  slot
11c10 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11c20 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11c30 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  if (buf == NULL)
11c40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11c50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11c60 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b    buf is NULL");
11c70 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11c80 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20  .}...if (outbuf 
11c90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
11ca0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11cb0 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66  ("Error.  outbuf
11cc0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11cd0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11ce0 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
11cf0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11d00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11d10 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20  rror.  identity 
11d20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
11d30 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
11d40 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
11d50 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55  c_identity == NU
11d60 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
11d70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11d80 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70  or.  identity->p
11d90 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20  csc_identity is 
11da0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11db0 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74  n(-1);..}...id_t
11dc0 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ype = identity->
11dd0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69  pcsc_identity->i
11de0 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f  d_type;..if (id_
11df0 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
11e00 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
11e10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11e20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11e30 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
11e40 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41  c_identity is CA
11e50 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
11e60 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61  T_ONLY, which ca
11e70 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72  nnot be used for
11e80 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b   sign/decrypt");
11e90 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11ea0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f  .}...switch (id_
11eb0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
11ec0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
11ed0 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  V:...case CACKEY
11ee0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11ef0 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
11f00 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
11f10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11f20 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
11f30 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  c_identity is no
11f40 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61  t a supported va
11f50 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78  lue. Type is: 0x
11f60 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78  %lx (PIV = 0x%lx
11f70 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c  , CAC = 0x%lx)",
11f80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11f90 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67   id_type, (unsig
11fa0 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59  ned long) CACKEY
11fb0 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75  _ID_TYPE_PIV, (u
11fc0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11fd0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11fe0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
11ff0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
12000 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
12010 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
12020 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12030 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
12040 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
12050 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12060 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
12070 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
12080 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12090 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
120a0 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
120b0 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
120c0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
120d0 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
120e0 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
120f0 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
12100 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
12110 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12120 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
12130 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
12140 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12150 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12160 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
12170 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
12180 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12190 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09  eysize + 3)) {..
121a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
121b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
121c0 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
121d0 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
121e0 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
121f0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
12200 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
12210 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
12220 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12230 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
12240 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
12250 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
12260 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
12270 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
12280 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
12290 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
122a0 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
122b0 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
122c0 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
122d0 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
122e0 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
122f0 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
12300 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
12310 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
12320 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
12330 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
12340 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
12350 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
12360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12370 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
12380 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
12390 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
123a0 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
123b0 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
123c0 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
123d0 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
123e0 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
123f0 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
12400 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
12410 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
12420 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
12430 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
12440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
12450 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
12460 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
12470 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
12480 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
12490 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
124a0 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
124b0 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
124c0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
124d0 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
124e0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
124f0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
12500 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
12510 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
12520 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
12530 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
12540 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
12550 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
12560 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
12570 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  t);.../* Select 
12580 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a  correct applet *
12590 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  /..switch (id_ty
125a0 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
125b0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
125c0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
125d0 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
125e0 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20  ng applet found 
125f0 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e  at %p ...", iden
12600 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12610 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  ity->card.cac.ap
12620 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79  plet);....cackey
12630 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
12640 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
12650 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12660 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
12670 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
12680 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
12690 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
126a0 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
126b0 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
126c0 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
126d0 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
126e0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
126f0 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  ity->card.cac.fi
12700 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  le);....break;..
12710 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
12720 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e  TYPE_PIV:....dyn
12730 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30  _auth_template[0
12740 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e  ] = 0x7C;....dyn
12750 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
12760 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
12770 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32  _auth_template[2
12780 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20  ] = ((tmpbuflen 
12790 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e  + 6) & 0xff00) >
127a0 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  > 8;....dyn_auth
127b0 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28  _template[3] = (
127c0 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
127d0 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f   0x00ff;....dyn_
127e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d  auth_template[4]
127f0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
12800 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d  auth_template[5]
12810 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f   = 0x00;....dyn_
12820 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
12830 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f   = 0x81;....dyn_
12840 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d  auth_template[7]
12850 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
12860 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d  auth_template[8]
12870 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20   = (tmpbuflen & 
12880 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
12890 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
128a0 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65  te[9] = tmpbufle
128b0 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09  n & 0x00ff;.....
128c0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
128d0 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
128e0 2c 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30  , 0x10, NISTSP80
128f0 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e  0_73_3_INSTR_GEN
12900 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f  AUTH, NISTSP800_
12910 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
12920 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  8, identity->pcs
12930 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
12940 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a  .piv.key_id, siz
12950 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
12960 70 6c 61 74 65 29 2c 20 64 79 6e 5f 61 75 74 68  plate), dyn_auth
12970 5f 74 65 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c  _template, 0x00,
12980 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
12990 4c 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  L);....break;...
129a0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
129b0 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
129c0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d  ..break;..}...tm
129d0 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b  pbuf_s = tmpbuf;
129e0 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74  ..outbuf_s = out
129f0 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
12a00 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f  buflen) {...tmpo
12a10 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75  utbuflen = outbu
12a20 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70  flen;....if (tmp
12a30 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f  buflen > CACKEY_
12a40 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62  APDU_MTU) {....b
12a50 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43  ytes_to_send = C
12a60 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
12a70 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79  ..} else {....by
12a80 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d  tes_to_send = tm
12a90 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  pbuflen;...}....
12aa0 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45  send_ret = CACKE
12ab0 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
12ac0 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74  ;...switch (id_t
12ad0 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
12ae0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
12af0 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75  C:.....if (tmpbu
12b00 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50  flen > CACKEY_AP
12b10 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70  DU_MTU) {......p
12b20 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c  1 = 0x80;......l
12b30 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20  e = 0x00;.....} 
12b40 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d  else {......p1 =
12b50 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x00;......le =
12b60 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09   0x00;.....}....
12b70 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
12b80 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
12b90 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
12ba0 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
12bb0 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47   GSCIS_INSTR_SIG
12bc0 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78  NDECRYPT, p1, 0x
12bd0 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  00, bytes_to_sen
12be0 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26  d, tmpbuf, le, &
12bf0 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66  respcode, outbuf
12c00 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29  , &tmpoutbuflen)
12c10 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
12c20 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12c30 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20  YPE_PIV:.....if 
12c40 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
12c50 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
12c60 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31  .....class = 0x1
12c70 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
12c80 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
12c90 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43  .....class = GSC
12ca0 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
12cb0 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b  ;......le = 256;
12cc0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64  .....}......send
12cd0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
12ce0 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c  nd_apdu(slot, cl
12cf0 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  ass, NISTSP800_7
12d00 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
12d10 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  H, NISTSP800_78_
12d20 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20  3_ALGO_RSA2048, 
12d30 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12d40 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
12d50 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f  v.key_id, bytes_
12d60 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
12d70 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
12d80 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
12d90 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61  uflen);.....brea
12da0 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
12db0 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
12dc0 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
12dd0 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
12de0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
12df0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
12e00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12e10 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
12e20 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e  Failed -- return
12e30 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b  ing in error.");
12e40 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d  .....if (free_tm
12e50 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28  pbuf) {.....if (
12e60 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09  tmpbuf_s) {.....
12e70 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
12e80 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
12e90 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
12ea0 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
12eb0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
12ec0 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72  slot);.....if (r
12ed0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  espcode == 0x698
12ee0 32 20 7c 7c 20 72 65 73 70 63 6f 64 65 20 3d 3d  2 || respcode ==
12ef0 20 30 78 36 65 30 30 29 20 7b 0a 09 09 09 09 69   0x6e00) {.....i
12f00 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
12f10 78 36 45 30 30 29 20 7b 0a 09 09 09 09 09 43 41  x6E00) {......CA
12f20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12f30 46 28 22 47 6f 74 20 5c 22 57 52 4f 4e 47 20 43  F("Got \"WRONG C
12f40 4c 41 53 53 5c 22 2c 20 74 68 69 73 20 6d 65 61  LASS\", this mea
12f50 6e 73 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e  ns we are talkin
12f60 67 20 74 6f 20 74 68 65 20 77 72 6f 6e 67 20 6f  g to the wrong o
12f70 62 6a 65 63 74 20 28 6c 69 6b 65 6c 79 20 62 65  bject (likely be
12f80 63 61 75 73 65 20 74 68 65 20 63 61 72 64 20 77  cause the card w
12f90 65 6e 74 20 61 77 61 79 29 20 2d 2d 20 72 65 73  ent away) -- res
12fa0 65 74 74 69 6e 67 22 29 3b 0a 09 09 09 09 7d 20  etting");.....} 
12fb0 65 6c 73 65 20 7b 0a 09 09 09 09 09 43 41 43 4b  else {......CACK
12fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12fd0 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75 73  "Security status
12fe0 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64 20   not satisified 
12ff0 28 72 65 73 70 63 6f 64 65 20 3d 20 30 78 25 30  (respcode = 0x%0
13000 34 78 29 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  4x).  Returning 
13010 4e 45 45 44 4c 4f 47 49 4e 22 2c 20 28 69 6e 74  NEEDLOGIN", (int
13020 29 20 72 65 73 70 63 6f 64 65 29 3b 0a 09 09 09  ) respcode);....
13030 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  .}......cackey_m
13040 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
13050 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  lot);......retur
13060 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
13070 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d  NEEDLOGIN);....}
13080 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65  .....if (send_re
13090 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
130a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
130b0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
130c0 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e  UG_PRINTF("Token
130d0 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e   absent.  Return
130e0 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22  ing TOKENABSENT"
130f0 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  );......cackey_m
13100 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
13110 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  lot);......retur
13120 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
13130 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
13140 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  .}.....return(-1
13150 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66  );...}....tmpbuf
13160 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   += bytes_to_sen
13170 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d  d;...tmpbuflen -
13180 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b  = bytes_to_send;
13190 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d  ....outbuf += tm
131a0 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75  poutbuflen;...ou
131b0 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75  tbuflen -= tmpou
131c0 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61  tbuflen;...retva
131d0 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65  l += tmpoutbufle
131e0 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65  n;..}...if (free
131f0 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20  _tmpbuf) {...if 
13200 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09  (tmpbuf_s) {....
13210 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
13220 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20  ..}..}...outbuf 
13230 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a  = outbuf_s;.../*
13240 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
13250 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f   */..cackey_end_
13260 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
13270 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  );..#ifdef CACKE
13280 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
13290 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
132a0 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66  _MAX..if (outbuf
132b0 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49  len > _POSIX_SSI
132c0 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b  ZE_MAX) {...CACK
132d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
132e0 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65  "Outbuflen excee
132f0 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
13300 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
13310 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
13320 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20  li, outbuflen = 
13330 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
13340 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
13350 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13360 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72  outbuflen);....r
13370 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
13380 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
13390 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76  /* We must remov
133a0 65 20 74 68 65 20 22 37 43 22 20 74 61 67 20 74  e the "7C" tag t
133b0 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 67  o get to the sig
133c0 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 63  nature */..switc
133d0 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  h (id_type) {...
133e0 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
133f0 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74 62  YPE_PIV:....outb
13400 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b  uf_len = retval;
13410 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63  ....outbuf_p = c
13420 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c  ackey_read_bertl
13430 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f  v_tag(outbuf, &o
13440 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43 2c  utbuf_len, 0x7C,
13450 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f   NULL,  &outbuf_
13460 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74  len);....if (out
13470 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  buf_p == NULL) {
13480 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13490 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
134a0 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20  se from PIV for 
134b0 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54  GENERATE AUTHENT
134c0 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20  ICATION was not 
134d0 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75  a 0x7C tag, retu
134e0 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
134f0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
13500 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  -1);....}.....re
13510 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65  tval = outbuf_le
13520 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65  n;.....outbuf_le
13530 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f  n = retval;....o
13540 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79  utbuf_p = cackey
13550 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
13560 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66  (outbuf, &outbuf
13570 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c 4c  _len, 0x82, NULL
13580 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b  ,  &outbuf_len);
13590 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70  ....if (outbuf_p
135a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   == NULL) {.....
135b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
135c0 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72  NTF("Response fr
135d0 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52  om PIV for GENER
135e0 41 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49  ATE AUTHENTICATI
135f0 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 38  ON was not a 0x8
13600 32 20 77 69 74 68 20 74 68 65 6e 20 30 78 37 43  2 with then 0x7C
13610 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20   tag, returning 
13620 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
13630 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
13640 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d  ..}.....retval =
13650 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09   outbuf_len;....
13660 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43  .break;...case C
13670 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
13680 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  C:...case CACKEY
13690 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
136a0 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  LY:....break;..}
136b0 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c  .../* Unpad repl
136c0 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f  y */..if (unpadO
136d0 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72  utput) {...if (r
136e0 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09  etval < 3) {....
136f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13700 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f  NTF("Reply is to
13710 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20  o small, we are 
13720 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61  not able to unpa
13730 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63  d -- passing bac
13740 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72  k and hoping for
13750 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09   the best!");...
13760 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13770 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
13780 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   in success, ret
13790 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73  val = %li (bytes
137a0 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61  )", (long) retva
137b0 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
137c0 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  tval);...}....if
137d0 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30   (outbuf[0] != 0
137e0 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  x00) {....CACKEY
137f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
13800 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64  nrecognized padd
13810 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61  ing scheme -- pa
13820 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68  ssing back and h
13830 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oping for the be
13840 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45  st!");.....CACKE
13850 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13860 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
13870 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
13880 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
13890 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09  ng) retval);....
138a0 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
138b0 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65  ..}....blocktype
138c0 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09   = outbuf[1];...
138d0 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b  unpadoffset = 0;
138e0 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63  ....switch (bloc
138f0 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  ktype) {....case
13900 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61   0x00:...../* Pa
13910 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20  dding Scheme 1, 
13920 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65  the first non-ze
13930 72 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73  ro byte is the s
13940 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a  tart of data */.
13950 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
13960 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
13970 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
13980 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
13990 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
139a0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d  [unpadoffset] !=
139b0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62   0x00) {.......b
139c0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
139d0 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .}.....break;...
139e0 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09  .case 0x01:.....
139f0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
13a00 65 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61  e 2, pad bytes a
13a10 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64  re 0xFF followed
13a20 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09   by 0x00 */.....
13a30 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74  for (unpadoffset
13a40 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65   = 2; unpadoffse
13a50 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61  t < retval; unpa
13a60 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09  doffset++) {....
13a70 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70  ..if (outbuf[unp
13a80 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46  adoffset] != 0xF
13a90 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f  F) {.......if (o
13aa0 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
13ab0 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
13ac0 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
13ad0 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61  ++;.........brea
13ae0 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20  k;.......} else 
13af0 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f  {........CACKEY_
13b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
13b10 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
13b20 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
13b30 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
13b40 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
13b50 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30   0x00 found 0x%0
13b60 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
13b70 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
13b80 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
13b90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13ba0 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
13bb0 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59  e {.......CACKEY
13bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
13bd0 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64  nvalid padding d
13be0 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72  ata found, retur
13bf0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c  ning in failure,
13c00 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
13c10 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25  n 0xFF found 0x%
13c20 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  02x", (unsigned 
13c30 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61  int) outbuf[unpa
13c40 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09  doffset]);......
13c50 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13c60 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
13c70 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78  reak;....case 0x
13c80 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  02:...../* Paddi
13c90 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64  ng Scheme 3, pad
13ca0 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a   bytes are non-z
13cb0 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62  ero first zero b
13cc0 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65  yte found is the
13cd0 20 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20   seperator byte 
13ce0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
13cf0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
13d00 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
13d10 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
13d20 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
13d30 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
13d40 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   == 0x00) {.....
13d50 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
13d60 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
13d70 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09  ....}.....}.....
13d80 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
13d90 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20   (unpadoffset > 
13da0 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43  retval) {....CAC
13db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13dc0 28 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72  ("Offset greater
13dd0 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65   than reply size
13de0 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e  , aborting.  (un
13df0 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c  padoffset = %lu,
13e00 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c   retval = %lu)",
13e10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13e20 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75   unpadoffset, (u
13e30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
13e40 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
13e50 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  n(-1);...}....CA
13e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13e70 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f  BUF("Padded:", o
13e80 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a  utbuf, retval);.
13e90 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70  ...retval -= unp
13ea0 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d  adoffset;...memm
13eb0 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62  ove(outbuf, outb
13ec0 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74  uf + unpadoffset
13ed0 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41  , retval);....CA
13ee0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13ef0 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
13f00 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
13f10 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44  ;..}....CACKEY_D
13f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
13f30 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
13f40 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
13f50 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
13f60 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
13f70 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f  rn(retval);.}../
13f80 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
13f90 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
13fa0 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
13fb0 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
13fc0 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
13fd0 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
13fe0 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
13ff0 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
14000 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73  t cackey_login(s
14010 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
14020 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
14030 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73  d char *pin, uns
14040 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c  igned long pin_l
14050 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72  en, int *tries_r
14060 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 73  emaining_p) {..s
14070 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
14080 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
14090 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
140a0 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
140b0 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
140c0 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
140d0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
140e0 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69  FF, 0xFF};..unsi
140f0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
14100 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  rts;..uint16_t r
14110 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69  esponse_code;..i
14120 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  nt tries_remaini
14130 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ng;..int send_re
14140 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65  t;..int key_refe
14150 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09  rence = 0x00;...
14160 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  /* Indicate that
14170 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   we do not know 
14180 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74  about how many t
14190 72 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69  ries are remaini
141a0 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73  ng */..if (tries
141b0 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
141c0 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
141d0 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09  ng_p = -1;..}...
141e0 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43  /* Apparently, C
141f0 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41  AC PINs are *EXA
14200 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f  CTLY* 8 bytes lo
14210 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30  ng -- pad with 0
14220 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74  xFF if too short
14230 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e   */..if (pin_len
14240 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70   >= 8) {...memcp
14250 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20  y(cac_pin, pin, 
14260 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  8);..} else {...
14270 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20  memcpy(cac_pin, 
14280 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09  pin, pin_len);..
14290 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20 50 49  }.../* Reject PI
142a0 4e 73 20 77 68 69 63 68 20 61 72 65 20 74 6f 6f  Ns which are too
142b0 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70   short */..if (p
142c0 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a 09 09  in_len < 5) {...
142d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
142e0 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67 20 50  NTF("Rejecting P
142f0 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20  IN which is too 
14300 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20 3d 20  short (length = 
14310 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61 74 6c  %lu, must be atl
14320 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f 6c 65  east 5)", pin_le
14330 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  n);....return(CA
14340 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
14350 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 49 56  IN);..}.../* PIV
14360 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
14370 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65 66 65  uses a "key_refe
14380 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30 20 2a  rence" of 0x80 *
14390 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  /..pcsc_identiti
143a0 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
143b0 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c  _certs(slot, NUL
143c0 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
143d0 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e  .if (num_certs >
143e0 20 30 20 26 26 20 70 63 73 63 5f 69 64 65 6e 74   0 && pcsc_ident
143f0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
14400 0a 09 09 73 77 69 74 63 68 20 28 70 63 73 63 5f  ...switch (pcsc_
14410 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e 69 64  identities[0].id
14420 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
14430 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
14440 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  PIV:.....CACKEY_
14450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
14460 20 68 61 76 65 20 50 49 56 20 63 61 72 64 2c 20   have PIV card, 
14470 73 6f 20 77 65 20 77 69 6c 6c 20 61 74 74 65 6d  so we will attem
14480 70 74 20 74 6f 20 61 75 74 68 65 6e 74 69 63 61  pt to authentica
14490 74 65 20 75 73 69 6e 67 20 74 68 65 20 50 49 56  te using the PIV
144a0 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79   Application key
144b0 20 72 65 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09   reference");...
144c0 09 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  ...key_reference
144d0 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 62 72 65   = 0x80;.....bre
144e0 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
144f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
14500 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
14510 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
14520 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
14530 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75  1);..}.../* Issu
14540 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a  e PIN Verify */.
14550 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
14560 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
14570 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
14580 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
14590 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30  STR_VERIFY, 0x00
145a0 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c  , key_reference,
145b0 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29   sizeof(cac_pin)
145c0 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c  , cac_pin, 0x00,
145d0 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c   &response_code,
145e0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09   NULL, NULL);...
145f0 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
14600 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
14610 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f  ) {...if ((respo
14620 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43  nse_code & 0x63C
14630 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a  0) == 0x63C0) {.
14640 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ...tries_remaini
14650 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63  ng = (response_c
14660 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09  ode & 0xF);.....
14670 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14680 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63  NTF("PIN Verific
14690 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69  ation failed, %i
146a0 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67   tries remaining
146b0 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ", tries_remaini
146c0 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69  ng);.....if (tri
146d0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
146e0 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d  {.....*tries_rem
146f0 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73  aining_p = tries
14700 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d  _remaining;....}
14710 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
14720 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
14730 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65  );...}....if (re
14740 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30  sponse_code == 0
14750 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b  x6983) {....CACK
14760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14770 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
14780 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65  n failed, device
14790 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09   is locked");...
147a0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
147b0 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a  PCSC_E_LOCKED);.
147c0 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ..}....return(CA
147d0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
147e0 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
147f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14800 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
14810 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09   succeeded");...
14820 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14830 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
14840 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
14850 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
14860 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
14870 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
14880 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
14890 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
148a0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
148b0 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
148c0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
148d0 73 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b  sent(struct cack
148e0 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b  ey_slot *slot) {
148f0 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73  ..cackey_ret pcs
14900 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
14910 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e  DWORD reader_len
14920 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20 30 2c   = 0, state = 0,
14930 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61   protocol = 0, a
14940 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74  tr_len;..BYTE at
14950 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b  r[MAX_ATR_SIZE];
14960 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65  ..LONG status_re
14970 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  t, scard_reconn_
14980 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
14990 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
149a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
149b0 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t->internal) {..
149c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
149d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
149e0 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20 28 69  token present (i
149f0 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29  nternal token)")
14a00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
14a10 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
14a20 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63  RESENT);..}...pc
14a30 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
14a40 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
14a50 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
14a60 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
14a70 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
14a80 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
14a90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14aa0 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
14ab0 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
14ac0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
14ad0 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
14ae0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
14af0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
14b00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14b10 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61  NTF("Calling SCa
14b20 72 64 53 74 61 74 75 73 28 29 20 74 6f 20 64 65  rdStatus() to de
14b30 74 65 72 6d 69 6e 65 20 63 61 72 64 20 73 74 61  termine card sta
14b40 74 75 73 22 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e  tus");...atr_len
14b50 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a   = sizeof(atr);.
14b60 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43  .status_ret = SC
14b70 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e  ardStatus(slot->
14b80 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c  pcsc_card, NULL,
14b90 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73   &reader_len, &s
14ba0 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c  tate, &protocol,
14bb0 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b   atr, &atr_len);
14bc0 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
14bd0 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56  t == SCARD_E_INV
14be0 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09  ALID_HANDLE) {..
14bf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14c00 49 4e 54 46 28 22 53 43 61 72 64 53 74 61 74 75  INTF("SCardStatu
14c10 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  s() returned SCA
14c20 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
14c30 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20  DLE, marking is 
14c40 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e  not already conn
14c50 65 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67  ected and trying
14c60 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b   again");...cack
14c70 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
14c80 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73  et(slot);....pcs
14c90 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
14ca0 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
14cb0 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20  ard(slot);...if 
14cc0 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
14cd0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
14ce0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
14cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14d00 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
14d10 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
14d20 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
14d30 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  nt");.....return
14d40 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
14d50 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
14d60 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14d70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67  _PRINTF("Calling
14d80 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 61   SCardStatus() a
14d90 67 61 69 6e 22 29 3b 0a 0a 09 09 61 74 72 5f 6c  gain");....atr_l
14da0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29  en = sizeof(atr)
14db0 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d  ;...status_ret =
14dc0 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
14dd0 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
14de0 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
14df0 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
14e00 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
14e10 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61  n);..}...if (sta
14e20 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44  tus_ret != SCARD
14e30 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
14e40 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
14e50 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
14e60 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
14e70 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54  == SCARD_W_RESET
14e80 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b  _CARD) {....CACK
14e90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14ea0 22 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c  "Reset required,
14eb0 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22   please hold..."
14ec0 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63  );.....scard_rec
14ed0 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  onn_ret = cackey
14ee0 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
14ef0 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54  slot, SCARD_PROT
14f00 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f  OCOL_T0 | SCARD_
14f10 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72  PROTOCOL_T1, &pr
14f20 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28  otocol);....if (
14f30 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
14f40 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
14f50 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70  ESS) {...../* Up
14f60 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  date protocol */
14f70 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f  .....slot->proto
14f80 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a  col = protocol;.
14f90 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62  ...../* Re-estab
14fa0 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e  lish transaction
14fb0 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73  , if it was pres
14fc0 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ent */.....if (s
14fd0 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
14fe0 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09  _depth > 0) {...
14ff0 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
15000 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09  tion_depth--;...
15010 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ...slot->transac
15020 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
15030 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b  k = 1;......cack
15040 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
15050 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09  tion(slot);.....
15060 7d 0a 0a 09 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 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  t successful, re
15090 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09  querying");.....
150a0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
150b0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
150c0 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
150d0 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
150e0 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
150f0 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
15100 09 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72  ....if (status_r
15110 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
15120 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41  CCESS) {......CA
15130 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15140 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20  F("Still unable 
15150 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74  to query card st
15160 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20  atus, returning 
15170 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53  token absent.  S
15180 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25  CardStatus() = %
15190 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
151a0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
151b0 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74  O_STR(status_ret
151c0 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e  ));.......return
151d0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
151e0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
151f0 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
15200 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15210 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
15220 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63  o reconnect to c
15230 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
15240 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
15250 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d  ardReconnect() =
15260 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
15270 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
15280 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65  _TO_STR(scard_re
15290 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09  conn_ret));.....
152a0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
152b0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
152c0 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  T);....}...} els
152d0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
152e0 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
152f0 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64  le to query card
15300 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69   status, returni
15310 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
15320 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20    SCardStatus() 
15330 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
15340 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
15350 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f  R_TO_STR(status_
15360 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72  ret));.....retur
15370 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
15380 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
15390 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74  }..}...if ((stat
153a0 65 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54  e & SCARD_ABSENT
153b0 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e  ) == SCARD_ABSEN
153c0 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
153d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64  BUG_PRINTF("Card
153e0 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75   is absent, retu
153f0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
15400 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  nt");....return(
15410 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
15420 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a  KENABSENT);..}..
15430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15440 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15450 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29  token present.")
15460 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
15470 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
15480 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ESENT);.}../*. *
15490 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
154a0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
154b0 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
154c0 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
154d0 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
154e0 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
154f0 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
15500 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65  ic ssize_t cacke
15510 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
15520 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20  to_label(struct 
15530 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15540 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
15550 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c  unsigned char *l
15560 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e  abel_buf, unsign
15570 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75  ed long label_bu
15580 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e  f_len) {..unsign
15590 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63  ed long certific
155a0 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a  ate_len;..void *
155b0 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69  label_asn1;..voi
155c0 64 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  d *certificate;.
155d0 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72  .int x509_read_r
155e0 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74  et;...certificat
155f0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  e = identity->ce
15600 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74  rtificate;..cert
15610 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64  ificate_len = id
15620 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
15630 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63  ate_len;...if (c
15640 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c  ertificate_len <
15650 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d   0) {...return(-
15660 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65  1);..}...x509_re
15670 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
15680 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
15690 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
156a0 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29  e_len, (void **)
156b0 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09   &label_asn1);..
156c0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
156d0 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  t < 0) {...retur
156e0 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39  n(-1);..}...x509
156f0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
15700 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61  _dn_to_string(la
15710 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72  bel_asn1, x509_r
15720 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a  ead_ret, (char *
15730 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62  ) label_buf, lab
15740 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22  el_buf_len, "CN"
15750 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  );..if (x509_rea
15760 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
15770 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
15780 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e  x509_dn_to_strin
15790 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35  g(label_asn1, x5
157a0 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68  09_read_ret, (ch
157b0 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c  ar *) label_buf,
157c0 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20   label_buf_len, 
157d0 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35  NULL);....if (x5
157e0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30  09_read_ret <= 0
157f0 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  ) {....return(-1
15800 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  );...}..}..#ifde
15810 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49  f CACKEY_PARANOI
15820 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49  D.#  ifdef _POSI
15830 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20  X_SSIZE_MAX..if 
15840 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e  (x509_read_ret >
15850 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
15860 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
15870 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39  BUG_PRINTF("x509
15880 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 64  _read_ret exceed
15890 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
158a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
158b0 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
158c0 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  i, x509_read_ret
158d0 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
158e0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
158f0 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
15900 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  g) x509_read_ret
15910 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
15920 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65  ;..}.#  endif.#e
15930 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35  ndif...return(x5
15940 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a  09_read_ret);.}.
15950 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
15960 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
15970 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
15980 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20  tex_create(void 
15990 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72  **mutex) {..pthr
159a0 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
159b0 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
159c0 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
159d0 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
159e0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
159f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15a00 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
15a10 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
15a20 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
15a30 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
15a40 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
15a50 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
15a60 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
15a70 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b  pthread_mutex));
15a80 0a 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f  ...if (!pthread_
15a90 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b  mutex) {....CACK
15aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15ab0 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63  "Failed to alloc
15ac0 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a  ate memory.");..
15ad0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15ae0 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  .}....pthread_re
15af0 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
15b00 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61  utex_init(pthrea
15b10 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a  d_mutex, NULL);.
15b20 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
15b30 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
15b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15b50 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
15b60 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e  ex_init() return
15b70 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
15b80 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
15b90 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
15ba0 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20  ;...}....*mutex 
15bb0 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b  = pthread_mutex;
15bc0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20  ..} else {...if 
15bd0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  (cackey_args.Cre
15be0 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63  ateMutex) {....c
15bf0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63  ustom_retval = c
15c00 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
15c10 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  eMutex(mutex);..
15c20 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
15c30 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
15c40 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
15c50 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
15c60 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
15c70 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72  ex() returned er
15c80 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f  ror (%li).", (lo
15c90 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  ng) custom_retva
15ca0 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  l);......return(
15cb0 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  -1);....}...}..}
15cc0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15cd0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15ce0 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30  g sucessfully (0
15cf0 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29  )");...return(0)
15d00 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20  ;.}../* Returns 
15d10 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a  0 on success */.
15d20 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
15d30 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69  y_mutex_lock(voi
15d40 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
15d50 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
15d60 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
15d70 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
15d80 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
15d90 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
15da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15db0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
15dc0 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
15dd0 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
15de0 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
15df0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
15e00 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
15e10 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
15e20 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
15e30 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
15e40 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a  pthread_mutex);.
15e50 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65  ..if (pthread_re
15e60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
15e70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15e80 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74  NTF("pthread_mut
15e90 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  ex_lock() return
15ea0 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c  ed error (%i).",
15eb0 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29   pthread_retval)
15ec0 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
15ed0 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
15ee0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67  ..if (cackey_arg
15ef0 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09  s.LockMutex) {..
15f00 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
15f10 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  = cackey_args.Lo
15f20 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
15f30 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
15f40 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
15f50 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
15f60 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
15f70 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
15f80 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
15f90 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
15fa0 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
15fb0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
15fc0 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
15fd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15fe0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15ff0 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
16000 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
16010 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
16020 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
16030 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
16040 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f  _mutex_unlock(vo
16050 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  id *mutex) {..pt
16060 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
16070 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
16080 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
16090 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
160a0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
160b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
160d0 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
160e0 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
160f0 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
16100 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
16110 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
16120 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68   = mutex;....pth
16130 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
16140 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
16150 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
16160 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
16170 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
16180 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16190 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
161a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72  mutex_unlock() r
161b0 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
161c0 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65  i).", pthread_re
161d0 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72  tval);.....retur
161e0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  n(-1);...}..} el
161f0 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
16200 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
16210 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
16220 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
16230 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
16240 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
16250 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
16260 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
16270 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16280 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
16290 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72  .UnlockMutex() r
162a0 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
162b0 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
162c0 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
162d0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
162e0 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
162f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16300 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
16310 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
16320 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73  .return(0);.}..s
16330 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55  tatic CK_ATTRIBU
16340 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65  TE_PTR cackey_ge
16350 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f  t_attributes(CK_
16360 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a  OBJECT_CLASS obj
16370 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74  ectclass, struct
16380 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
16390 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c  ntity *identity,
163a0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69   unsigned long i
163b0 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f  dentity_num, CK_
163c0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
163d0 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  nt) {..static CK
163e0 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d  _BBOOL ck_true =
163f0 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42   1;..static CK_B
16400 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20  BOOL ck_false = 
16410 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52  0;..static CK_TR
16420 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d  UST ck_trusted =
16430 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45   CK_TRUSTED_DELE
16440 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  GATOR;..CK_ULONG
16450 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72   numattrs = 0, r
16460 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b  etval_count;..CK
16470 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20  _ATTRIBUTE_TYPE 
16480 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a  curr_attr_type;.
16490 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75  .CK_ATTRIBUTE cu
164a0 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c  rr_attr, *retval
164b0 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
164c0 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
164d0 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b   ulValueLen;..CK
164e0 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b  _OBJECT_CLASS ck
164f0 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09  _object_class;..
16500 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
16510 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61  YPE ck_certifica
16520 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59  te_type;..CK_KEY
16530 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70  _TYPE ck_key_typ
16540 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20  e;..CK_UTF8CHAR 
16550 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a  ucTmpBuf[1024];.
16560 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61  .SHA1Context sha
16570 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20  1_ctx;..MD5_CTX 
16580 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f  md5_ctx;..uint8_
16590 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31  t sha1_hash[SHA1
165a0 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74  HashSize];..uint
165b0 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35  8_t md5_hash[MD5
165c0 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69  HashSize];..unsi
165d0 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69  gned char *certi
165e0 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74  ficate;..ssize_t
165f0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
16600 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64   = -1, x509_read
16610 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75  _ret;..int pValu
16620 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59  e_free;...CACKEY
16630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
16640 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61  alled (objectCla
16650 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69  ss = %lu, identi
16660 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c  ty_num = %lu).",
16670 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16680 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64   objectclass, id
16690 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a  entity_num);...*
166a0 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  pulCount = 0;...
166b0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
166c0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
166d0 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
166e0 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
166f0 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
16700 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss != CKO_PRIVAT
16710 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  E_KEY && objectc
16720 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
16730 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
16740 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16750 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
16760 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
16770 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20   invalid object 
16780 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75  class");....retu
16790 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
167a0 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69  * Get Cert */..i
167b0 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
167c0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
167d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
167e0 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
167f0 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69  s (NULL), invali
16800 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64  d identiy provid
16810 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ed");....return(
16820 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74  NULL);..}...cert
16830 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69  ificate = identi
16840 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b  ty->certificate;
16850 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ..certificate_le
16860 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  n = identity->ce
16870 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
16880 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
16890 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65  _len == -1 || ce
168a0 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c  rtificate == NUL
168b0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
168c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
168d0 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
168e0 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65  (NULL), this ide
168f0 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68  ntity does not h
16900 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72  ave an X.509 cer
16910 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61  tificate associa
16920 74 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20  ted with it and 
16930 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b  will not work");
16940 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
16950 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
16960 20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74   that certificat
16970 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64  e is ASN.1 encod
16980 65 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  ed X.509 certifi
16990 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30  cate */..if (x50
169a0 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74  9_to_serial(cert
169b0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
169c0 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20  cate_len, NULL) 
169d0 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 0) {...CACKEY_
169e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
169f0 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
16a00 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e  s (NULL), the X.
16a10 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
16a20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16a30 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73  this identity is
16a40 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09   not valid");...
16a50 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
16a60 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  }...retval_count
16a70 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d   = 64;..retval =
16a80 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63   malloc(retval_c
16a90 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
16aa0 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28  etval));...for (
16ab0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
16ac0 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79   0; curr_attr_ty
16ad0 70 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b  pe < 0xce5363bf;
16ae0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b   curr_attr_type+
16af0 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f  +) {...if (curr_
16b00 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38  attr_type == 0x8
16b10 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74  00) {....curr_at
16b20 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33  tr_type = 0xce53
16b30 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61  6300;...}....pVa
16b40 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09  lue_free = 0;...
16b50 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
16b60 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
16b70 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73  K_LONG) -1;....s
16b80 77 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72  witch (curr_attr
16b90 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65  _type) {....case
16ba0 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09   CKA_CLASS:.....
16bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16bc0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
16bd0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c  attribute CKA_CL
16be0 41 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ASS (0x%08lx) ..
16bf0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16c00 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16c10 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a  pe);......ck_obj
16c20 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65  ect_class = obje
16c30 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56  ctclass;......pV
16c40 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63  alue = &ck_objec
16c50 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56  t_class;.....ulV
16c60 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16c70 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  (ck_object_class
16c80 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
16c90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16ca0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
16cb0 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
16cc0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
16cd0 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29  _OBJECT_CLASS *)
16ce0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16cf0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16d00 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16d10 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16d20 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
16d30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16d40 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16d50 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16d60 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20  TOKEN (0x%08lx) 
16d70 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
16d80 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
16d90 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
16da0 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
16db0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16dc0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
16dd0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16de0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
16df0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
16e00 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
16e10 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
16e20 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
16e30 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16e40 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16e50 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16e60 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52  ;....case CKA_PR
16e70 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45  IVATE:.....CACKE
16e80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16e90 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16ea0 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45  bute CKA_PRIVATE
16eb0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
16ec0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16ed0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16ee0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
16ef0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
16f00 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
16f10 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16f20 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
16f30 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
16f40 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
16f50 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20   not a Netscape 
16f60 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
16f70 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
16f80 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  .}......pValue =
16f90 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
16fa0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
16fb0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a  eof(ck_false);..
16fc0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16fd0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
16fe0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
16ff0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
17000 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
17010 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
17020 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17030 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17040 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17050 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
17060 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  TED:.....CACKEY_
17070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17080 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17090 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28  te CKA_TRUSTED (
170a0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
170b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
170c0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
170d0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
170e0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
170f0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
17100 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17110 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17120 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
17130 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
17140 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17150 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17160 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17170 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
17180 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  rue;.....ulValue
17190 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
171a0 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  true);......CACK
171b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
171c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
171d0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
171e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
171f0 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
17200 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
17210 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17220 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17230 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17240 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a  CKA_MODIFIABLE:.
17250 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17260 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
17270 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
17280 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78  A_MODIFIABLE (0x
17290 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
172a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
172b0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
172c0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
172d0 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c  false;.....ulVal
172e0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
172f0 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43  k_false);......C
17300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17310 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
17320 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
17330 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17340 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
17350 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
17360 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17370 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17380 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17390 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09  se CKA_LABEL:...
173a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
173b0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
173c0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
173d0 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20  LABEL (0x%08lx) 
173e0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
173f0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17400 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
17410 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70  identity->id_typ
17420 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
17430 59 50 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 09  YPE_PIV) {......
17440 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74  pValue = identit
17450 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  y->card.piv.labe
17460 6c 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  l;......ulValueL
17470 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c  en = strlen(pVal
17480 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
17490 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  {......ulValueLe
174a0 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68  n = snprintf((ch
174b0 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20  ar *) ucTmpBuf, 
174c0 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
174d0 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75  , "Identity #%lu
174e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
174f0 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29  g) identity_num)
17500 3b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
17510 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09  ucTmpBuf;.......
17520 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  if (ulValueLen >
17530 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  = sizeof(ucTmpBu
17540 66 29 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  f)) {.......ulVa
17550 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09  lueLen = 0;.....
17560 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
17570 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
17580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17590 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
175a0 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
175b0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
175c0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
175d0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
175e0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56  k;....case CKA_V
175f0 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  ALUE:.....CACKEY
17600 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17610 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17620 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30  ute CKA_VALUE (0
17630 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17650 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17660 09 09 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65  ....switch (obje
17670 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09  ctclass) {......
17680 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45  case CKO_PRIVATE
17690 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b  _KEY:.......CACK
176a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
176b0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
176c0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
176d0 20 77 65 20 61 72 65 20 61 20 70 72 69 76 61 74   we are a privat
176e0 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  e key.");.......
176f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
17700 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  e CKO_NETSCAPE_T
17710 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b  RUST:.......CACK
17720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17730 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17740 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17750 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
17760 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
17770 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  );........break;
17780 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50  ......case CKO_P
17790 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09  UBLIC_KEY:......
177a0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
177b0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
177c0 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
177d0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b  t = x509_to_pubk
177e0 65 79 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ey(certificate, 
177f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
17800 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
17810 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
17820 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09  ret < 0) { .....
17830 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
17840 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65  L;........} else
17850 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c   {.........ulVal
17860 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
17870 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a  d_ret;........}.
17880 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62  ......}........b
17890 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
178a0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a  CKO_CERTIFICATE:
178b0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
178c0 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09  certificate;....
178d0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
178e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
178f0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
17900 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17920 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
17930 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
17940 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17950 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17960 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17970 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09  CKA_ISSUER:.....
17980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17990 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
179a0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53  attribute CKA_IS
179b0 53 55 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  SUER (0x%08lx) .
179c0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
179d0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
179e0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
179f0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
17a00 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
17a10 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
17a20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
17a30 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
17a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17a50 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
17a60 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
17a70 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
17a80 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
17a90 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
17aa0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
17ab0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
17ac0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
17ad0 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
17ae0 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
17af0 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72  09_to_issuer(cer
17b00 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
17b10 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
17b20 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
17b30 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
17b40 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
17b50 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
17b60 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
17b70 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
17b80 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
17b90 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17bb0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
17bc0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
17bd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17be0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17bf0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17c00 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45  CKA_SERIAL_NUMBE
17c10 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
17c20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17c30 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17c40 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42   CKA_SERIAL_NUMB
17c50 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
17c60 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17c70 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17c80 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
17c90 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
17ca0 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
17cb0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
17cc0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17cd0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17cf0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17d00 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17d10 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
17d20 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
17d30 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
17d40 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
17d50 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
17d60 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
17d70 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
17d80 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
17d90 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
17da0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
17db0 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
17dc0 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
17dd0 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
17de0 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
17df0 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
17e00 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
17e10 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
17e20 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
17e30 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17e40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17e50 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
17e60 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
17e70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17e80 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17e90 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17ea0 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09  CKA_SUBJECT:....
17eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17ec0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
17ed0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
17ee0 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29  UBJECT (0x%08lx)
17ef0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
17f00 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17f10 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
17f20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
17f30 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29  CKO_CERTIFICATE)
17f40 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
17f50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17f60 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
17f70 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
17f80 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66  are not a certif
17f90 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62  icate");.......b
17fa0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
17fb0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
17fc0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
17fd0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
17fe0 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63  = x509_to_subjec
17ff0 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  t(certificate, c
18000 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
18010 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
18020 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
18030 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
18040 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
18050 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
18060 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
18070 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
18080 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
18090 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
180a0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
180b0 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
180c0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
180d0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
180e0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
180f0 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09  case CKA_ID:....
18100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18110 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18120 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49   attribute CKA_I
18130 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
18140 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18150 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18160 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18170 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
18180 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
18190 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
181a0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
181b0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
181c0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
181d0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
181e0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
181f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
18200 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d  .....ucTmpBuf[0]
18210 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75   = ((identity_nu
18220 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30  m + 1) >> 8) & 0
18230 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75  xff;.....ucTmpBu
18240 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74  f[1] =  (identit
18250 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66  y_num + 1) & 0xf
18260 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  f;......pValue =
18270 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09   &ucTmpBuf;.....
18280 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a  ulValueLen = 2;.
18290 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
182a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
182b0 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
182c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
182d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
182e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
182f0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
18300 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
18310 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18320 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18330 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18340 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
18350 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
18360 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
18370 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
18380 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
18390 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
183a0 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a  _CERTIFICATE) {.
183b0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
183c0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
183d0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
183e0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
183f0 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
18400 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  te.");.......bre
18410 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f  ak;.....}....../
18420 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72  * We only suppor
18430 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  t one certificat
18440 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b  e type */.....ck
18450 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
18460 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a  e = CKC_X_509;..
18470 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18480 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
18490 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
184a0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65  n = sizeof(ck_ce
184b0 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b  rtificate_type);
184c0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
184d0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
184e0 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f  returning CKC_X_
184f0 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c  509 (%lu) (%p/%l
18500 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
18510 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49  ong) *((CK_CERTI
18520 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70  FICATE_TYPE *) p
18530 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18540 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18550 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18560 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18570 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09   CKA_KEY_TYPE:..
18580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18590 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
185a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
185b0 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25 30 38  _KEY_TYPE (0x%08
185c0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
185d0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
185e0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
185f0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18600 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  != CKO_PRIVATE_K
18610 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
18620 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  s != CKO_PUBLIC_
18630 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  KEY) {......CACK
18640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18650 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
18660 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
18670 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65   we are not a ke
18680 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  y.");.......brea
18690 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
186a0 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
186b0 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f   one key type */
186c0 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65  .....ck_key_type
186d0 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09   = CKK_RSA;.....
186e0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65  .pValue = &ck_ke
186f0 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61  y_type;.....ulVa
18700 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18710 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09  ck_key_type);...
18720 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18730 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18740 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28  urning CKK_RSA (
18750 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
18760 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18770 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
18780 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
18790 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
187a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
187b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
187c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
187d0 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  SIGN:.....CACKEY
187e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
187f0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18800 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78  ute CKA_SIGN (0x
18810 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18820 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18830 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18840 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
18850 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
18860 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
18870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18880 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
18890 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
188a0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
188b0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
188c0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
188d0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
188e0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
188f0 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
18900 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
18910 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
18920 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
18930 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
18940 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
18950 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18960 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
18970 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18980 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
18990 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
189a0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
189b0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
189c0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
189d0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
189e0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
189f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18a00 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18a10 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18a20 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
18a30 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09  GN_RECOVER:.....
18a40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18a50 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18a60 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49  attribute CKA_SI
18a70 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30  GN_RECOVER (0x%0
18a80 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18a90 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18aa0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18ab0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18ac0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18ad0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18ae0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18af0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
18b00 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
18b10 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
18b20 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18b30 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
18b40 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a  k;.....}....../*
18b50 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   We currently on
18b60 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e  ly support "Sign
18b70 20 77 69 74 68 20 41 70 70 65 6e 64 69 78 22 20   with Appendix" 
18b80 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  */.....pValue = 
18b90 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
18ba0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18bb0 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
18bc0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18bd0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18be0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18bf0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18c00 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
18c10 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
18c20 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18c30 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18c40 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18c50 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59  ..case CKA_DECRY
18c60 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  PT:.....CACKEY_D
18c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18c80 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18c90 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30  e CKA_DECRYPT (0
18ca0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18cb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18cc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18cd0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18ce0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18cf0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18d00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18d10 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18d20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18d30 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18d40 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18d50 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18d60 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18d70 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18d80 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
18d90 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61  KEY || objectcla
18da0 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43  ss == CKO_PUBLIC
18db0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
18dc0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
18dd0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18de0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
18df0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
18e00 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18e10 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
18e20 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18e30 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
18e40 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
18e50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18e60 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
18e70 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
18e80 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
18e90 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
18ea0 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
18eb0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18ec0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18ed0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18ee0 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43  SENSITIVE:.....C
18ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18f00 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18f10 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e  ttribute CKA_SEN
18f20 53 49 54 49 56 45 20 28 30 78 25 30 38 6c 78 29  SITIVE (0x%08lx)
18f30 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18f40 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18f50 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18f60 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
18f70 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18f80 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18f90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18fa0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
18fb0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
18fc0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
18fd0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
18fe0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
18ff0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
19000 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
19010 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
19020 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
19030 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
19040 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
19050 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
19060 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
19070 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
19080 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
19090 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
190a0 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
190b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
190c0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
190d0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
190e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
190f0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
19100 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
19110 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
19120 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
19130 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
19140 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41  ase CKA_EXTRACTA
19150 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BLE:.....CACKEY_
19160 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19170 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19180 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42  te CKA_EXTRACTAB
19190 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  LE (0x%08lx) ...
191a0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
191b0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
191c0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
191d0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
191e0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
191f0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19200 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19210 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19220 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19230 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
19240 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
19250 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
19260 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19270 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49  class == CKO_PRI
19280 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09  VATE_KEY) {.....
19290 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
192a0 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
192b0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
192c0 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
192d0 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
192e0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
192f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
19300 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
19310 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
19320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19330 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
19340 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
19350 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
19360 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
19370 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
19380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
19390 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
193a0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
193b0 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09  CKA_MODULUS:....
193c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
193d0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
193e0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d   attribute CKA_M
193f0 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29  ODULUS (0x%08lx)
19400 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
19410 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
19420 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
19430 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
19440 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
19450 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
19460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19470 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
19480 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
19490 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
194a0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
194b0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
194c0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
194d0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
194e0 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
194f0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
19500 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69  to_modulus(certi
19510 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
19520 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
19530 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
19540 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
19550 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
19560 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
19570 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
19580 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
19590 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
195a0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
195b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
195c0 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f  . returning (%p/
195d0 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28  %lu)", pValue, (
195e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
195f0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19600 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
19610 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
19620 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ENT:.....CACKEY_
19630 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19640 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19650 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58  te CKA_PUBLIC_EX
19660 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29  PONENT (0x%08lx)
19670 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
19680 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
19690 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
196a0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
196b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
196c0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
196d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
196e0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
196f0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
19700 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
19710 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19720 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
19730 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65  ...}......if (ce
19740 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d  rtificate_len >=
19750 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f   0) {......x509_
19760 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
19770 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74  to_exponent(cert
19780 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
19790 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
197a0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
197b0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
197c0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
197d0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
197e0 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
197f0 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
19800 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
19810 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
19820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19830 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70  .. returning (%p
19840 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20  /%lu)", pValue, 
19850 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
19860 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
19870 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
19880 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54   CKA_TRUST_DIGIT
19890 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09  AL_SIGNATURE:...
198a0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
198b0 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a  NON_REPUDIATION:
198c0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
198d0 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d  ST_KEY_ENCIPHERM
198e0 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
198f0 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49  _TRUST_DATA_ENCI
19900 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73  PHERMENT:....cas
19910 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f  e CKA_TRUST_KEY_
19920 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61  AGREEMENT:....ca
19930 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
19940 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63  _CERT_SIGN:....c
19950 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52  ase CKA_TRUST_CR
19960 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20  L_SIGN:....case 
19970 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52  CKA_TRUST_SERVER
19980 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43  _AUTH:....case C
19990 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f  KA_TRUST_CLIENT_
199a0 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b  AUTH:....case CK
199b0 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47  A_TRUST_CODE_SIG
199c0 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b  NING:....case CK
199d0 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52  A_TRUST_EMAIL_PR
199e0 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41  OTECTION:.....CA
199f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19a00 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
19a10 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53  tribute CKA_TRUS
19a20 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20  T_... (0x%08lx) 
19a30 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
19a40 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
19a50 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c  type);......pVal
19a60 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64  ue = &ck_trusted
19a70 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19a80 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
19a90 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b  sted);......CACK
19aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19ab0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
19ac0 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
19ad0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
19ae0 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56  ((CK_TRUST *) pV
19af0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
19b00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
19b10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19b20 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
19b30 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
19b40 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SH:.....CACKEY_D
19b50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
19b60 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
19b70 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
19b80 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
19b90 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19ba0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
19bb0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
19bc0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
19bd0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
19be0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
19bf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19c00 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
19c10 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
19c20 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
19c30 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
19c40 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
19c50 0a 09 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31  .....}......SHA1
19c60 52 65 73 65 74 28 26 73 68 61 31 5f 63 74 78 29  Reset(&sha1_ctx)
19c70 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75 74 28  ;.....SHA1Input(
19c80 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69  &sha1_ctx, certi
19c90 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
19ca0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48  ate_len);.....SH
19cb0 41 31 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63  A1Result(&sha1_c
19cc0 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a  tx, sha1_hash);.
19cd0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68  .....pValue = sh
19ce0 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56  a1_hash;.....ulV
19cf0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
19d00 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09  (sha1_hash);....
19d10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d20 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19d30 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
19d40 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19d50 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19d60 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19d70 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
19d80 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43  _MD5_HASH:.....C
19d90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19da0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19db0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
19dc0 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30  T_MD5_HASH (0x%0
19dd0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
19de0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
19df0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19e00 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19e10 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
19e20 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
19e30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19e40 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
19e50 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
19e60 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
19e70 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19e80 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19e90 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19ea0 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63  ..MD5Init(&md5_c
19eb0 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61  tx);.....MD5Upda
19ec0 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72  te(&md5_ctx, cer
19ed0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
19ee0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
19ef0 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73  MD5Final(md5_has
19f00 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09  h, &md5_ctx);...
19f10 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f  ...pValue = md5_
19f20 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75  hash;.....ulValu
19f30 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64  eLen = sizeof(md
19f40 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41  5_hash);......CA
19f50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19f60 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
19f70 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
19f80 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
19f90 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
19fa0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64  .....break;....d
19fb0 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c  efault:.....pVal
19fc0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75  ue = NULL;.....u
19fd0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
19fe0 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72  LONG) -1;.....br
19ff0 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  eak;...}....if (
1a000 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c  ((CK_LONG) ulVal
1a010 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c  ueLen) != ((CK_L
1a020 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f  ONG) -1)) {..../
1a030 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74 74 72  * Push curr_attr
1a040 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
1a050 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e  */....curr_attr.
1a060 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72  type = curr_attr
1a070 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61  _type;....curr_a
1a080 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ttr.ulValueLen =
1a090 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09   ulValueLen;....
1a0a0 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75  .curr_attr.pValu
1a0b0 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
1a0c0 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  attr.ulValueLen)
1a0d0 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  ;....memcpy(curr
1a0e0 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56  _attr.pValue, pV
1a0f0 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e  alue, curr_attr.
1a100 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
1a110 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65  .if (pValue_free
1a120 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09   && pValue) {...
1a130 09 09 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a  ..free(pValue);.
1a140 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d  ...}.....if (num
1a150 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f  attrs >= retval_
1a160 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74  count) {.....ret
1a170 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65  val = realloc(re
1a180 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75  tval, retval_cou
1a190 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
1a1a0 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  val));....}.....
1a1b0 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e  memcpy(&retval[n
1a1c0 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f  umattrs], &curr_
1a1d0 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72  attr, sizeof(cur
1a1e0 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d  r_attr));....num
1a1f0 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  attrs++;...}..}.
1a200 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21  ..if (numattrs !
1a210 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f  = 0) {...retval_
1a220 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73  count = numattrs
1a230 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ;...retval = rea
1a240 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
1a250 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
1a260 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d  of(*retval));..}
1a270 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72   else {...free(r
1a280 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61  etval);....retva
1a290 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a  l = NULL;..}...*
1a2a0 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74  pulCount = numat
1a2b0 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  trs;...CACKEY_DE
1a2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1a2d0 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74  rning %lu object
1a2e0 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74  s (%p).", numatt
1a2f0 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74  rs, (void *) ret
1a300 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
1a310 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
1a320 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
1a330 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ee_identities(st
1a340 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
1a350 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
1a360 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
1a370 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
1a380 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  ) {..CK_ATTRIBUT
1a390 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75  E *curr_attr;..u
1a3a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f  nsigned long id_
1a3b0 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a  idx, attr_idx;..
1a3c0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20  .if (identities 
1a3d0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74  == NULL || ident
1a3e0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30  ities_count == 0
1a3f0 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
1a400 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d  ...for (id_idx =
1a410 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65   0; id_idx < ide
1a420 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69  ntities_count; i
1a430 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  d_idx++) {...if 
1a440 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1a450 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
1a460 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69  {....for (attr_i
1a470 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78  dx = 0; attr_idx
1a480 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64   < identities[id
1a490 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1a4a0 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  _count; attr_idx
1a4b0 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61  ++) {.....curr_a
1a4c0 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65  ttr = &identitie
1a4d0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a4e0 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a  utes[attr_idx];.
1a4f0 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  .....if (curr_at
1a500 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09  tr->pValue) {...
1a510 09 09 09 66 72 65 65 28 63 75 72 72 5f 61 74 74  ...free(curr_att
1a520 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  r->pValue);.....
1a530 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69  }....}.....if (i
1a540 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a550 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
1a560 09 09 09 09 66 72 65 65 28 69 64 65 6e 74 69 74  ....free(identit
1a570 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a580 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09  ibutes);....}...
1a590 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1a5a0 72 74 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69  rts(identities[i
1a5b0 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1a5c0 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d  tity, 1, 1);...}
1a5d0 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74  ..}...free(ident
1a5e0 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69  ities);.}..stati
1a5f0 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  c unsigned long 
1a600 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1a610 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1a620 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74  t cackey_identit
1a630 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75  y *identities, u
1a640 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
1a650 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75  _dod_certs) {..u
1a660 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72  nsigned long cer
1a670 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20  t_idx, id_idx = 
1a680 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  0;...if (identit
1a690 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
1a6a0 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f  .return(num_dod_
1a6b0 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a  certs * 3);..}..
1a6c0 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d  .for (cert_idx =
1a6d0 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e   0; cert_idx < n
1a6e0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65  um_dod_certs; ce
1a6f0 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64  rt_idx++) {...id
1a700 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a710 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1a720 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74   NULL;...identit
1a730 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a740 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1a750 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
1a760 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20  KO_CERTIFICATE, 
1a770 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
1a780 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
1a790 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1a7a0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a7b0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1a7c0 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ;...id_idx++;...
1a7d0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a7e0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1a7f0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
1a800 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a810 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
1a820 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
1a830 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  s(CKO_PUBLIC_KEY
1a840 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
1a850 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
1a860 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
1a870 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a880 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
1a890 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
1a8a0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1a8b0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1a8c0 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
1a8d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a8e0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
1a8f0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
1a900 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45  tes(CKO_NETSCAPE
1a910 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63  _TRUST, &extra_c
1a920 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
1a930 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
1a940 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1a950 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a960 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
1a970 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  dx++;..}...retur
1a980 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74  n(id_idx);.}..st
1a990 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
1a9a0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63  ey_identity *cac
1a9b0 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74  key_read_identit
1a9c0 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  ies(struct cacke
1a9d0 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
1a9e0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73  signed long *ids
1a9f0 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63  _found) {..struc
1aa00 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
1aa10 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65  entity *pcsc_ide
1aa20 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74  ntities;..struct
1aa30 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
1aa40 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75   *identities;..u
1aa50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
1aa60 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75  _ids, id_idx, cu
1aa70 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73  rr_id_type;..uns
1aa80 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63  igned long num_c
1aa90 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  erts, num_dod_ce
1aaa0 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09  rts, cert_idx;..
1aab0 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72  int include_extr
1aac0 61 5f 63 65 72 74 73 20 3d 20 30 2c 20 69 6e 63  a_certs = 0, inc
1aad0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a  lude_dod_certs;.
1aae0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1aaf0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ab00 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e  ;...if (ids_foun
1ab10 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  d == NULL) {...C
1ab20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ab30 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f  TF("Error.  ids_
1ab40 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b  found is NULL");
1ab50 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
1ab60 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
1ab70 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e  KEY_CARD_SLOT_IN
1ab80 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54  CLUDE_EXTRA_CERT
1ab90 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  S..include_extra
1aba0 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64  _certs = 1;.#end
1abb0 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
1abc0 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54  "CACKEY_DOD_CERT
1abd0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
1abe0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1abf0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1ac00 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 1;..}...if (g
1ac10 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
1ac20 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57  _DOD_CERTS_ON_HW
1ac30 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _SLOTS") != NULL
1ac40 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78  ) {...include_ex
1ac50 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  tra_certs = 0;..
1ac60 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
1ac70 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a  _NO_EXTRA_CERTS.
1ac80 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1ac90 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22  KEY_EXTRA_CERTS"
1aca0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
1acb0 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1acc0 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
1acd0 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1ace0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73  rts = 0;..}.#els
1acf0 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  e..if (getenv("C
1ad00 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1ad10 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1ad20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1ad30 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c  certs = 0;..} el
1ad40 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1ad50 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  od_certs = 1;..}
1ad60 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e  .#endif...if (in
1ad70 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 29  clude_dod_certs)
1ad80 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
1ad90 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72  ts = sizeof(extr
1ada0 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f  a_certs) / sizeo
1adb0 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d  f(extra_certs[0]
1adc0 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e  );..} else {...n
1add0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  um_dod_certs = 0
1ade0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  ;..}...if (slot-
1adf0 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e  >internal) {...n
1ae00 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f  um_ids = cackey_
1ae10 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1ae20 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f  ies(NULL, num_do
1ae30 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20  d_certs);....if 
1ae40 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b  (num_ids != 0) {
1ae50 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
1ae60 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
1ae70 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
1ae80 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b  ties));.....cack
1ae90 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1aea0 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1aeb0 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  s, num_dod_certs
1aec0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1aed0 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
1aee0 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f  LL;...}....*ids_
1aef0 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b  found = num_ids;
1af00 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ....return(ident
1af10 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73  ities);..}...pcs
1af20 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
1af30 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
1af40 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75  (slot, NULL, &nu
1af50 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70  m_certs);..if (p
1af60 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
1af70 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43  = NULL) {.../* C
1af80 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66  onvert number of
1af90 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72   Certs to number
1afa0 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09   of objects */..
1afb0 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f  .num_ids = (CKO_
1afc0 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b  PRIVATE_KEY - CK
1afd0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20  O_CERTIFICATE + 
1afe0 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  1) * num_certs;.
1aff0 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65  ...if (include_e
1b000 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09  xtra_certs) {...
1b010 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b  .num_ids += cack
1b020 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1b030 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d  tities(NULL, num
1b040 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d  _dod_certs);...}
1b050 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d  ....identities =
1b060 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20   malloc(num_ids 
1b070 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  * sizeof(*identi
1b080 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64  ties));..../* Ad
1b090 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20  d certificates, 
1b0a0 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64  public keys, and
1b0b0 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72   private keys fr
1b0c0 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64  om the smartcard
1b0d0 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30   */...id_idx = 0
1b0e0 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64  ;...for (cert_id
1b0f0 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20  x = 0; cert_idx 
1b100 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72  < num_certs; cer
1b110 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f  t_idx++) {....fo
1b120 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20  r (curr_id_type 
1b130 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
1b140 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20  E; curr_id_type 
1b150 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  <= CKO_PRIVATE_K
1b160 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  EY; curr_id_type
1b170 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69  ++) {.....identi
1b180 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1b190 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1b1a0 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1b1b0 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70  curr_id_type, &p
1b1c0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
1b1d0 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69  ert_idx], cert_i
1b1e0 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1b1f0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1b200 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09  es_count);......
1b210 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1b220 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1b230 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
1b240 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
1b250 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1b260 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79  ty));.....memcpy
1b270 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1b280 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1b290 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  y, &pcsc_identit
1b2a0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73  ies[cert_idx], s
1b2b0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1b2c0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1b2d0 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09  dentity));......
1b2e0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1b2f0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1b300 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ->certificate = 
1b310 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e  malloc(pcsc_iden
1b320 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
1b330 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
1b340 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64  );.....memcpy(id
1b350 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1b360 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  .pcsc_identity->
1b370 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73  certificate, pcs
1b380 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1b390 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t_idx].certifica
1b3a0 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
1b3b0 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1b3c0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
1b3d0 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09  .....id_idx++;..
1b3e0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  ..}...}....if (i
1b3f0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1b400 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ts) {....CACKEY_
1b410 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
1b420 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72  cluding US Gover
1b430 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74  nment Certificat
1b440 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73  es on hardware s
1b450 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  lot");.....cacke
1b460 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1b470 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
1b480 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64   + id_idx, num_d
1b490 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a  od_certs);...}..
1b4a0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1b4b0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
1b4c0 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
1b4d0 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e  1);....*ids_foun
1b4e0 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09  d = num_ids;....
1b4f0 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65  return(identitie
1b500 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66  s);..}....*ids_f
1b510 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72  ound = 0;..retur
1b520 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44  n(NULL);.}..CK_D
1b530 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b540 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69  K_RV, C_Initiali
1b550 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
1b560 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b  pInitArgs) {..CK
1b570 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52  _C_INITIALIZE_AR
1b580 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a  GS CK_PTR args;.
1b590 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68  .uint32_t idx, h
1b5a0 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e  ighest_slot;..in
1b5b0 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74  t mutex_init_ret
1b5c0 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 64  ;..int include_d
1b5d0 6f 64 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b  od_certs;...CACK
1b5e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b5f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1b600 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
1b610 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1b620 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b630 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
1b640 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1b650 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1b660 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
1b670 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1b680 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21  .if (pInitArgs !
1b690 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73  = NULL) {...args
1b6a0 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09   = pInitArgs;...
1b6b0 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61  memcpy(&cackey_a
1b6c0 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f  rgs, args, sizeo
1b6d0 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b  f(cackey_args));
1b6e0 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1b6f0 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  eateMutex == NUL
1b700 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1b710 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  oyMutex == NULL 
1b720 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1b730 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1b740 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1b750 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  == NULL) {....if
1b760 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1b770 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1b780 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1b790 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1b7a0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  s->LockMutex != 
1b7b0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1b7c0 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  lockMutex != NUL
1b7d0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
1b7e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b7f0 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e  ror. Some, but n
1b800 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67  ot All threading
1b810 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
1b820 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ided.");......re
1b830 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b840 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09  TS_BAD);....}...
1b850 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
1b860 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
1b870 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1b880 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
1b890 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
1b8a0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
1b8b0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1b8c0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
1b8d0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
1b8e0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1b8f0 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
1b900 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1b910 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1b920 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1b930 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1b940 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1b950 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1b960 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1b970 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
1b980 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1b990 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1b9a0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1b9b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1b9c0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
1b9d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b9e0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63  .active = 0;...c
1b9f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1ba00 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
1ba10 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ULL;...cackey_sl
1ba20 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1ba30 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1ba40 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1ba50 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
1ba60 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
1ba70 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1ba80 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
1ba90 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1baa0 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f  lots[idx].token_
1bab0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63  flags = 0;...cac
1bac0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
1bad0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  abel = NULL;...c
1bae0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1baf0 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09  .internal = 0;..
1bb00 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
1bb10 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a  _NO_EXTRA_CERTS.
1bb20 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1bb30 4b 45 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22  KEY_EXTRA_CERTS"
1bb40 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  ) != NULL) {...i
1bb50 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1bb60 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   = 1;..} else {.
1bb70 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1bb80 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73  rts = 0;..}.#els
1bb90 65 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  e..if (getenv("C
1bba0 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1bbb0 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1bbc0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f  {...include_dod_
1bbd0 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c  certs = 0;..} el
1bbe0 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  se {...include_d
1bbf0 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  od_certs = 1;..}
1bc00 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e  .#endif...if (in
1bc10 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1bc20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1bc30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
1bc40 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c  sked not to incl
1bc50 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69 63  ude DoD certific
1bc60 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20  ates");..} else 
1bc70 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74  {...highest_slot
1bc80 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
1bc90 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1bca0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1bcb0 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b  ])) - 1;....CACK
1bcc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bcd0 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63  "Including DoD c
1bce0 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75  erts in slot %lu
1bcf0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1bd00 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29  g) highest_slot)
1bd10 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ;....cackey_slot
1bd20 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1bd30 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61  active = 1;...ca
1bd40 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1bd50 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  st_slot].interna
1bd60 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f  l = 1;...cackey_
1bd70 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1bd80 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73  ot].label = (uns
1bd90 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55  igned char *) "U
1bda0 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1bdb0 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61  tificates";...ca
1bdc0 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1bdd0 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  st_slot].pcsc_re
1bde0 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b  ader = "CACKey";
1bdf0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1be00 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f  highest_slot].to
1be10 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
1be20 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  }...cackey_initi
1be30 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66  alized = 1;...if
1be40 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63   (!cackey_bigloc
1be50 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65  k_init) {...mute
1be60 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63  x_init_ret = cac
1be70 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65  key_mutex_create
1be80 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (&cackey_biglock
1be90 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
1bea0 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b  init_ret != 0) {
1beb0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1bec0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1bed0 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a   Mutex initializ
1bee0 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b  ation failed.");
1bef0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1bf00 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a  CANT_LOCK);...}.
1bf10 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ...cackey_bigloc
1bf20 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a  k_init = 1;..}..
1bf30 09 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d  ./* Define a com
1bf40 6d 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75  mand to prompt u
1bf50 73 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f  ser for a PIN */
1bf60 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
1bf70 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1bf80 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  LT..cackey_pin_c
1bf90 6f 6d 6d 61 6e 64 20 3d 20 43 41 43 4b 45 59 5f  ommand = CACKEY_
1bfa0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
1bfb0 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f  ULT_XSTR(CACKEY_
1bfc0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
1bfd0 55 4c 54 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  ULT);.#endif..#i
1bfe0 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f  fdef CACKEY_PIN_
1bff0 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45  COMMAND_XONLY_DE
1c000 46 41 55 4c 54 0a 09 69 66 20 28 67 65 74 65 6e  FAULT..if (geten
1c010 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1c020 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1c030 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 43  _pin_command = C
1c040 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c050 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28 43  D_DEFAULT_XSTR(C
1c060 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1c070 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 29  D_XONLY_DEFAULT)
1c080 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ;..}.#endif...if
1c090 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1c0a0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21  _PIN_COMMAND") !
1c0b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
1c0c0 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1c0d0 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f   getenv("CACKEY_
1c0e0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a 09  PIN_COMMAND");..
1c0f0 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1c100 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1c110 4e 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55  ND_XONLY") != NU
1c120 4c 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44 49  LL && getenv("DI
1c130 53 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29  SPLAY") != NULL)
1c140 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f   {...cackey_pin_
1c150 63 6f 6d 6d 61 6e 64 20 3d 20 67 65 74 65 6e 76  command = getenv
1c160 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  ("CACKEY_PIN_COM
1c170 4d 41 4e 44 5f 58 4f 4e 4c 59 22 29 3b 0a 09 7d  MAND_XONLY");..}
1c180 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c190 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c1a0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c1b0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c1c0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c1d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c1e0 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69  (CK_RV, C_Finali
1c1f0 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
1c200 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69  pReserved) {..ui
1c210 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
1c220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c230 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c240 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
1c250 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c260 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c270 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
1c280 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1c290 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c2a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c2b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c2c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c2d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c2e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c2f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c300 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c310 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c320 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c330 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1c340 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1c350 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1c360 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1c370 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1c380 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
1c390 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1c3a0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43  active) {....C_C
1c3b0 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
1c3c0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
1c3d0 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
1c3e0 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20  ct_all();...for 
1c3f0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1c400 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c410 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1c420 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1c430 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1c440 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1c450 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
1c460 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
1c470 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1c480 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
1c490 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
1c4a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c4b0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
1c4c0 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
1c4d0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1c4e0 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  hed_certs) {....
1c4f0 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1c500 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  s(cackey_slots[i
1c510 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1c520 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  , cackey_slots[i
1c530 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1c540 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09  _count, 1);.....
1c550 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c560 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ].cached_certs =
1c570 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1c580 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1c590 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b  onnect();...cack
1c5a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1c5b0 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1c5c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c5d0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c5e0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1c5f0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1c600 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c610 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1c620 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
1c630 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1c640 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1c650 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1c660 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1c670 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1c680 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
1c690 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1c6a0 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
1c6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c6c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1c6d0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1c6e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c6f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c700 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1c710 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c720 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1c730 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1c740 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c750 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c760 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c770 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c780 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c790 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c7a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c7b0 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1c7c0 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
1c7d0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1c7e0 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1c7f0 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1c800 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1c810 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1c820 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1c830 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1c840 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1c850 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1c860 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1c870 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1c880 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1c890 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1c8a0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1c8b0 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
1c8c0 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
1c8d0 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
1c8e0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1c8f0 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
1c900 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1c910 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1c920 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
1c930 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1c940 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1c950 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1c960 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
1c970 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
1c980 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
1c990 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
1c9a0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1c9b0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
1c9c0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1c9d0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1c9e0 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
1c9f0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1ca00 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1ca10 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1ca20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ca30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ca40 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1ca50 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1ca60 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1ca70 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
1ca80 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
1ca90 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
1caa0 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
1cab0 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
1cac0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1cad0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1cae0 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
1caf0 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
1cb00 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
1cb10 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
1cb20 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
1cb30 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69  unt) {..static i
1cb40 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  nt first_call = 
1cb50 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
1cb60 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f  tval;..int pcsc_
1cb70 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b  connect_ret;..CK
1cb80 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c  _ULONG count, sl
1cb90 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75  ot_count = 0, cu
1cba0 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78  rrslot, slot_idx
1cbb0 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
1cbc0 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
1cbd0 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
1cbe0 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20  aders_e;..DWORD 
1cbf0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1cc00 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69  ;..LONG scard_li
1cc10 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09  streaders_ret;..
1cc20 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64  size_t curr_read
1cc30 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f  er_len;..int slo
1cc40 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45  t_reset;...CACKE
1cc50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cc60 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1cc70 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
1cc80 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1cc90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cca0 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  r. pulCount is N
1ccb0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1ccc0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1ccd0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1cce0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1ccf0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1cd00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cd10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1cd20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1cd30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1cd40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1cd50 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1cd60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1cd70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1cd80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1cd90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1cda0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cdb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cdc0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1cdd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cde0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1cdf0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72  );..}.../* Clear
1ce00 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a   list of slots *
1ce10 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  /..slot_reset = 
1ce20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  0;..if (pSlotLis
1ce30 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74  t) {...if (first
1ce40 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73  _call) {....firs
1ce50 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09  t_call = 0;.....
1ce60 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
1ce70 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79  ..}..../* If any
1ce80 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61   of the slots ha
1ce90 76 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68  ve been reset th
1cea0 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66  en purge all inf
1ceb0 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65  ormation and che
1cec0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f  ck again */...fo
1ced0 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1cee0 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1cef0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1cf00 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1cf10 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1cf20 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69  rrslot++) {....i
1cf30 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1cf40 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1cf50 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
1cf60 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
1cf70 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1cf80 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1cf90 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1cfa0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
1cfb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1cfc0 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  lot].slot_reset)
1cfd0 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65   {.....slot_rese
1cfe0 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61  t = 1;......brea
1cff0 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  k;....}...}....i
1d000 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
1d010 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1d020 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
1d030 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
1d040 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a  ation.");...../*
1d050 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65   Only update the
1d060 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69   list of slots i
1d070 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c  f we are actuall
1d080 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74  y being supply t
1d090 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  he slot informat
1d0a0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
1d0b0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1d0c0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72  t_all();.....for
1d0d0 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
1d0e0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1d0f0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1d100 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1d110 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1d120 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69  rslot++) {.....i
1d130 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d140 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1d150 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69  al) {......conti
1d160 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
1d170 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1d180 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1d190 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66  reader) {......f
1d1a0 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
1d1b0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1d1c0 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63  reader);.......c
1d1d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d1e0 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1d1f0 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  r = NULL;.....}.
1d200 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d210 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d220 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72  label) {......fr
1d230 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1d240 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
1d250 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1d260 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1d270 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
1d280 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
1d290 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1d2a0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a  ctive = 0;....}.
1d2b0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09  ..} else {......
1d2c0 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
1d2d0 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61  mine list of rea
1d2e0 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f  ders */..pcsc_co
1d2f0 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
1d300 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
1d310 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
1d320 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
1d330 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
1d340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d350 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
1d360 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
1d370 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
1d380 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
1d390 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
1d3a0 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
1d3b0 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
1d3c0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1d3d0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1d3e0 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1d3f0 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1d400 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1d410 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09  readers_len);...
1d420 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1d430 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1d440 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1d450 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1d460 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d470 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  r. SCardListRead
1d480 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  ers() returned S
1d490 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
1d4a0 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e  R, assuming Conn
1d4b0 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1d4c0 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e  went away. Recon
1d4d0 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  necting.");.....
1d4e0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1d4f0 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
1d500 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1d510 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ();.....CACKEY_D
1d520 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
1d530 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61  ing SCardListRea
1d540 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  ders() again");.
1d550 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1d560 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1d570 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1d580 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1d590 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1d5a0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1d5b0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
1d5c0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1d5d0 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1d5e0 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
1d5f0 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
1d600 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1d610 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
1d620 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1d630 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
1d640 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
1d650 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1d660 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1d670 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1d680 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1d690 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
1d6a0 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
1d6b0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
1d6c0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1d6d0 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1d6e0 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
1d6f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
1d700 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
1d710 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1d720 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20  ;....../* Start 
1d730 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
1d740 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
1d750 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
1d760 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
1d770 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
1d780 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
1d790 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
1d7a0 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75  594911 */.....cu
1d7b0 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09  rrslot = 1;.....
1d7c0 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1d7d0 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
1d7e0 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
1d7f0 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1d800 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76  ./* Find next av
1d810 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a  ailable slot */.
1d820 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72  .....for (; curr
1d830 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1d840 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1d850 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d860 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1d870 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20  t++) {.......if 
1d880 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1d890 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1d8a0 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
1d8b0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1d8c0 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
1d8d0 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
1d8e0 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1d8f0 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
1d900 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
1d910 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
1d920 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
1d930 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1d940 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
1d950 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
1d960 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1d970 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1d980 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
1d990 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d9a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d9b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1d9c0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1d9d0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d9e0 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
1d9f0 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
1da00 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
1da10 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1da20 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1da30 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1da40 64 20 72 65 61 64 65 72 3a 20 25 73 20 28 63 75  d reader: %s (cu
1da50 72 72 73 6c 6f 74 20 3d 20 25 6c 75 29 22 2c 20  rrslot = %lu)", 
1da60 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 28 75  pcsc_readers, (u
1da70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
1da80 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 2f  rrslot);......./
1da90 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68  * Only update th
1daa0 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20  e list of slots 
1dab0 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c  if we are actual
1dac0 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73  ly being asked s
1dad0 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69  upply the slot i
1dae0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09  nformation */...
1daf0 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
1db00 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c  ) {.......if (sl
1db10 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
1db20 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1db30 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1db40 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63   = 1;........cac
1db50 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1db60 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  ot].internal = 0
1db70 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1db80 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1db90 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74  pcsc_reader = st
1dba0 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65 72  rdup(pcsc_reader
1dbb0 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65  s);........cacke
1dbc0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1dbd0 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
1dbe0 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09  ected = 0;......
1dbf0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1dc00 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63  urrslot].transac
1dc10 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1dc20 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1dc30 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
1dc40 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
1dc50 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09  w_lock = 0;.....
1dc60 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69  ...if (cackey_pi
1dc70 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e 55 4c  n_command == NUL
1dc80 4c 29 20 7b 0a 09 09 09 09 09 09 09 09 63 61 63  L) {.........cac
1dc90 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1dca0 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1dcb0 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1dcc0 49 52 45 44 3b 0a 09 09 09 09 09 09 09 7d 20 65  IRED;........} e
1dcd0 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 63 61  lse {.........ca
1dce0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1dcf0 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
1dd00 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 7d 0a 09   = 0;........}..
1dd10 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1dd20 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1dd30 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
1dd40 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
1dd50 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
1dd60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1dd70 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ]);.......}.....
1dd80 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1dd90 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1dda0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1ddb0 76 65 29 20 7b 0a 09 09 09 09 09 09 09 2f 2a 20  ve) {......../* 
1ddc0 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63  Artificially inc
1ddd0 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72  rease the number
1dde0 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73   of active slots
1ddf0 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65   by what will be
1de00 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09  come active */..
1de10 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1de20 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1de30 20 69 6e 2d 61 63 74 69 76 65 20 73 6c 6f 74 20   in-active slot 
1de40 25 6c 75 2c 20 62 75 74 20 69 74 20 77 69 6c 6c  %lu, but it will
1de50 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
1de60 20 61 20 72 65 73 65 74 20 2d 2d 20 6d 61 72 6b   a reset -- mark
1de70 69 6e 67 20 61 73 20 61 63 74 69 76 65 20 66 6f  ing as active fo
1de80 72 20 61 63 63 6f 75 6e 74 69 6e 67 20 70 75 72  r accounting pur
1de90 70 6f 73 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  poses", (unsigne
1dea0 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74  d long) currslot
1deb0 29 3b 0a 0a 09 09 09 09 09 09 09 73 6c 6f 74 5f  );.........slot_
1dec0 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 09 7d  count++;.......}
1ded0 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72  ......}......cur
1dee0 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70  rslot++;.......p
1def0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
1df00 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
1df10 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66   1;.....}......f
1df20 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1df30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1df40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1df50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1df60 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1df70 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1df80 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1df90 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1dfa0 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ive) {.......CAC
1dfb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dfc0 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20 73  ("Found active s
1dfd0 6c 6f 74 20 25 6c 75 2c 20 72 65 61 64 65 72 20  lot %lu, reader 
1dfe0 3d 20 25 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  = %s", (unsigned
1dff0 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 2c   long) currslot,
1e000 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75   cackey_slots[cu
1e010 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1e020 64 65 72 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f  der);........slo
1e030 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1e040 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  }.....}....} els
1e050 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  e {.....CACKEY_D
1e060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
1e070 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  ond call to SCar
1e080 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
1e090 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
1e0a0 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
1e0b0 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
1e0c0 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
1e0d0 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
1e0e0 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
1e0f0 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
1e100 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63  .}.....free(pcsc
1e110 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d  _readers_s);...}
1e120 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
1e130 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e140 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43  First call to SC
1e150 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1e160 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1e170 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1e180 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1e190 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1e1a0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1e1b0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1e1c0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1e1d0 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
1e1e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1e1f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e210 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e220 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e240 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1e250 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1e260 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1e270 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
1e280 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1e290 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1e2a0 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b  nt = slot_count;
1e2b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e2c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e2d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
1e2e0 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
1e2f0 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72  rs, but not stor
1e300 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69  ing IDs (pSlotLi
1e310 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b  st == NULL)", CK
1e320 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1e330 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1e340 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e350 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74  _OK);..}...count
1e360 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69   = *pulCount;..i
1e370 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f  f (count < slot_
1e380 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45  count) {...CACKE
1e390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e3a0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1e3b0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1e3c0 73 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25  s, but we have %
1e3d0 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f  lu entries.", co
1e3e0 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  unt, slot_count)
1e3f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
1e400 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1e410 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  ing CKR_BUFFER_T
1e420 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72  OO_SMALL");....r
1e430 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52  eturn(CKR_BUFFER
1e440 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d  _TOO_SMALL);...}
1e450 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1e460 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1e470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e480 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1e490 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1e4a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e4b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1e4c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e4d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e4e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e4f0 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30  }...slot_idx = 0
1e500 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ;..for (currslot
1e510 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20   = 0; (currslot 
1e520 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1e530 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1e540 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1e550 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ))); currslot++)
1e560 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79   {...if (!cackey
1e570 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1e580 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f  .active) {....co
1e590 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1e5a0 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63  f (slot_idx >= c
1e5b0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
1e5c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e5d0 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f  Error. User allo
1e5e0 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65  cated %lu entrie
1e5f0 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74  s, but we just t
1e600 72 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ried to write to
1e610 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d   the %lu index -
1e620 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75  - ignoring", cou
1e630 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a  nt, slot_idx);..
1e640 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1e650 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c  ....pSlotList[sl
1e660 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c  ot_idx] = currsl
1e670 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b  ot;...slot_idx++
1e680 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1e690 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1e6a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1e6b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1e6c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1e6d0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1e6e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e6f0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1e700 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e710 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e720 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  RROR);..}...*pul
1e730 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75  Count = slot_cou
1e740 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  nt;...CACKEY_DEB
1e750 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1e760 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1e770 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1e780 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20  ders.", CKR_OK, 
1e790 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1e7a0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72  slot_count);...r
1e7b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a  eturn(CKR_OK);..
1e7c0 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20  .tokenPresent = 
1e7d0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a  tokenPresent; /*
1e7e0 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
1e7f0 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
1e800 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
1e810 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1e820 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28   C_GetSlotInfo)(
1e830 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1e840 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f  D, CK_SLOT_INFO_
1e850 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1e860 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1e870 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e   slotDescription
1e880 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f  [] = "CACKey Slo
1e890 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  t";..int mutex_r
1e8a0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65  etval;..int byte
1e8b0 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43  s_to_copy;...CAC
1e8c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e8d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1e8e0 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1e8f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e900 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e910 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1e920 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e930 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1e940 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1e950 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1e960 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e970 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e980 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1e990 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1e9a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1e9b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1e9c0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1e9d0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1e9e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e9f0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1ea00 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1ea10 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ea20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ea30 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1ea40 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1ea50 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1ea60 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1ea70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ea80 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1ea90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1eaa0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1eab0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1eac0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1ead0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1eae0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1eaf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1eb00 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1eb10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eb20 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1eb30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1eb40 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1eb50 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1eb60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eb70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1eb80 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1eb90 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1eba0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1ebb0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1ebc0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1ebd0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ebe0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1ebf0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1ec00 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
1ec10 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1ec20 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21  HW_SLOT;...if (!
1ec30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1ec40 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  tID].internal) {
1ec50 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1ec60 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45  |= CKF_REMOVABLE
1ec70 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66  _DEVICE;..}...if
1ec80 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
1ec90 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
1eca0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d  lots[slotID]) ==
1ecb0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
1ecc0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
1ecd0 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
1ece0 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45   CKF_TOKEN_PRESE
1ecf0 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74  NT;..}...bytes_t
1ed00 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28  o_copy = strlen(
1ed10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1ed20 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
1ed30 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70  );..if (sizeof(p
1ed40 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1ed50 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f  erID) < bytes_to
1ed60 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73  _copy) {...bytes
1ed70 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f  _to_copy = sizeo
1ed80 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1ed90 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65  turerID);..}..me
1eda0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mcpy(pInfo->manu
1edb0 66 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b  facturerID, cack
1edc0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1edd0 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79  .pcsc_reader, by
1ede0 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09  tes_to_copy);...
1edf0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1ee00 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1ee10 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1ee20 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1ee30 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1ee40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ee50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1ee60 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1ee70 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ee80 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1ee90 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1eea0 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69  o->slotDescripti
1eeb0 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  on, ' ', sizeof(
1eec0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1eed0 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70  iption));..memcp
1eee0 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  y(pInfo->slotDes
1eef0 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65  cription, slotDe
1ef00 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f  scription, sizeo
1ef10 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  f(slotDescriptio
1ef20 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65  n) - 1);...memse
1ef30 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1ef40 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1ef50 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1ef60 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09  facturerID));...
1ef70 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1ef80 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1ef90 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1efa0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1efb0 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1efc0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1efd0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1efe0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1eff0 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1f000 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1f010 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1f020 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1f030 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1f040 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1f050 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f060 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1f070 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1f080 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1f090 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f0a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54  ON(CK_RV, C_GetT
1f0b0 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  okenInfo)(CK_SLO
1f0c0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1f0d0 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70  TOKEN_INFO_PTR p
1f0e0 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1f0f0 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75  CK_UTF8CHAR manu
1f100 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22  facturerID[] = "
1f110 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22  U.S. Government"
1f120 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  ;..static CK_UTF
1f130 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62  8CHAR defaultLab
1f140 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20  el[] = "Unknown 
1f150 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20  Token";..static 
1f160 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65  CK_UTF8CHAR mode
1f170 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e  l[] = "CAC Token
1f180 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  ";..struct cacke
1f190 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
1f1a0 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  *pcsc_identities
1f1b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
1f1c0 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69   num_certs;..ssi
1f1d0 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a  ze_t label_ret;.
1f1e0 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
1f1f0 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61  l;..int use_defa
1f200 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43  ult_label;...CAC
1f210 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f220 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f230 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
1f240 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f250 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f260 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
1f270 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f280 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1f290 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1f2a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f2b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f2c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f2d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f2e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f2f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f300 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f310 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1f320 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1f330 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f340 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1f350 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1f360 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f370 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f380 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1f390 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1f3a0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1f3b0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1f3c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1f3d0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1f3e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1f3f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1f400 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1f410 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1f420 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1f430 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f440 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f450 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1f460 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f470 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f480 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1f490 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1f4a0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1f4b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f4c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1f4d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1f4e0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1f4f0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1f500 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1f510 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1f520 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1f530 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1f540 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1f550 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
1f560 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1f570 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1f580 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
1f590 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1f5a0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1f5b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f5c0 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73  NTF("No token is
1f5d0 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74   present in slot
1f5e0 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49  ID = %lu", slotI
1f5f0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1f600 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f610 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1f620 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1f630 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d  NOT_PRESENT);..}
1f640 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1f650 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1f660 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1f670 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1f680 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1f690 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f6a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f6b0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1f6c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f6d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1f6e0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
1f6f0 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c  mine token label
1f700 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74   from certificat
1f710 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49  es */..memset(pI
1f720 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c  nfo->label, ' ',
1f730 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1f740 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66  abel));..use_def
1f750 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a  ault_label = 1;.
1f760 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f770 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1f780 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63   == NULL) {...pc
1f790 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
1f7a0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
1f7b0 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
1f7c0 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26  slotID], NULL, &
1f7d0 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66  num_certs);...if
1f7e0 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   (pcsc_identitie
1f7f0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
1f800 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20  if (num_certs > 
1f810 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72  0) {.....label_r
1f820 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
1f830 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
1f840 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  el(pcsc_identiti
1f850 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  es, pInfo->label
1f860 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1f870 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20  label));.....if 
1f880 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20  (label_ret > 0) 
1f890 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75  {......use_defau
1f8a0 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09  lt_label = 0;...
1f8b0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1f8c0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
1f8d0 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70   malloc(sizeof(p
1f8e0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
1f8f0 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(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 2c 20 70 49 6e 66 6f 2d 3e 6c  .label, pInfo->l
1f920 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
1f930 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
1f940 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
1f950 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63  ey_free_certs(pc
1f960 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e  sc_identities, n
1f970 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09  um_certs, 1);...
1f980 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65  }..} else {...me
1f990 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
1f9a0 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  l, cackey_slots[
1f9b0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73  slotID].label, s
1f9c0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1f9d0 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66  el));....use_def
1f9e0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
1f9f0 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66  .}...if (use_def
1fa00 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09  ault_label) {...
1fa10 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
1fa20 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65  bel, defaultLabe
1fa30 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c  l, sizeof(defaul
1fa40 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d  tLabel) - 1);..}
1fa50 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1fa60 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1fa70 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1fa80 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1fa90 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49  ID));..memcpy(pI
1faa0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1fab0 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65  rID, manufacture
1fac0 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75  rID, sizeof(manu
1fad0 66 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29  facturerID) - 1)
1fae0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1faf0 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69  ->model, ' ', si
1fb00 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  zeof(pInfo->mode
1fb10 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  l));..memcpy(pIn
1fb20 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c  fo->model, model
1fb30 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20  , sizeof(model) 
1fb40 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
1fb50 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
1fb60 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  er, ' ', sizeof(
1fb70 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d  pInfo->serialNum
1fb80 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28  ber));...memset(
1fb90 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20  pInfo->utcTime, 
1fba0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1fbb0 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09  o->utcTime));...
1fbc0 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56  pInfo->hardwareV
1fbd0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1fbe0 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f  cackey_getversio
1fbf0 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66  n() >> 16) & 0xf
1fc00 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  f;..pInfo->hardw
1fc10 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1fc20 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1fc30 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1fc40 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66  0xff;...pInfo->f
1fc50 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  irmwareVersion.m
1fc60 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49  ajor = 0x00;..pI
1fc70 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1fc80 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30  sion.minor = 0x0
1fc90 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  0;...pInfo->flag
1fca0 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52  s = CKF_WRITE_PR
1fcb0 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53  OTECTED | CKF_US
1fcc0 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a  ER_PIN_INITIALIZ
1fcd0 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49  ED | CKF_TOKEN_I
1fce0 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63  NITIALIZED | cac
1fcf0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1fd00 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a  ].token_flags;..
1fd10 09 69 66 20 28 63 61 63 6b 65 79 5f 70 69 6e 5f  .if (cackey_pin_
1fd20 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29  command != NULL)
1fd30 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
1fd40 73 20 7c 3d 20 43 4b 46 5f 50 52 4f 54 45 43 54  s |= CKF_PROTECT
1fd50 45 44 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ED_AUTHENTICATIO
1fd60 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a 09 70 49 6e  N_PATH;..}...pIn
1fd70 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e  fo->ulMaxSession
1fd80 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28  Count = (sizeof(
1fd90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1fda0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1fdb0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d  _sessions[0])) -
1fdc0 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65   1;..pInfo->ulSe
1fdd0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f  ssionCount = CK_
1fde0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1fdf0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1fe00 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43  >ulMaxRwSessionC
1fe10 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f  ount = 0;..pInfo
1fe20 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75  ->ulRwSessionCou
1fe30 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  nt = CK_UNAVAILA
1fe40 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1fe50 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69  ..pInfo->ulMaxPi
1fe60 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e  nLen = 128;..pIn
1fe70 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20  fo->ulMinPinLen 
1fe80 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54  = 0;..pInfo->ulT
1fe90 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79  otalPublicMemory
1fea0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1feb0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1fec0 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62  pInfo->ulFreePub
1fed0 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
1fee0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1fef0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1ff00 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65  ulTotalPrivateMe
1ff10 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1ff20 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1ff30 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
1ff40 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  ePrivateMemory =
1ff50 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1ff60 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43  INFORMATION;...C
1ff70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff80 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ff90 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1ffa0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1ffb0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1ffc0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1ffd0 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  RV, C_WaitForSlo
1ffe0 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53  tEvent)(CK_FLAGS
1fff0 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f   flags, CK_SLOT_
20000 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20  ID_PTR pSlotID, 
20010 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
20020 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59  erved) {..CACKEY
20030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20040 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20050 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
20060 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
20070 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20080 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
20090 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
200a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
200b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
200c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
200d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
200e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
200f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
20100 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
20110 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20120 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20130 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58  IZED);..}.../* X
20140 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d  XX: TODO: Implem
20150 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09  ent this... */..
20160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20170 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20180 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20190 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
201a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
201b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
201c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
201d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
201e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
201f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20200 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c   C_GetMechanismL
20210 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ist)(CK_SLOT_ID 
20220 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
20230 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d  NISM_TYPE_PTR pM
20240 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b  echanismList, CK
20250 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
20260 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  unt) {..CACKEY_D
20270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20280 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
20290 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
202a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
202b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
202c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
202d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
202e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
202f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20300 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ..}...if (pulCou
20310 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
20320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
20340 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29  Count is NULL.")
20350 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20360 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
20370 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e  .}...if (pMechan
20380 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  ismList == NULL)
20390 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d   {...*pulCount =
203a0 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
203b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
203c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
203d0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
203e0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
203f0 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75  .}...if (*pulCou
20400 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b  nt < 1) {...CACK
20410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20420 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20  "Error.  Buffer 
20430 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09  too small.");...
20440 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
20450 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09  ER_TOO_SMALL);..
20460 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69  }...pMechanismLi
20470 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f  st[0] = CKM_RSA_
20480 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74  PKCS;..*pulCount
20490 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
204a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
204b0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
204c0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
204d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
204e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
204f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
20500 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29  etMechanismInfo)
20510 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
20520 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
20530 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d  _TYPE type, CK_M
20540 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54  ECHANISM_INFO_PT
20550 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
20560 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
20570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20580 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20590 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
205a0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
205b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
205c0 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
205d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
205e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
205f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
20600 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20610 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20620 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20630 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20640 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20650 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20660 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20670 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
20680 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
20690 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
206a0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
206b0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
206c0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
206d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
206e0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
206f0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20700 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
20710 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
20720 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
20730 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
20740 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20750 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20760 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20770 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20780 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20790 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
207a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
207b0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
207c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
207d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
207e0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
207f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
20800 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
20810 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20830 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
20840 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
20850 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
20860 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
20870 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
20880 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20890 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
208a0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
208b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
208c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
208d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
208e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
208f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20900 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20910 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20920 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
20930 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20940 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20950 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20960 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70  .}...switch (typ
20970 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  e) {...case CKM_
20980 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e  RSA_PKCS:....pIn
20990 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65  fo->ulMinKeySize
209a0 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f   = 512;....pInfo
209b0 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d  ->ulMaxKeySize =
209c0 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d   8192;....pInfo-
209d0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20  >flags = CKF_HW 
209e0 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20  | CKF_ENCRYPT | 
209f0 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b  CKF_DECRYPT | CK
20a00 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52  F_SIGN | CKF_VER
20a10 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  IFY;....break;..
20a20 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20a30 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20a40 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20a50 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20a60 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  rn(CKR_OK);.}../
20a70 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
20a80 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
20a90 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
20aa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
20ab0 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f  nitToken)(CK_SLO
20ac0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
20ad0 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
20ae0 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
20af0 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
20b00 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a  R_PTR pLabel) {.
20b10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20b20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20b30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20b40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20b60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20b70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20b80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20b90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20ba0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20bb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20bc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20bd0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
20be0 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
20bf0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
20c00 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
20c10 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
20c20 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
20c30 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
20c40 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
20c50 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
20c60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20c70 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53   C_InitPIN)(CK_S
20c80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
20c90 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43  ession, CK_UTF8C
20ca0 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
20cb0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
20cc0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
20cd0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20ce0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20cf0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20d00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20d10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20d20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20d30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20d40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20d50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20d60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20d70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20d80 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
20d90 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
20da0 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
20db0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
20dc0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
20dd0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20de0 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
20df0 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
20e00 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
20e10 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20e20 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b  RV, C_SetPIN)(CK
20e30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
20e40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
20e50 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69  8CHAR_PTR pOldPi
20e60 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c  n, CK_ULONG ulOl
20e70 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  dPinLen, CK_UTF8
20e80 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e  CHAR_PTR pNewPin
20e90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77  , CK_ULONG ulNew
20ea0 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  PinLen) {..CACKE
20eb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20ec0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20ed0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20ee0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20ef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20f00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20f10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20f20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20f30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20f40 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
20f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20f60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
20f70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
20f80 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
20f90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
20fa0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
20fb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20fc0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
20fd0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20fe0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e  ON(CK_RV, C_Open
20ff0 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54  Session)(CK_SLOT
21000 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46  _ID slotID, CK_F
21010 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56  LAGS flags, CK_V
21020 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61  OID_PTR pApplica
21030 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20  tion, CK_NOTIFY 
21040 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49  notify, CK_SESSI
21050 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68  ON_HANDLE_PTR ph
21060 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69  Session) {..unsi
21070 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09  gned long idx;..
21080 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
21090 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73  ;..int found_ses
210a0 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b  sion = 0;...CACK
210b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
210c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
210d0 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53   ((flags & CKF_S
210e0 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21  ERIAL_SESSION) !
210f0 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53  = CKF_SERIAL_SES
21100 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e  SION) {...return
21110 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52  (CKR_SESSION_PAR
21120 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52  ALLEL_NOT_SUPPOR
21130 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  TED);..}...if (!
21140 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
21150 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
21160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21170 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
21180 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
21190 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
211a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
211b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
211c0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
211d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
211e0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
211f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
21200 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21220 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21230 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21240 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
21250 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
21260 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
21270 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
21280 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
21290 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
212a0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
212b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
212c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
212d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
212e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
212f0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21300 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21310 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21320 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
21330 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
21340 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
21350 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21360 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21370 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
21380 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21390 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
213a0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
213b0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
213c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
213d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
213e0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
213f0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21400 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
21410 74 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75  the card is actu
21420 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74  ally in the slot
21430 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68  . */../* XXX: Ch
21440 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
21450 20 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20   this is in the 
21460 50 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63  PKCS#11 specific
21470 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61  ation */..if (ca
21480 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
21490 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  nt(&cackey_slots
214a0 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43  [slotID]) != CAC
214b0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
214c0 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43  PRESENT) {...CAC
214d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
214e0 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e  ("Error.  Card n
214f0 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74  ot present.  Ret
21500 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43  urning CKR_DEVIC
21510 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09  E_REMOVED");....
21520 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
21530 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21540 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
21550 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
21560 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
21570 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69  x = 1; idx < (si
21580 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21590 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
215a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
215b0 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
215c0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
215d0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
215e0 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73  ) {....found_ses
215f0 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70  sion = 1;.....*p
21600 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a  hSession = idx;.
21610 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21620 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
21630 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 1;....cackey_s
21640 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f  essions[idx].slo
21650 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09  tID = slotID;...
21660 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21670 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b  [idx].state = CK
21680 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
21690 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ION;....cackey_s
216a0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61  essions[idx].fla
216b0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63  gs = flags;....c
216c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
216d0 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f  dx].ulDeviceErro
216e0 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79  r = 0;....cackey
216f0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70  _sessions[idx].p
21700 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41  Application = pA
21710 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63  pplication;....c
21720 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21730 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74  dx].Notify = not
21740 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ify;.....cackey_
21750 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
21760 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
21770 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
21780 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
21790 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a  ies_count = 0;..
217a0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
217b0 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61  ns[idx].search_a
217c0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
217d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
217e0 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  dx].sign_active 
217f0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
21800 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65  sessions[idx].de
21810 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
21820 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
21830 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
21840 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
21850 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
21860 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21870 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
21880 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
21890 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  tities_count);..
218a0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
218b0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
218c0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
218d0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
218e0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
218f0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21900 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21910 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21920 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
21930 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21940 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21950 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f  R);..}...if (!fo
21960 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09  und_session) {..
21970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21980 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21990 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
219a0 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53  T (%i)", CKR_SES
219b0 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09  SION_COUNT);....
219c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
219d0 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09  ON_COUNT);..}...
219e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
219f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
21a00 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
21a10 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
21a20 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
21a30 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21a40 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73  _RV, C_CloseSess
21a50 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
21a60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
21a70 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
21a80 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
21a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21aa0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21ab0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21ac0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
21ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21ae0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21af0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21b00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21b10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21b20 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
21b30 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
21b40 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
21b50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
21b60 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21b70 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
21b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21ba0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
21bb0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
21bc0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
21bd0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
21be0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21bf0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21c00 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21c10 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21c20 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21c30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21c40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21c50 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21c60 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21c70 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21c80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21c90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21ca0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
21cb0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21cc0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21cd0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21ce0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21cf0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21d00 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
21d10 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21d20 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21d30 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  VALID);..}...cac
21d40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21d50 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20  ssion].active = 
21d60 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  0;..cackey_free_
21d70 69 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65  identities(cacke
21d80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21d90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c  ion].identities,
21da0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
21db0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
21dc0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
21dd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21de0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21df0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21e00 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21e10 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21e30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
21e40 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21e50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21e60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21e70 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21e80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21e90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
21ea0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
21eb0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
21ec0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21ed0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73  ON(CK_RV, C_Clos
21ee0 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b  eAllSessions)(CK
21ef0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29  _SLOT_ID slotID)
21f00 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78   {..uint32_t idx
21f10 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
21f20 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
21f30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21f40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21f50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21f60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21f80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21f90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21fa0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21fb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21fc0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
21fd0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
21fe0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
21ff0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
22000 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
22010 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
22020 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22030 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
22040 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
22050 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
22060 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
22070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22080 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
22090 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
220a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
220b0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
220c0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
220d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
220e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
220f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22100 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
22110 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22120 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22130 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
22140 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22150 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
22160 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
22180 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
22190 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
221a0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
221b0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
221c0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
221d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
221e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
221f0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
22200 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66  INVALID);..}...f
22210 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
22220 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
22230 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
22240 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
22250 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
22260 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
22270 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
22280 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28  ctive) {....if (
22290 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
222a0 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73  idx].slotID != s
222b0 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e  lotID) {.....con
222c0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09  tinue;....}.....
222d0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
222e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
222f0 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53  ck);....C_CloseS
22300 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09  ession(idx);....
22310 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22320 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22330 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65  );...}..}...mute
22340 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22350 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22360 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22370 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22380 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
223a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
223b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
223c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
223d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
223e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
223f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22400 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22410 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
22420 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
22430 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22440 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69  K_RV, C_GetSessi
22450 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49  onInfo)(CK_SESSI
22460 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22470 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49  on, CK_SESSION_I
22480 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
22490 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
224a0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
224b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
224c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
224d0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
224e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
224f0 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
22500 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
22510 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
22520 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
22530 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22540 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22560 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22570 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22580 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22590 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
225a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
225b0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
225c0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
225d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
225e0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
225f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
22600 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
22610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22620 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
22630 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
22640 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22650 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22660 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
22670 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22680 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
22690 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
226a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
226b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
226c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
226d0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
226e0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
226f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22700 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
22710 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
22720 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
22730 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
22740 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22750 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
22780 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
22790 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
227a0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
227b0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
227c0 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44  ...pInfo->slotID
227d0 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
227e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
227f0 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61  tID;..pInfo->sta
22800 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  te = cackey_sess
22810 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22820 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c  tate;..pInfo->fl
22830 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ags = cackey_ses
22840 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22850 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75  flags;..pInfo->u
22860 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63  lDeviceError = c
22870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22880 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63  Session].ulDevic
22890 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f  eError;...mutex_
228a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
228b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
228c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
228d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
228e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
228f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22900 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
22910 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
22920 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
22930 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
22940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22950 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22960 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
22970 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
22980 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
22990 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
229a0 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69  RV, C_GetOperati
229b0 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
229c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
229d0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
229e0 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
229f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
22a00 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
22a10 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
22a20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
22a30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
22a40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
22a50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
22a60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22a70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
22a80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
22a90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
22aa0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
22ab0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
22ac0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
22ad0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
22ae0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
22af0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
22b00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22b10 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
22b20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22b30 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
22b40 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22b50 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72  CK_RV, C_SetOper
22b60 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
22b70 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22b80 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
22b90 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
22ba0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
22bb0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65  OperationStateLe
22bc0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
22bd0 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b  DLE hEncryptionK
22be0 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  ey, CK_OBJECT_HA
22bf0 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61  NDLE hAuthentica
22c00 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b  tionKey) {..CACK
22c10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22c20 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22c30 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22c40 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c60 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22c70 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22c80 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22c90 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22ca0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
22cb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22cc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
22cd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22ce0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22cf0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22d00 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
22d10 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22d20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
22d30 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22d40 49 4f 4e 28 43 4b 5f 52 56 2c 20 5f 43 5f 4c 6f  ION(CK_RV, _C_Lo
22d50 67 69 6e 4d 75 74 65 78 41 72 67 29 28 43 4b 5f  ginMutexArg)(CK_
22d60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22d70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
22d80 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
22d90 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
22da0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
22db0 6c 50 69 6e 4c 65 6e 2c 20 69 6e 74 20 6c 6f 63  lPinLen, int loc
22dc0 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 43 4b 5f 53  k_mutex) {..CK_S
22dd0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
22de0 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68  FILE *pinfd;..ch
22df0 61 72 20 2a 70 69 6e 63 6d 64 2c 20 70 69 6e 62  ar *pincmd, pinb
22e00 75 66 5b 36 34 5d 2c 20 2a 66 67 65 74 73 5f 72  uf[64], *fgets_r
22e10 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
22e20 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65  etval;..int trie
22e30 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
22e40 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 09 69 6e  t login_ret;..in
22e50 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09  t pclose_ret;...
22e60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22e80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22e90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22ea0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22eb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22ec0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22ed0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22ee0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22ef0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
22f00 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
22f10 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
22f20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22f30 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22f40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22f50 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
22f60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22f70 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22f80 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
22f90 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22fa0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22fb0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22fc0 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
22fd0 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
22fe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22ff0 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
23000 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
23010 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
23020 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
23030 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
23040 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
23050 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
23060 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
23070 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09  lock_mutex) {...
23080 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23090 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
230a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
230b0 3b 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ;...if (mutex_re
230c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
230d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
230e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
230f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
23100 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23110 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23120 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  .}..}...if (!cac
23130 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
23140 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
23150 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65  ...if (lock_mute
23160 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  x) {....cackey_m
23170 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23180 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
23190 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
231a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
231b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
231c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
231d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
231e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
231f0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
23200 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23210 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
23220 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
23230 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
23240 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23250 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
23260 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
23270 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23280 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23290 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
232a0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
232b0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
232c0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
232d0 0a 0a 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
232e0 65 78 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ex) {....cackey_
232f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23300 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
23310 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  }....return(CKR_
23320 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23330 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
23340 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
23350 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
23360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23370 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23380 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23390 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
233a0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
233b0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
233c0 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29  .if (lock_mutex)
233d0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
233e0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
233f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a  _biglock);...}..
23400 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23410 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23420 0a 09 70 69 6e 63 6d 64 20 3d 20 63 61 63 6b 65  ..pincmd = cacke
23430 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09  y_pin_command;..
23440 69 66 20 28 70 69 6e 63 6d 64 20 21 3d 20 4e 55  if (pincmd != NU
23450 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
23460 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 43  EBUG_PRINTF("CAC
23470 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20  KEY_PIN_COMMAND 
23480 3d 20 25 73 22 2c 20 70 69 6e 63 6d 64 29 3b 0a  = %s", pincmd);.
23490 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d 20 4e  ...if (pPin != N
234a0 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ULL) {....CACKEY
234b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
234c0 72 6f 74 65 63 74 65 64 20 61 75 74 68 65 6e 74  rotected authent
234d0 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69 6e 20  ication path in 
234e0 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e 20 70  effect and PIN p
234f0 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a 09 09  rovided !?");...
23500 7d 0a 0a 09 09 70 69 6e 66 64 20 3d 20 70 6f 70  }....pinfd = pop
23510 65 6e 28 70 69 6e 63 6d 64 2c 20 22 72 22 29 3b  en(pincmd, "r");
23520 0a 09 09 69 66 20 28 70 69 6e 66 64 20 3d 3d 20  ...if (pinfd == 
23530 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45  NULL) {....CACKE
23540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23550 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62  Error.  %s: Unab
23560 6c 65 20 74 6f 20 72 75 6e 22 2c 20 70 69 6e 63  le to run", pinc
23570 6d 64 29 3b 0a 0a 09 09 09 69 66 20 28 6c 6f 63  md);.....if (loc
23580 6b 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 09 63  k_mutex) {.....c
23590 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
235a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
235b0 6b 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  k);....}.....CAC
235c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
235d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
235e0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
235f0 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
23600 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
23610 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
23620 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
23630 7d 0a 0a 09 09 66 67 65 74 73 5f 72 65 74 20 3d  }....fgets_ret =
23640 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c 20 73   fgets(pinbuf, s
23650 69 7a 65 6f 66 28 70 69 6e 62 75 66 29 2c 20 70  izeof(pinbuf), p
23660 69 6e 66 64 29 3b 0a 09 09 69 66 20 28 66 67 65  infd);...if (fge
23670 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c 29 20  ts_ret == NULL) 
23680 7b 0a 09 09 09 70 69 6e 62 75 66 5b 30 5d 20 3d  {....pinbuf[0] =
23690 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 63   '\0';...}....pc
236a0 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c 6f 73  lose_ret = pclos
236b0 65 28 70 69 6e 66 64 29 3b 0a 09 09 69 66 20 28  e(pinfd);...if (
236c0 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20 30 29  pclose_ret != 0)
236d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
236e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
236f0 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20 77 69  .  %s: exited wi
23700 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74 61 74  th non-zero stat
23710 75 73 20 6f 66 20 25 69 22 2c 20 70 69 6e 63 6d  us of %i", pincm
23720 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29 3b 0a  d, pclose_ret);.
23730 0a 09 09 09 69 66 20 28 6c 6f 63 6b 5f 6d 75 74  ....if (lock_mut
23740 65 78 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ex) {.....cackey
23750 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23760 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23770 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
23780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23790 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
237a0 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
237b0 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
237c0 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
237d0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
237e0 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
237f0 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75  if (strlen(pinbu
23800 66 29 20 3c 20 31 29 20 7b 0a 09 09 09 43 41 43  f) < 1) {....CAC
23810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23820 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72 65  ("Error.  %s: re
23830 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c  turned no data",
23840 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 69 66   pincmd);.....if
23850 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b 0a   (lock_mutex) {.
23860 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23870 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23880 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 7d 0a 0a 09  iglock);....}...
23890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
238a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
238b0 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
238c0 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  CT (%i)", (int) 
238d0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
238e0 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  T);.....return(C
238f0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23900 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70 69  );...}....if (pi
23910 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62  nbuf[strlen(pinb
23920 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27  uf) - 1] == '\n'
23930 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 73 74  ) {....pinbuf[st
23940 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20 31  rlen(pinbuf) - 1
23950 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09  ] = '\0';...}...
23960 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46 38  .pPin = (CK_UTF8
23970 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75 66  CHAR_PTR) pinbuf
23980 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20 73  ;...ulPinLen = s
23990 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a 09  trlen(pinbuf);..
239a0 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
239b0 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
239c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
239d0 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
239e0 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
239f0 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
23a00 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
23a10 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69  PCSC_S_OK) {...i
23a20 66 20 28 6c 6f 63 6b 5f 6d 75 74 65 78 29 20 7b  f (lock_mutex) {
23a30 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23a40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23a50 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 0a 09 09  iglock);...}....
23a60 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
23a70 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c   CACKEY_PCSC_E_L
23a80 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b  OCKED) {....CACK
23a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23aa0 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69  "Error.  Token i
23ab0 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09  s locked.");....
23ac0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
23ad0 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
23ae0 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49  s |= CKF_USER_PI
23af0 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 43 41  N_LOCKED;.....CA
23b00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23b10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23b20 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28 25 69 29  _PIN_LOCKED (%i)
23b30 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e  ", (int) CKR_PIN
23b40 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09 09 72 65  _LOCKED);.....re
23b50 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43  turn(CKR_PIN_LOC
23b60 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69  KED);...} else i
23b70 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20  f (login_ret == 
23b80 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
23b90 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45  DPIN) {....CACKE
23ba0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23bb0 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20  Error.  Invalid 
23bc0 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  PIN.");.....cack
23bd0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23be0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
23bf0 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55  CKF_USER_PIN_COU
23c00 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28  NT_LOW;.....if (
23c10 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20  tries_remaining 
23c20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b  == 1) {.....cack
23c30 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23c40 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
23c50 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e  CKF_USER_PIN_FIN
23c60 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09  AL_TRY;....}....
23c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23c80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23c90 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
23ca0 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43  T (%i)", (int) C
23cb0 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
23cc0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
23cd0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29  R_PIN_INCORRECT)
23ce0 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
23cf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23d00 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72  ror.  Unknown er
23d10 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f  ror returned fro
23d20 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29  m cackey_login()
23d30 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65   (%i)", login_re
23d40 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
23d50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
23d60 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  ;..}...cackey_sl
23d70 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
23d80 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46  n_flags &= ~(CKF
23d90 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
23da0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
23db0 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f  COUNT_LOW | CKF_
23dc0 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c  LOGIN_REQUIRED |
23dd0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
23de0 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b  NAL_TRY);...cack
23df0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23e00 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
23e10 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49  S_RO_USER_FUNCTI
23e20 4f 4e 53 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 5f  ONS;...if (lock_
23e30 6d 75 74 65 78 29 20 7b 0a 09 09 6d 75 74 65 78  mutex) {...mutex
23e40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
23e50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23e60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
23e70 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
23e80 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
23e90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23ea0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
23eb0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
23ec0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
23ed0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
23ee0 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
23ef0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
23f00 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
23f10 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
23f20 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
23f30 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
23f40 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
23f50 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  gin)(CK_SESSION_
23f60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
23f70 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73   CK_USER_TYPE us
23f80 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43  erType, CK_UTF8C
23f90 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b  HAR_PTR pPin, CK
23fa0 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29  _ULONG ulPinLen)
23fb0 20 7b 0a 09 72 65 74 75 72 6e 28 5f 43 5f 4c 6f   {..return(_C_Lo
23fc0 67 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73  ginMutexArg(hSes
23fd0 73 69 6f 6e 2c 20 75 73 65 72 54 79 70 65 2c 20  sion, userType, 
23fe0 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
23ff0 31 29 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  1));.}..CK_DEFIN
24000 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24010 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
24020 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24030 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
24040 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
24050 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24060 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24070 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24080 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24090 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
240a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
240b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
240c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
240d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
240e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
240f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24100 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
24110 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
24120 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
24130 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
24140 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
24150 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
24160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24170 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
24180 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
24190 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
241a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
241b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
241c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
241d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
241e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
241f0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
24200 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
24210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
24230 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24240 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24250 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24260 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
24270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24280 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
24290 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
242a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
242b0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
242c0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
242d0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
242e0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
242f0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
24300 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
24310 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
24320 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
24330 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
24340 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
24350 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
24360 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24370 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
24380 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
24390 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
243a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
243b0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
243c0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
243d0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
243e0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
243f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24400 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24410 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
24420 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
24430 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
24440 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24450 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24460 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24470 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
24480 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
24490 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
244a0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
244b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
244c0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
244d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
244e0 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
244f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24500 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
24510 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
24520 4e 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  N;...if (cackey_
24530 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
24540 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
24550 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
24560 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
24570 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
24580 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b  .} else {...cack
24590 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
245a0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
245b0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
245c0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
245d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
245e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
245f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
24600 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
24610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24620 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
24630 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24640 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24650 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
24660 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24670 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
24680 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
24690 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
246a0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
246b0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
246c0 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
246d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
246e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
246f0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
24700 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
24710 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
24720 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
24730 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
24740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24750 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
24760 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
24770 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
24780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24790 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
247a0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
247b0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
247c0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
247d0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
247e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
247f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
24800 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24810 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
24820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
24830 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
24840 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
24850 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
24860 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
24870 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
24880 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
24890 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
248a0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
248b0 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
248c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
248d0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
248e0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
248f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
24900 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
24910 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
24920 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24930 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24940 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24950 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24960 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24970 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24980 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24990 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
249a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
249b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
249c0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
249d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
249e0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
249f0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
24a00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
24a10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
24a20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24a30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
24a40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24a50 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
24a60 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
24a70 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
24a80 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
24a90 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
24aa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24ab0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24ac0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24ad0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24af0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24b00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24b10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24b20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24b30 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24b40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24b50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24b60 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24b70 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24b80 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24b90 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24ba0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24bb0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24bc0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24bd0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
24be0 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
24bf0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
24c00 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
24c10 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
24c20 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
24c30 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
24c40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24c50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
24c60 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24c70 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24c90 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24ca0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24cb0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24cc0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24cd0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
24ce0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24cf0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24d00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24d10 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
24d20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24d30 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
24d40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24d50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
24d60 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24d70 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
24d80 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
24d90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
24da0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
24db0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
24dc0 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
24dd0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
24de0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
24df0 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
24e00 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
24e10 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
24e20 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
24e30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
24e40 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
24e50 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
24e60 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
24e70 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
24e80 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
24e90 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
24ea0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
24eb0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
24ec0 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
24ed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24ee0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24ef0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24f00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24f10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24f20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24f30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24f40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24f50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24f60 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
24f70 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
24f80 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
24f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
24fa0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
24fb0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
24fc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24fd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24fe0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
24ff0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
25000 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
25010 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
25020 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
25030 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
25040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25050 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
25060 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
25070 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
25080 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
25090 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
250a0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
250b0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
250c0 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
250d0 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
250e0 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
250f0 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
25100 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
25110 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25120 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25130 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
25140 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
25150 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
25160 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
25170 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
25180 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25190 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
251a0 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
251b0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
251c0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
251d0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
251e0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
251f0 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
25200 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
25210 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
25220 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25230 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
25240 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25260 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25270 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25280 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25290 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
252a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
252b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
252c0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
252d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
252e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
252f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25300 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25310 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
25320 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25330 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
25340 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25350 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
25360 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25370 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25380 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
25390 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
253a0 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
253b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
253c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
253d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
253e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
253f0 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
25400 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
25410 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
25420 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
25430 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
25440 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
25450 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25460 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
25470 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
25480 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
25490 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
254a0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
254b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
254c0 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
254d0 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
254e0 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
254f0 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
25500 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
25510 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
25520 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
25530 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
25540 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
25550 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
25560 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25570 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
25580 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
25590 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
255a0 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
255b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
255c0 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
255d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
255e0 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
255f0 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
25600 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
25610 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
25620 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
25630 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
25640 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
25650 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
25660 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
25670 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
25680 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
25690 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
256a0 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
256b0 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
256c0 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
256d0 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
256e0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
256f0 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
25700 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
25710 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
25720 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
25730 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
25740 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
25750 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
25760 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
25770 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
25780 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
25790 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
257a0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
257b0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
257c0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
257d0 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
257e0 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
257f0 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
25800 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
25810 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
25820 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
25830 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
25840 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
25850 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
25860 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
25870 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
25880 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
25890 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
258a0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
258b0 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
258c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
258d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
258e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
258f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
25900 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
25910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25930 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
25940 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25950 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
25960 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
25970 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
25980 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
25990 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
259a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
259b0 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
259c0 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
259d0 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
259e0 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
259f0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
25a00 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
25a10 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
25a20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25a30 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
25a40 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
25a50 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
25a60 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
25a70 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
25a80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25a90 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
25aa0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
25ab0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
25ac0 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
25ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25ae0 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
25af0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
25b00 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
25b10 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
25b20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
25b30 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
25b40 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
25b50 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
25b60 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
25b70 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
25b80 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
25b90 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
25ba0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
25bb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25bc0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25bd0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25be0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25c00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25c10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25c20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25c30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25c40 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
25c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
25c60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
25c70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25c80 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
25c90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
25ca0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
25cb0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25cc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25cd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25ce0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
25cf0 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
25d00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
25d10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
25d20 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
25d30 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
25d40 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c  lCount) {..CK_SL
25d50 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
25d60 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
25d70 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
25d80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25d90 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25da0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25db0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25dd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25de0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25df0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25e00 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25e10 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25e20 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
25e30 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
25e40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
25e50 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
25e60 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
25e70 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
25e80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25e90 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
25ea0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
25eb0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25ec0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
25ed0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
25ee0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
25ef0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
25f00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25f10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
25f20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
25f30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25f40 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
25f50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25f60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25f70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25f80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
25f90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25fa0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
25fb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
25fc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25fd0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25fe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25ff0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
26000 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
26010 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26020 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26030 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
26040 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26050 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
26060 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
26070 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
26080 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
26090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
260a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
260b0 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69  rch already acti
260c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
260d0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
260e0 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73  _ACTIVE);..}...s
260f0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
26100 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26110 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
26120 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
26130 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
26140 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
26150 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
26160 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
26170 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26180 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
26190 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
261a0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
261b0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
261c0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
261d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
261e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
261f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
26200 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
26210 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26230 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
26240 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
26250 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
26260 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
26270 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
26280 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26290 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
262a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
262b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
262c0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
262d0 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
262e0 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  eset) {...CACKEY
262f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
26300 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e  he slot has been
26310 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20   reset since we 
26320 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20  last looked for 
26330 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65  identities -- re
26340 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69  scanning");....i
26350 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
26360 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
26370 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
26380 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
26390 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
263a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
263b0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
263c0 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
263d0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
263e0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
263f0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26400 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26410 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
26420 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26430 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26440 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
26450 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63   0;...}....if (c
26460 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26470 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c  ID].label != NUL
26480 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  L) {....free(cac
26490 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
264a0 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63  ].label);....cac
264b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
264c0 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
264d0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61  ..}....cackey_ma
264e0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
264f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26500 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73  ID]);...cackey_s
26510 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f  lots[slotID].slo
26520 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a  t_reset = 0;..}.
26530 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
26540 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26550 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
26560 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
26570 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26580 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
26590 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
265a0 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
265b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
265c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
265d0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
265e0 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09  es_count);..}...
265f0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
26600 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
26610 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
26620 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26630 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26640 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
26650 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
26660 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26670 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26680 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
26690 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
266a0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
266b0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
266c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
266d0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
266e0 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
266f0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
26700 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20  plate));....for 
26710 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
26720 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  ulCount; idx++) 
26730 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c  {.....if (pTempl
26740 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
26750 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  Len == 0) {.....
26760 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
26770 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26780 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
26790 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  lue = NULL;.....
267a0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
267b0 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
267c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
267d0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
267e0 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  x].pValue = mall
267f0 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  oc(pTemplate[idx
26800 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ].ulValueLen);..
26810 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
26820 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26830 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
26840 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09  dx].pValue) {...
26850 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
26860 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26870 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26880 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
26890 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61  emplate[idx].pVa
268a0 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
268b0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
268c0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20  .....}....}...} 
268d0 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
268e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
268f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26900 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
26910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26920 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26930 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
26940 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
26950 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
26960 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
26970 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26980 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
26990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
269a0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
269b0 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
269c0 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
269d0 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
269e0 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
269f0 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
26a00 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
26a10 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
26a20 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26a30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26a40 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
26a50 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
26a60 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26a70 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
26a80 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
26a90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26aa0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
26ab0 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
26ac0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26ad0 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
26ae0 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
26af0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26b00 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26b10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26b20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26b30 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26b50 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
26b60 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26b70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26b80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
26b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ba0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26bb0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
26bc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
26bd0 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
26be0 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  nt cackey_pkcs11
26bf0 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
26c00 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45  tes(CK_ATTRIBUTE
26c10 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54   *a, CK_ATTRIBUT
26c20 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65  E *b) {..unsigne
26c30 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66  d char *smallbuf
26c40 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69  , *largebuf;..si
26c50 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  ze_t smallbuf_le
26c60 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b  n, largebuf_len;
26c70 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21  ...if (a->type !
26c80 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72  = b->type) {...r
26c90 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43  eturn(0);..}...C
26ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26cb0 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  TF("    ... foun
26cc0 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20  d matching type 
26cd0 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ...");...CACKEY_
26ce0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
26cf0 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
26d00 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20  e:", a->pValue, 
26d10 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  a->ulValueLen);.
26d20 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20  ..if (b->pValue 
26d30 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
26d40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26d50 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
26d60 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
26d70 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
26d80 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70  );..}...if (a->p
26d90 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
26da0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
26db0 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c  .. .if (b->ulVal
26dc0 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61  ueLen == a->ulVa
26dd0 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70  lueLen && memcmp
26de0 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70  (a->pValue, b->p
26df0 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75  Value, b->ulValu
26e00 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  eLen) == 0) {...
26e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e20 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
26e30 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63  found exact matc
26e40 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
26e50 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
26e60 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73  a->type) {...cas
26e70 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
26e80 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
26e90 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75  Len == b->ulValu
26ea0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61  eLen) {.....brea
26eb0 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
26ec0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20  a->ulValueLen > 
26ed0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
26ee0 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20  .....smallbuf = 
26ef0 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73  b->pValue;.....s
26f00 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  mallbuf_len = b-
26f10 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09  >ulValueLen;....
26f20 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e  ..largebuf = a->
26f30 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67  pValue;.....larg
26f40 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  ebuf_len = a->ul
26f50 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65  ValueLen;....} e
26f60 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62  lse {.....smallb
26f70 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
26f80 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  ....smallbuf_len
26f90 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
26fa0 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20  ;......largebuf 
26fb0 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
26fc0 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20  .largebuf_len = 
26fd0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  b->ulValueLen;..
26fe0 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c  ..}.....for (; l
26ff0 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
27000 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72  mallbuf_len; lar
27010 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66  gebuf++,largebuf
27020 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66  _len--) {.....if
27030 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d   (largebuf[0] !=
27040 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   0) {......break
27050 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
27060 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65  .if (largebuf_le
27070 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
27080 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
27090 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d  ...}.....if (mem
270a0 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d  cmp(largebuf, sm
270b0 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  allbuf, smallbuf
270c0 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  _len) == 0) {...
270d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
270e0 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
270f0 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d  . found approxim
27100 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ate match");....
27110 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
27120 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
27130 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
27140 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27150 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
27160 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53  Objects)(CK_SESS
27170 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27180 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
27190 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
271a0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d  ct, CK_ULONG ulM
271b0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43  axObjectCount, C
271c0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
271d0 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73  bjectCount) {..s
271e0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
271f0 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
27200 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
27210 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c  urr_attr;..CK_UL
27220 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c  ONG curr_id_idx,
27230 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
27240 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c  , curr_attr_idx,
27250 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a   sess_attr_idx;.
27260 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65  .CK_ULONG matche
27270 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61  d_count, prev_ma
27280 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e  tched_count;..in
27290 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
272a0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
272b0 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
272c0 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d  TEST..struct tim
272d0 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b  eval start, end;
272e0 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74  ..uint64_t start
272f0 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23  _int, end_int;.#
27300 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
27310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27320 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27330 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27340 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27360 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27370 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27380 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27390 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
273a0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
273b0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
273c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
273d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
273e0 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
273f0 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
27400 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27410 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27420 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
27430 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
27440 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
27450 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
27460 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
27470 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
27480 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
27490 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
274a0 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
274b0 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
274c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
274d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
274e0 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
274f0 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
27500 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
27510 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
27520 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
27530 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
27540 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27550 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
27560 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27570 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27580 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27590 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
275a0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
275b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
275c0 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
275d0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
275e0 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
275f0 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
27600 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
27610 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
27620 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27630 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27640 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27650 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27660 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27670 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27690 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
276a0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
276b0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
276c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
276d0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
276e0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
276f0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
27700 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
27710 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
27720 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
27730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27740 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
27750 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
27760 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27770 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
27780 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27790 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
277a0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
277b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
277c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
277d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
277e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
277f0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
27800 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27810 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27820 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27830 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
27840 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27850 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
27860 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
27870 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27880 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
27890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
278a0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
278b0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
278c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
278d0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
278e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
278f0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
27900 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
27910 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
27920 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29  ay(&start, NULL)
27930 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f  ;.#endif...curr_
27940 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a  out_id_idx = 0;.
27950 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64  .for (curr_id_id
27960 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x = cackey_sessi
27970 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
27980 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75  arch_curr_id; cu
27990 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b  rr_id_idx < cack
279a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
279b0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
279c0 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f  _count && ulMaxO
279d0 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72  bjectCount; curr
279e0 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  _id_idx++) {...c
279f0 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79  urr_id = &cackey
27a00 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27a10 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63  on].identities[c
27a20 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09  urr_id_idx];....
27a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27a40 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20  NTF("Processing 
27a50 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28  identity:%lu", (
27a60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
27a70 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
27a80 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
27a90 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f  0;....for (curr_
27aa0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
27ab0 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61  rr_attr_idx < ca
27ac0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27ad0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
27ae0 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72  uery_count; curr
27af0 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
27b00 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  ..prev_matched_c
27b10 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63  ount = matched_c
27b20 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61  ount;.....curr_a
27b30 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ttr = &cackey_se
27b40 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27b50 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75  .search_query[cu
27b60 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  rr_attr_idx];...
27b70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27b80 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e  RINTF("  Checkin
27b90 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
27ba0 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20  %s (0x%08lx) in 
27bb0 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
27bc0 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
27bd0 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f  NC_ATTRIBUTE_TO_
27be0 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74  STR(curr_attr->t
27bf0 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
27c00 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
27c10 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72  >type, (int) cur
27c20 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41  r_id_idx);....CA
27c30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27c40 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c  BUF("    Value l
27c50 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75  ooking for:", cu
27c60 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
27c70 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
27c80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72  lueLen);.....for
27c90 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
27ca0 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
27cb0 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74  dx < curr_id->at
27cc0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
27cd0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
27ce0 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
27cf0 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
27d00 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72  _attributes(&cur
27d10 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
27d20 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c  [sess_attr_idx],
27d30 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09   curr_attr)) {..
27d40 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
27d50 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t++;.......break
27d60 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
27d70 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69  ./* If the attri
27d80 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  bute could not b
27d90 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f  e matched, do no
27da0 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61  t try to match a
27db0 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62  dditional attrib
27dc0 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70  utes */....if (p
27dd0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
27de0 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  t == matched_cou
27df0 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
27e00 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
27e10 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  (matched_count =
27e20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
27e30 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
27e40 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20  ch_query_count) 
27e50 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
27e60 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
27e70 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65  All %i attribute
27e80 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
27e90 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e  und, adding iden
27ea0 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72  tity:%i to retur
27eb0 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29  ned list", (int)
27ec0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
27ed0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
27ee0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
27ef0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
27f00 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b  );.....phObject[
27f10 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d  curr_out_id_idx]
27f20 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b   = curr_id_idx +
27f30 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a   1;.....ulMaxObj
27f40 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09  ectCount--;.....
27f50 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b  curr_out_id_idx+
27f60 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  +;...} else {...
27f70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27f80 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20  INTF("  ... Not 
27f90 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75  all %i (only fou
27fa0 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65  nd %i) attribute
27fb0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
27fc0 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20  und, not adding 
27fd0 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69  identity:%i", (i
27fe0 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
27ff0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28000 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
28010 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f  , (int) matched_
28020 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
28030 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09  r_id_idx);...}..
28040 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  }..cackey_sessio
28050 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28060 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75  rch_curr_id = cu
28070 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c  rr_id_idx;..*pul
28080 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75  ObjectCount = cu
28090 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a  rr_out_id_idx;..
280a0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
280b0 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
280c0 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
280d0 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a  ay(&end, NULL);.
280e0 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74  .start_int = (st
280f0 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  art.tv_sec * 100
28100 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76  0000) + start.tv
28110 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20  _usec;..end_int 
28120 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20  = (end.tv_sec * 
28130 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74  1000000) + end.t
28140 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66  v_usec;..fprintf
28150 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68  (stderr, "Search
28160 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73   took %lu micros
28170 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69  econds\n", (unsi
28180 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f  gned long) (end_
28190 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29  int - start_int)
281a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65  );.#endif...mute
281b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
281c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
281d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
281e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
281f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
28200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28210 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28220 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28230 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28240 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28260 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28270 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d  CKR_OK (%i), num
28280 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c   objects = %lu",
28290 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a   CKR_OK, *pulObj
282a0 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ectCount);...ret
282b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
282c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
282d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
282e0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b  ObjectsFinal)(CK
282f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28300 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
28310 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
28320 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
28330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28340 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28350 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28360 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28370 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28380 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28390 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
283a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
283b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
283c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
283d0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
283e0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
283f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
28400 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
28410 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28420 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
28430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28440 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28450 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
28460 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28470 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28480 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
28490 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
284a0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
284b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
284c0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
284d0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
284e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
284f0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
28500 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
28510 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28520 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28530 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28540 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
28550 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
28560 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28570 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28580 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28590 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
285a0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
285b0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
285c0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
285d0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
285e0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
285f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28600 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
28610 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28620 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28630 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28650 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
28660 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
28670 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28680 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
28690 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
286a0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
286b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
286c0 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
286d0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
286e0 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
286f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28700 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
28710 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
28720 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
28730 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
28740 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
28750 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65  Value) {....free
28760 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28770 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
28780 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
28790 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  lue);...}..}...i
287a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
287b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
287c0 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
287d0 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
287e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
287f0 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
28800 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
28810 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
28820 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28830 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
28840 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
28850 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28860 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
28870 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
28880 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28890 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
288a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
288b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
288c0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
288d0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
288e0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
288f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
28900 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
28910 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
28920 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28930 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
28940 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
28950 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
28960 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
28970 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28980 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
28990 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
289a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
289b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
289c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
289d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
289e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
289f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
28a00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
28a10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28a20 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
28a30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28a40 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
28a50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28a60 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
28a70 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
28a80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
28a90 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28aa0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
28ab0 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
28ac0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28ad0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
28ae0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
28af0 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
28b00 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
28b10 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
28b20 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
28b30 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
28b40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28b50 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
28b60 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
28b70 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
28b80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28b90 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
28ba0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
28bb0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28bc0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28bd0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
28be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28bf0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
28c00 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28c10 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
28c20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28c30 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
28c40 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
28c50 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
28c60 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28c70 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
28c80 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
28c90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
28ca0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
28cb0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
28cc0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
28cd0 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
28ce0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
28cf0 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
28d00 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
28d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28d20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28d30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28d40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28d60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28d70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28d80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28d90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28da0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
28db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28dc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
28dd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
28de0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
28df0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
28e00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
28e10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
28e20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
28e30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
28e40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
28e50 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
28e60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28e70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
28e80 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
28e90 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
28ea0 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
28eb0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
28ec0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
28ed0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28ee0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28ef0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28f00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28f10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28f20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28f30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28f40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
28f50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28f60 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28f70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28f80 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
28f90 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
28fa0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
28fb0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
28fc0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
28fd0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28fe0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
28ff0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
29000 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
29010 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29020 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29030 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
29040 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
29050 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
29060 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
29070 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
29080 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29090 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
290a0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
290b0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
290c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
290d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
290e0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
290f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29100 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29110 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29120 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
29130 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
29140 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29150 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
29160 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
29170 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
29180 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
29190 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
291a0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
291b0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
291c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
291d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
291e0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
291f0 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
29200 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
29210 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
29220 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
29230 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
29240 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
29250 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
29260 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
29270 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
29280 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
29290 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
292a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
292b0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
292c0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
292d0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
292e0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
292f0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29300 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
29310 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
29320 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29330 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
29340 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
29350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29360 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
29370 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
29380 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
29390 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
293a0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
293b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
293c0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
293d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
293e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
293f0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
29400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29410 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
29420 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
29430 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29440 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29450 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
29460 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29470 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
29480 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
29490 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
294a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
294b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
294c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
294d0 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
294e0 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
294f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29500 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
29510 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
29520 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
29530 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29540 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
29550 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29560 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29570 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29580 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29590 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
295a0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
295b0 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
295c0 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
295d0 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
295e0 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
295f0 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
29600 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
29610 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29620 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
29630 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
29640 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
29650 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
29660 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
29670 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
29680 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ypt_active = 1;.
29690 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
296a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
296b0 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ypt_mechanism = 
296c0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
296d0 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73  anism;..cackey_s
296e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
296f0 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
29700 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  arm = pMechanism
29710 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63  ->pParameter;..c
29720 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29730 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
29740 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20  _mech_parmlen = 
29750 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61  pMechanism->ulPa
29760 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63  rameterLen;..cac
29770 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29780 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
29790 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
297a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
297b0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
297c0 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
297d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
297e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
297f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
29800 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
29810 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29830 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
29840 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29850 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29860 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
29870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29880 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29890 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
298a0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
298b0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
298c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
298d0 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
298e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
298f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
29900 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
29910 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
29920 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
29930 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
29940 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
29950 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
29960 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
29970 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
29980 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
29990 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69   decrypt_ret;..i
299a0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
299b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
299c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
299d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
299e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
299f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
29a10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
29a20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29a30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
29a40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
29a50 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20  .if (pulDataLen 
29a60 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
29a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a80 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61  ("Error. pulData
29a90 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
29aa0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
29ab0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
29ac0 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  ...datalen_updat
29ad0 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b  e = *pulDataLen;
29ae0 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
29af0 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
29b00 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72  (hSession, pEncr
29b10 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63  yptedData, ulEnc
29b20 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70  ryptedDataLen, p
29b30 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75  Data, &datalen_u
29b40 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63  pdate);..if (dec
29b50 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
29b60 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
29b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29b80 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61  or.  DecryptUpda
29b90 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
29ba0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
29bb0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
29bc0 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
29bd0 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74  ;....if (decrypt
29be0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
29bf0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
29c00 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
29c10 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61  decryption opera
29c20 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65  tion */.....mute
29c30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
29c40 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
29c50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
29c60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29c70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
29c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29c90 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
29ca0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
29cb0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29cc0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
29cd0 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
29ce0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29cf0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
29d00 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
29d10 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29d20 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
29d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29d40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
29d50 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
29d60 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
29d70 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
29d80 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09  LE_INVALID);....
29d90 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
29da0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29db0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
29dc0 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
29dd0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29de0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29df0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
29e00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29e10 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
29e20 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
29e30 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
29e40 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
29e50 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
29e60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29e70 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
29e80 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
29e90 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29ea0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
29eb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29ec0 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
29ed0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
29ee0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
29ef0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29f00 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
29f10 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
29f20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
29f30 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
29f40 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
29f50 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  pt_ret);..}...if
29f60 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61   (pData) {...pDa
29f70 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70  ta += datalen_up
29f80 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65  date;..}..datale
29f90 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61  n_final = *pulDa
29fa0 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f  taLen - datalen_
29fb0 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70  update;...decryp
29fc0 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
29fd0 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  tFinal(hSession,
29fe0 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
29ff0 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65  _final);..if (de
2a000 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2a010 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2a020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a030 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e  ror.  DecryptFin
2a040 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
2a050 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2a060 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a070 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
2a080 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  ;....return(decr
2a090 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a  ypt_ret);..}...*
2a0a0 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74  pulDataLen = dat
2a0b0 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61  alen_update + da
2a0c0 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43  talen_final;...C
2a0d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a0e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a0f0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2a100 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2a110 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2a120 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a130 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64  RV, C_DecryptUpd
2a140 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2a150 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a160 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2a170 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2a180 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2a190 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2a1a0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2a1b0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2a1c0 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  tLen) {..static 
2a1d0 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38  CK_BYTE buf[1638
2a1e0 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66  4];..ssize_t buf
2a1f0 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
2a200 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
2a210 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2a220 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
2a230 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2a240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a260 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a270 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a290 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a2a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a2b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a2c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a2d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2a2e0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2a2f0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2a300 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2a310 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2a320 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2a330 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2a340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a350 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2a360 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2a370 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2a380 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2a390 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2a3a0 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
2a3b0 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
2a3c0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2a3d0 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2a3e0 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
2a3f0 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64  e are asked to d
2a400 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e  ecrypt nothing..
2a410 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
2a420 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a430 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2a440 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
2a450 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
2a460 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2a470 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
2a480 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  tedPart == NULL)
2a490 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a4a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a4b0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20   pEncryptedPart 
2a4c0 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45  is NULL, but ulE
2a4d0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2a4e0 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
2a4f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2a500 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2a510 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50  if (ulEncryptedP
2a520 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2a530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45  INTF("Error. ulE
2a550 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
2a560 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
2a570 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
2a580 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2a590 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2a5a0 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65  ...if (pulPartLe
2a5b0 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
2a5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a5d0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61  TF("Error. pulPa
2a5e0 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
2a5f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a600 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2a610 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2a620 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2a630 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2a640 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2a650 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2a660 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a670 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a680 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2a690 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a6a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2a6b0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2a6c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a6d0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2a6e0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2a6f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a700 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2a710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a720 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2a730 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2a740 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2a750 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2a760 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2a770 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a780 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
2a790 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
2a7a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a7b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a7c0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2a7d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a7e0 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2a7f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2a800 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2a810 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2a820 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  ZED);..}...slotI
2a830 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
2a840 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
2a850 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
2a860 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
2a870 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
2a880 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
2a890 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
2a8a0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2a8b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a8c0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2a8d0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2a8e0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
2a8f0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
2a900 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
2a910 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2a920 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
2a930 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2a940 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
2a950 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a960 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
2a970 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
2a980 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
2a990 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
2a9a0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
2a9b0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
2a9c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a9d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
2a9e0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a9f0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
2aa00 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2aa10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
2aa20 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
2aa30 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2aa40 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2aa50 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79  sk card to decry
2aa60 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20  pt */....buflen 
2aa70 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
2aa80 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
2aa90 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
2aaa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2aab0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
2aac0 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74  entity, pEncrypt
2aad0 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70  edPart, ulEncryp
2aae0 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c  tedPartLen, buf,
2aaf0 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c   sizeof(buf), 0,
2ab00 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66   1);.....if (buf
2ab10 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2ab20 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26  SC_E_NEEDLOGIN &
2ab30 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d  & cackey_pin_com
2ab40 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  mand != NULL) {.
2ab50 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67 69 6e  ....if (_C_Login
2ab60 4d 75 74 65 78 41 72 67 28 68 53 65 73 73 69 6f  MutexArg(hSessio
2ab70 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c  n, CKU_USER, NUL
2ab80 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b 52 5f  L, 0, 0) == CKR_
2ab90 4f 4b 29 20 7b 0a 09 09 09 09 09 62 75 66 6c 65  OK) {......bufle
2aba0 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64  n = cackey_signd
2abb0 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73  ecrypt(&cackey_s
2abc0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61  lots[slotID], ca
2abd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2abe0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2abf0 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79  identity, pEncry
2ac00 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72  ptedPart, ulEncr
2ac10 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75  yptedPartLen, bu
2ac20 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20  f, sizeof(buf), 
2ac30 30 2c 20 31 29 3b 0a 09 09 09 09 7d 0a 09 09 09  0, 1);.....}....
2ac40 7d 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  }.....if (buflen
2ac50 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
2ac60 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
2ac70 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66  . */.....if (buf
2ac80 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2ac90 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
2aca0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2acb0 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
2acc0 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
2acd0 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  se if (buflen ==
2ace0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
2acf0 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
2ad00 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2ad10 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
2ad20 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
2ad30 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
2ad40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
2ad50 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  ..}....} else if
2ad60 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
2ad70 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75  g) buflen) > *pu
2ad80 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72  lPartLen && pPar
2ad90 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  t) {...../* Decr
2ada0 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  ypted data too l
2adb0 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76  arge */.....retv
2adc0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
2add0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20  TOO_SMALL;....} 
2ade0 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70  else {.....if (p
2adf0 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d  Part) {......mem
2ae00 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20  cpy(pPart, buf, 
2ae10 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a  buflen);.....}..
2ae20 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20  ....*pulPartLen 
2ae30 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  = buflen;......r
2ae40 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
2ae50 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
2ae60 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2ae70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2ae80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ae90 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2aea0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2aeb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2aec0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aed0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2aee0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2aef0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2af00 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2af10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2af20 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
2af30 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
2af40 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2af50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2af60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2af70 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
2af80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2af90 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2afa0 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43  PTR pLastPart, C
2afb0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c  K_ULONG_PTR pulL
2afc0 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69  astPartLen) {..i
2afd0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2afe0 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
2aff0 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43  decrypt = 1;...C
2b000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b010 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b020 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b030 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b050 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b060 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b070 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b080 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b090 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2b0a0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2b0b0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2b0c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2b0d0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2b0e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b0f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2b100 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b110 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2b120 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2b130 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2b140 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2b150 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2b160 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e   (pulLastPartLen
2b170 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2b180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b190 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73  F("Error. pulLas
2b1a0 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c  tPartLen is NULL
2b1b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b1c0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2b1d0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2b1e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2b1f0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2b200 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2b210 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
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 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2b250 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b260 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b270 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2b280 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b290 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2b2a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2b2b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2b2c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2b2d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b2e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b2f0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2b300 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2b310 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2b320 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2b330 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2b340 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2b350 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
2b360 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b370 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b380 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2b390 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b3a0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f  ror.  Decrypt no
2b3b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2b3c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2b3d0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2b3e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70  ALIZED);..}...*p
2b3f0 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20  ulLastPartLen = 
2b400 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61  0;...if (pLastPa
2b410 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
2b420 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2b430 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
2b440 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2b450 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  t) {...cackey_se
2b460 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b470 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
2b480 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  = 0;..}...mutex_
2b490 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2b4a0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b4b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2b4c0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2b4d0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2b4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b4f0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2b500 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2b510 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2b520 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2b530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b540 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2b550 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2b560 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2b570 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2b580 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2b590 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74  RV, C_DigestInit
2b5a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2b5b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2b5c0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2b5d0 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41  Mechanism) {..CA
2b5e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b5f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2b600 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2b610 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2b620 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b630 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2b640 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2b650 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2b660 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2b670 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2b680 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b690 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2b6a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b6b0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2b6c0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b6d0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2b6e0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2b6f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2b700 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b710 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2b720 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f  igest)(CK_SESSIO
2b730 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b740 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b750 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2b760 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
2b770 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
2b780 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2b790 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
2b7a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b7b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b7c0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b7d0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b7e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b7f0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b800 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b810 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b820 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b830 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b850 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b860 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b870 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b880 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b890 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b8a0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b8b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b8c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b8d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2b8e0 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
2b8f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b900 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2b910 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2b920 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
2b930 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b940 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2b950 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2b960 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2b970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b980 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2b990 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2b9a0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b9b0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2b9c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b9d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b9e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b9f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ba00 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ba10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ba20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ba30 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2ba40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ba50 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2ba60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2ba70 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b   C_DigestKey)(CK
2ba80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ba90 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
2baa0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2bab0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2bac0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2bad0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2bae0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2baf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bb00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bb10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2bb20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2bb30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2bb40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2bb50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bb60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2bb70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2bb80 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2bb90 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2bba0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2bbb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2bbc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2bbd0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2bbe0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2bbf0 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  V, C_DigestFinal
2bc00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2bc10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2bc20 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73  _BYTE_PTR pDiges
2bc30 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2bc40 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a  pulDigestLen) {.
2bc50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bc60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2bc70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2bc80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2bc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bca0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2bcb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2bcc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2bcd0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2bce0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2bcf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bd00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2bd10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bd20 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2bd30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bd40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2bd50 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2bd60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bd70 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2bd80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2bd90 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53  C_SignInit)(CK_S
2bda0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2bdb0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2bdc0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2bdd0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2bde0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
2bdf0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2be00 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
2be10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2be20 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2be30 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2be40 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2be50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be60 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2be70 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2be80 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2be90 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bea0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2beb0 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
2bec0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2bed0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bee0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
2bef0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2bf00 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2bf10 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2bf20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
2bf30 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
2bf40 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
2bf50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bf60 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2bf70 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
2bf80 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
2bf90 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
2bfa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
2bfb0 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
2bfc0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2bfd0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2bfe0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2bff0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2c000 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2c010 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2c020 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2c030 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c040 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2c050 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2c060 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2c070 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2c080 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2c090 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2c0a0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2c0b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2c0c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2c0d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2c0e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c0f0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2c100 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c110 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c120 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2c130 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2c140 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2c150 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2c160 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c170 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2c180 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c190 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2c1a0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2c1b0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2c1c0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2c1d0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c1e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2c1f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c200 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2c210 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2c220 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c230 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2c240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c250 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65  rror.  Sign alre
2c260 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
2c270 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2c280 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
2c290 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
2c2a0 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
2c2b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c2c0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2c2d0 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
2c2e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2c2f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2c300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c310 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
2c320 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
2c330 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
2c340 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
2c350 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
2c360 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
2c370 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
2c380 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2c390 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c3a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2c3b0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
2c3c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
2c3d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2c3e0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
2c3f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c400 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b  sign_active = 1;
2c410 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2c420 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c430 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  n_mechanism = pM
2c440 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2c450 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ism;...cackey_se
2c460 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c470 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31  .sign_buflen = 1
2c480 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  28;..cackey_sess
2c490 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c4a0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b  ign_bufused = 0;
2c4b0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2c4c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c4d0 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  _buf = malloc(si
2c4e0 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
2c4f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c500 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
2c510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c520 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2c530 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  n);...CACKEY_DEB
2c540 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69  UG_PRINTF("Sessi
2c550 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e  on %lu sign_iden
2c560 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e  tity is %p (iden
2c570 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e  tity #%lu)", (un
2c580 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
2c590 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20  ssion, (void *) 
2c5a0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2c5b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2c5c0 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e  ities[hKey], (un
2c5d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
2c5e0 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  y);..cackey_sess
2c5f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c600 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26  ign_identity = &
2c610 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c620 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2c630 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75  ties[hKey];...mu
2c640 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2c650 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c660 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c670 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2c680 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2c690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c6a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2c6b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2c6c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c6d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c6e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c6f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c700 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2c710 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2c720 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2c730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2c740 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28  (CK_RV, C_Sign)(
2c750 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c760 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2c770 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2c780 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2c790 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2c7a0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2c7b0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
2c7c0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69  tureLen) {..unsi
2c7d0 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f  gned long start_
2c7e0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43  sign_bufused;..C
2c7f0 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09  K_RV sign_ret;..
2c800 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2c810 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2c820 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c830 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c840 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c850 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c860 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c870 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c880 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c890 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c8a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c8b0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2c8c0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2c8d0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2c8e0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2c8f0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2c900 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2c910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c920 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2c930 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2c940 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2c950 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2c960 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c970 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ...start_sign_bu
2c980 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73  fused = cackey_s
2c990 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c9a0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  ].sign_bufused;.
2c9b0 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
2c9c0 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69  ignUpdate(hSessi
2c9d0 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74  on, pData, ulDat
2c9e0 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  aLen);..if (sign
2c9f0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2ca00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ca10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ca20 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65   SignUpdate() re
2ca30 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
2ca40 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
2ca50 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2ca60 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73  n_ret);....if (s
2ca70 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42  ign_ret != CKR_B
2ca80 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2ca90 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76   {....mutex_retv
2caa0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2cab0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2cac0 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2cad0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2cae0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2caf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cb00 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2cb10 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2cb20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2cb30 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2cb40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2cb50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cb60 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2cb70 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2cb80 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2cb90 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2cba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2cbb0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2cbc0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2cbd0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2cbe0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2cbf0 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2cc00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2cc10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cc20 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2cc30 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2cc40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2cc50 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2cc60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cc70 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2cc80 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2cc90 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2cca0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2ccb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a  TIALIZED);....}.
2ccc0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2ccd0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cce0 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
2ccf0 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2cd00 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2cd10 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2cd20 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2cd30 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2cd40 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2cd50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cd60 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2cd70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2cd80 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2cd90 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2cda0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  }....return(sign
2cdb0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e  _ret);..}...sign
2cdc0 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e  _ret = C_SignFin
2cdd0 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69  al(hSession, pSi
2cde0 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e  gnature, pulSign
2cdf0 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28  atureLen);..if (
2ce00 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2ce10 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e  OK) {...if (sign
2ce20 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46  _ret == CKR_BUFF
2ce30 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2ce40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ce50 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61  PRINTF("SignFina
2ce60 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52  l() returned CKR
2ce70 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2ce80 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e  L (rv = %lu), un
2ce90 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
2cea0 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  te()", (unsigned
2ceb0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
2cec0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2ced0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cee0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73  sign_bufused = s
2cef0 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2cf00 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69  d;.....return(si
2cf10 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09  gn_ret);...}....
2cf20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cf30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2cf40 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
2cf50 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2cf60 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2cf70 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2cf80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
2cf90 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  n_ret);..}...if 
2cfa0 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e  (pSignature == N
2cfb0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2cfc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53  DEBUG_PRINTF("pS
2cfd0 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69  ignature specifi
2cfe0 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f  ed as NULL, undo
2cff0 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
2d000 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ()");....cackey_
2d010 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d020 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2d030 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
2d040 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28  used;....return(
2d050 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2d060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d070 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d080 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2d090 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2d0a0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2d0b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d0c0 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74  _RV, C_SignUpdat
2d0d0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2d0e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d0f0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2d100 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2d110 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
2d120 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2d130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d140 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d150 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d160 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d180 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d190 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d1a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d1b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d1c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2d1d0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2d1e0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2d1f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2d200 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2d210 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2d220 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2d230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d240 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2d250 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2d260 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2d270 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2d280 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2d290 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  pPart == NULL &&
2d2a0 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29   ulPartLen == 0)
2d2b0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2d2c0 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2d2d0 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f  asked to sign no
2d2e0 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
2d2f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d300 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2d310 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2d320 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2d330 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2d340 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2d350 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pPart == NULL) {
2d360 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d370 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2d380 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
2d390 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e  t ulPartLen is n
2d3a0 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2d3b0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2d3c0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2d3d0 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
2d3e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d3f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d400 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  ulPartLen is 0, 
2d410 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2d420 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2d430 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2d440 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
2d450 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2d460 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2d470 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2d480 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2d490 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2d4a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d4b0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2d4c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2d4d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2d4e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2d4f0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d500 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2d510 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2d520 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d530 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2d540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d550 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2d560 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2d570 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2d580 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2d590 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2d5a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2d5b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d5c0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2d5d0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2d5e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2d5f0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2d600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d610 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
2d620 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2d630 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2d640 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2d650 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
2d660 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2d670 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d680 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
2d690 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
2d6a0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
2d6b0 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20  mulate directly 
2d6c0 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65  */....if ((cacke
2d6d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d6e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2d6f0 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e  d + ulPartLen) >
2d700 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2d710 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2d720 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61  buflen) {.....ca
2d730 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d740 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2d750 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63  len *= 2;......c
2d760 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d770 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2d780 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b  f = realloc(cack
2d790 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d7a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
2d7b0 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
2d7c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d7d0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
2d7e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d7f0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2d800 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  len);....}.....m
2d810 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
2d820 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d830 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65  sign_buf + cacke
2d840 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d850 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2d860 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74  d, pPart, ulPart
2d870 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  Len);.....cackey
2d880 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d890 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2d8a0 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a   += ulPartLen;..
2d8b0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
2d8c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2d8d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d8e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d8f0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2d900 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2d910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d920 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2d930 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2d940 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2d950 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2d960 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d970 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d980 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2d990 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2d9a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2d9b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d9c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46  N(CK_RV, C_SignF
2d9d0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2d9e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d9f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2da00 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2da10 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
2da20 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  ureLen) {..stati
2da30 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66  c CK_BYTE sigbuf
2da40 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  [1024];..ssize_t
2da50 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f   sigbuflen;..CK_
2da60 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
2da70 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
2da80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2da90 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  R;..int terminat
2daa0 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74  e_sign = 1;..int
2dab0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2dac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2dad0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2dae0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2daf0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2db00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2db10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2db20 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2db30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2db40 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2db50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2db60 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  f (pulSignatureL
2db70 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2db80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2db90 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53  NTF("Error. pulS
2dba0 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e  ignatureLen is N
2dbb0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2dbc0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2dbd0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
2dbe0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2dbf0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2dc00 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2dc10 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2dc20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2dc30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2dc40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2dc50 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2dc60 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2dc70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2dc80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2dc90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2dca0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2dcb0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2dcc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2dcd0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2dce0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2dcf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dd00 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2dd10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2dd20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2dd30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2dd40 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2dd50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2dd60 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2dd70 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2dd80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2dd90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dda0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2ddb0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2ddc0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2ddd0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2dde0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2ddf0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2de00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2de10 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2de20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2de30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2de40 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2de50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2de60 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
2de70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2de80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2de90 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2dea0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2deb0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2dec0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2ded0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2dee0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2def0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2df00 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2df10 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2df20 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2df30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2df40 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2df50 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2df60 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2df70 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2df80 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2df90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2dfa0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2dfb0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2dfc0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2dfd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2dfe0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2dff0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2e000 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2e010 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2e020 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2e030 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2e040 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2e050 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2e060 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2e070 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2e080 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2e090 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e0a0 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
2e0b0 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2e0c0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
2e0d0 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
2e0e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2e0f0 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
2e100 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65  to sign from ide
2e110 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73  ntity %p in sess
2e120 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20  ion %lu", (void 
2e130 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  *) cackey_sessio
2e140 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e150 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73  n_identity, (uns
2e160 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
2e170 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66  sion);....sigbuf
2e180 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
2e190 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
2e1a0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
2e1b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e1c0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2e1d0 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
2e1e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e1f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
2e200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e210 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2e220 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
2e230 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
2e240 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  0);.....if (sigb
2e250 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2e260 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
2e270 20 26 26 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63   && cackey_pin_c
2e280 6f 6d 6d 61 6e 64 20 21 3d 20 4e 55 4c 4c 29 20  ommand != NULL) 
2e290 7b 0a 09 09 09 09 69 66 20 28 5f 43 5f 4c 6f 67  {.....if (_C_Log
2e2a0 69 6e 4d 75 74 65 78 41 72 67 28 68 53 65 73 73  inMutexArg(hSess
2e2b0 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c 20 4e  ion, CKU_USER, N
2e2c0 55 4c 4c 2c 20 30 2c 20 30 29 20 3d 3d 20 43 4b  ULL, 0, 0) == CK
2e2d0 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69 67  R_OK) {......sig
2e2e0 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
2e2f0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
2e300 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2e310 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
2e320 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e330 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
2e340 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2e350 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
2e360 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e370 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2e380 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
2e390 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
2e3a0 31 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09  1, 0);.....}....
2e3b0 7d 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66  }.....if (sigbuf
2e3c0 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
2e3d0 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64  * Signing failed
2e3e0 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67  . */.....if (sig
2e3f0 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
2e400 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
2e410 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
2e420 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
2e430 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
2e440 20 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66   else if (sigbuf
2e450 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2e460 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
2e470 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
2e480 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
2e490 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
2e4a0 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2e4b0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
2e4c0 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
2e4d0 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
2e4e0 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
2e4f0 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74  en) > *pulSignat
2e500 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61  ureLen && pSigna
2e510 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53  ture) {...../* S
2e520 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  igned data too l
2e530 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b  arge */.....CACK
2e540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e550 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  "retval = CKR_BU
2e560 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20  FFER_TOO_SMALL; 
2e570 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75   sigbuflen = %lu
2e580 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
2e590 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  n = %lu", (unsig
2e5a0 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66  ned long) sigbuf
2e5b0 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  len, (unsigned l
2e5c0 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75  ong) *pulSignatu
2e5d0 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74  reLen);......ret
2e5e0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
2e5f0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09  _TOO_SMALL;.....
2e600 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
2e610 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b  = 0;....} else {
2e620 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73  .....terminate_s
2e630 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66  ign = 0;......if
2e640 20 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a   (pSignature) {.
2e650 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67  .....memcpy(pSig
2e660 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20  nature, sigbuf, 
2e670 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09  sigbuflen);.....
2e680 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
2e690 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09   = 1;.....}.....
2e6a0 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  .*pulSignatureLe
2e6b0 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a  n = sigbuflen;..
2e6c0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2e6d0 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  _OK;....}.....br
2e6e0 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65  eak;..}...if (te
2e6f0 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a  rminate_sign) {.
2e700 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
2e710 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e720 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66  sign_buf) {....f
2e730 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
2e740 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2e750 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09  gn_buf);...}....
2e760 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2e770 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2e780 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
2e790 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2e7a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2e7b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2e7c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2e7d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2e7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e7f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2e800 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2e810 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e820 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2e830 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2e840 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2e850 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2e860 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2e870 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2e880 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e890 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
2e8a0 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53  overInit)(CK_SES
2e8b0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e8c0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2e8d0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2e8e0 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2e8f0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2e900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e910 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e920 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e930 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e950 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e960 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e970 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e980 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e990 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2e9a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e9b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e9c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e9d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2e9e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e9f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2ea00 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2ea10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2ea20 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2ea30 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2ea40 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45  gnRecover)(CK_SE
2ea50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2ea60 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2ea70 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2ea80 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2ea90 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2eaa0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2eab0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2eac0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2ead0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2eae0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2eaf0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2eb00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2eb10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2eb20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2eb30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2eb40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2eb50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2eb60 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2eb70 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2eb80 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2eb90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2eba0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ebb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ebc0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ebd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ebe0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ebf0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ec00 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e  K_RV, C_VerifyIn
2ec10 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2ec20 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2ec30 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2ec40 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2ec50 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2ec60 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2ec70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ec80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ec90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2eca0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ecb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ecc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2ecd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ece0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2ecf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2ed00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2ed10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2ed20 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2ed30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2ed40 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ed50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ed60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(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 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ed90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2eda0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28  K_RV, C_Verify)(
2edb0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2edc0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2edd0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2ede0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2edf0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2ee00 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2ee10 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
2ee20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2ee30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ee40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ee50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2ee60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ee70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ee80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2ee90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2eea0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2eeb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2eec0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2eed0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2eee0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2eef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2ef00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ef10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ef20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ef30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ef40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ef50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ef60 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70  K_RV, C_VerifyUp
2ef70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2ef80 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2ef90 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2efa0 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2efb0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2efc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2efd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2efe0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2eff0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f010 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f020 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f030 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f040 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f050 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f070 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f080 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f090 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f0a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f0b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f0c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f0d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f0e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f0f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2f100 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ifyFinal)(CK_SES
2f110 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f120 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2f130 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2f140 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75  _ULONG ulSignatu
2f150 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  reLen) {..CACKEY
2f160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2f170 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2f180 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2f190 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2f1a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2f1b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2f1c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2f1d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2f1e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2f1f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2f200 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2f210 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2f220 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f230 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2f240 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f250 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2f260 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f270 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2f280 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2f290 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2f2a0 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b  yRecoverInit)(CK
2f2b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f2c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2f2d0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2f2e0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2f2f0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2f300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f310 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2f320 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2f330 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2f340 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f350 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2f360 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2f370 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2f380 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2f390 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2f3a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f3b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f3c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f3d0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2f3e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f3f0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2f400 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2f410 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f420 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2f430 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2f440 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29  C_VerifyRecover)
2f450 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2f460 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2f470 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2f480 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ure, CK_ULONG ul
2f490 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b  SignatureLen, CK
2f4a0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2f4b0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2f4c0 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  lDataLen) {..CAC
2f4d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f4e0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2f4f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2f500 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2f510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f520 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2f530 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2f540 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2f550 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2f560 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2f570 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f580 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2f590 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f5a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2f5b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f5c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2f5d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2f5e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2f5f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2f600 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2f610 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
2f620 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2f630 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f640 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2f650 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2f660 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2f670 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2f680 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2f690 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2f6a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2f6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f6c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f6d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f6e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f6f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f700 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f710 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f720 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f730 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f740 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f750 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f760 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2f770 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2f780 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2f790 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f7a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f7b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f7c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2f7d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f7e0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44  K_RV, C_DecryptD
2f7f0 69 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f  igestUpdate)(CK_
2f800 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f810 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f820 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2f830 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2f840 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2f850 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2f860 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2f870 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2f880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f890 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2f8a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2f8b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2f8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f8d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2f8e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2f8f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2f900 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2f910 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2f920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f930 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f940 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f950 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2f960 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f970 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2f980 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2f990 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f9a0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2f9b0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2f9c0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2f9d0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2f9e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2f9f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2fa00 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2fa10 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2fa20 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2fa30 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2fa40 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2fa50 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2fa60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2fa70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2fa80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2fa90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2faa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2fab0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2fac0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2fad0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2fae0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2faf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2fb00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2fb10 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2fb20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fb30 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2fb40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fb50 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2fb60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fb70 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2fb80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2fb90 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2fba0 74 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43  tVerifyUpdate)(C
2fbb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2fbc0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2fbd0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2fbe0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2fbf0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2fc00 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2fc10 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2fc20 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2fc30 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2fc40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2fc50 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fc60 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fc70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fc80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fc90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fca0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fcb0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fcc0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fcd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fce0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2fcf0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fd00 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2fd10 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2fd20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2fd30 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2fd40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2fd50 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2fd60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fd70 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29  , C_GenerateKey)
2fd80 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2fd90 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2fda0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2fdb0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
2fdc0 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2fdd0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2fde0 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
2fdf0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2fe00 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2fe10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2fe20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2fe30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2fe40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2fe50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fe60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2fe70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2fe80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2fe90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2fea0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2feb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2fec0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2fed0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2fee0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2fef0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ff00 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ff10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ff20 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ff30 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ff40 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
2ff50 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53  KeyPair)(CK_SESS
2ff60 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ff70 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2ff80 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2ff90 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2ffa0 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d  TR pPublicKeyTem
2ffb0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2ffc0 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69  ulPublicKeyAttri
2ffd0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54  buteCount, CK_AT
2ffe0 54 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69  TRIBUTE_PTR pPri
2fff0 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c  vateKeyTemplate,
30000 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76   CK_ULONG ulPriv
30010 61 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43  ateKeyAttributeC
30020 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
30030 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62  HANDLE_PTR phPub
30040 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  licKey, CK_OBJEC
30050 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
30060 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41  rivateKey) {..CA
30070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30080 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30090 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
300a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
300b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
300c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
300d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
300e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
300f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
30100 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
30110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30120 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
30130 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30140 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
30150 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30160 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
30170 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
30180 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30190 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
301a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
301b0 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  rapKey)(CK_SESSI
301c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
301d0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
301e0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
301f0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
30200 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20  E hWrappingKey, 
30210 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
30220 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50   hKey, CK_BYTE_P
30230 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
30240 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
30250 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b  WrappedKeyLen) {
30260 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30270 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
30280 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
30290 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
302a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
302b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
302c0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
302d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
302e0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
302f0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
30300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30310 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
30320 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30330 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
30340 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30350 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
30360 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
30370 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30380 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
30390 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
303a0 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b   C_UnwrapKey)(CK
303b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
303c0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
303d0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
303e0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
303f0 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70  _HANDLE hUnwrapp
30400 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f  ingKey, CK_BYTE_
30410 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c  PTR pWrappedKey,
30420 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70   CK_ULONG ulWrap
30430 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54  pedKeyLen, CK_AT
30440 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
30450 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
30460 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74  ulAttributeCount
30470 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
30480 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a  LE_PTR phKey) {.
30490 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
304a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
304b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
304c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
304d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
304e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
304f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
30500 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
30510 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
30520 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
30530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30540 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30550 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30560 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
30570 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30580 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
30590 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
305a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
305b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
305c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
305d0 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f  C_DeriveKey)(CK_
305e0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
305f0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
30600 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
30610 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
30620 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c  HANDLE hBaseKey,
30630 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
30640 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
30650 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
30660 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
30670 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
30680 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
30690 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
306a0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
306b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
306c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
306d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
306e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
306f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
30700 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
30710 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
30720 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
30730 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30740 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
30750 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
30760 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30770 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30780 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
30790 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
307a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
307b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
307c0 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64  K_RV, C_SeedRand
307d0 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  om)(CK_SESSION_H
307e0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
307f0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65  CK_BYTE_PTR pSee
30800 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65  d, CK_ULONG ulSe
30810 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  edLen) {..CACKEY
30820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
30830 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
30840 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
30850 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
30860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
30870 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
30880 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
30890 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
308a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
308b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
308c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
308d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
308e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
308f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
30900 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30910 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
30920 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30930 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
30940 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
30950 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72  N(CK_RV, C_Gener
30960 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45  ateRandom)(CK_SE
30970 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
30980 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
30990 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20  TR pRandomData, 
309a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f  CK_ULONG ulRando
309b0 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  mLen) {..CACKEY_
309c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
309d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
309e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
309f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30a00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30a10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30a20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30a30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30a40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
30a50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
30a60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30a70 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30a80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30a90 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30aa0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30ab0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30ac0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30ad0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a  UPPORTED);.}../*
30ae0 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
30af0 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
30b00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
30b10 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  , C_GetFunctionS
30b20 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f  tatus)(CK_SESSIO
30b30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
30b40 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
30b50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
30b60 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
30b70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
30b80 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
30b90 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
30ba0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30bb0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
30bc0 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
30bd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
30be0 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
30bf0 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
30c00 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
30c10 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
30c20 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72  ng */.}../* Depr
30c30 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
30c40 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
30c50 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
30c60 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43  ancelFunction)(C
30c70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30c80 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
30c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30ca0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
30cb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30cc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
30cd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30ce0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
30cf0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
30d00 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
30d10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30d20 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
30d30 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
30d40 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
30d50 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
30d60 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
30d70 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
30d80 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
30d90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b  FunctionList)(CK
30da0 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50  _FUNCTION_LIST_P
30db0 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f  TR_PTR ppFunctio
30dc0 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e  nList) {..CK_FUN
30dd0 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70  CTION_LIST_PTR p
30de0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
30df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30e00 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30e10 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e  ..if (ppFunction
30e20 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
30e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30e40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70  RINTF("Error. pp
30e50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20  FunctionList is 
30e60 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
30e70 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
30e80 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e  _BAD);..}...pFun
30e90 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c  ctionList = mall
30ea0 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63  oc(sizeof(*pFunc
30eb0 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46  tionList));...pF
30ec0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72  unctionList->ver
30ed0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
30ee0 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
30ef0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
30f00 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75  16) & 0xff;..pFu
30f10 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
30f20 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
30f30 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
30f40 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
30f50 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e  ) & 0xff;...pFun
30f60 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
30f70 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74  tialize = C_Init
30f80 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ialize;..pFuncti
30f90 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69  onList->C_Finali
30fa0 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b  ze = C_Finalize;
30fb0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30fc0 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47  >C_GetInfo = C_G
30fd0 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  etInfo;..pFuncti
30fe0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f  onList->C_GetSlo
30ff0 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f  tList = C_GetSlo
31000 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tList;..pFunctio
31010 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
31020 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74  Info = C_GetSlot
31030 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
31040 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e  List->C_GetToken
31050 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65  Info = C_GetToke
31060 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
31070 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72  nList->C_WaitFor
31080 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61  SlotEvent = C_Wa
31090 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a  itForSlotEvent;.
310a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
310b0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
310c0 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e  st = C_GetMechan
310d0 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  ismList;..pFunct
310e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65  ionList->C_GetMe
310f0 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f  chanismInfo = C_
31100 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
31110 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31120 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20  ->C_InitToken = 
31130 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46  C_InitToken;..pF
31140 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
31150 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50  nitPIN = C_InitP
31160 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
31170 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43  st->C_SetPIN = C
31180 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  _SetPIN;..pFunct
31190 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53  ionList->C_OpenS
311a0 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53  ession = C_OpenS
311b0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
311c0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53  onList->C_CloseS
311d0 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65  ession = C_Close
311e0 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  Session;..pFunct
311f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65  ionList->C_Close
31200 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f  AllSessions = C_
31210 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
31220 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31230 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  ->C_GetSessionIn
31240 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f  fo = C_GetSessio
31250 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  nInfo;..pFunctio
31260 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72  nList->C_GetOper
31270 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47  ationState = C_G
31280 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
31290 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
312a0 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_SetOperation
312b0 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65  State = C_SetOpe
312c0 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
312d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
312e0 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a  ogin = C_Login;.
312f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31300 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67  C_Logout = C_Log
31310 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  out;..pFunctionL
31320 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a  ist->C_CreateObj
31330 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62  ect = C_CreateOb
31340 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
31350 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65  List->C_CopyObje
31360 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63  ct = C_CopyObjec
31370 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31380 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  t->C_DestroyObje
31390 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62  ct = C_DestroyOb
313a0 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ject;..pFunction
313b0 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63  List->C_GetObjec
313c0 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a  tSize = C_GetObj
313d0 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74  ectSize;..pFunct
313e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74  ionList->C_GetAt
313f0 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
31400 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
31410 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
31420 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75  st->C_SetAttribu
31430 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41  teValue = C_SetA
31440 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
31450 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31460 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74  _FindObjectsInit
31470 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
31480 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
31490 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65  List->C_FindObje
314a0 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65  cts = C_FindObje
314b0 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  cts;..pFunctionL
314c0 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
314d0 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64  tsFinal = C_Find
314e0 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70  ObjectsFinal;..p
314f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31500 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  EncryptInit = C_
31510 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  EncryptInit;..pF
31520 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
31530 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79  ncrypt = C_Encry
31540 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
31550 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64  st->C_EncryptUpd
31560 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55  ate = C_EncryptU
31570 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
31580 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74  nList->C_Encrypt
31590 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70  Final = C_Encryp
315a0 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
315b0 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
315c0 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70  tInit = C_Decryp
315d0 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
315e0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
315f0 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70   = C_Decrypt;..p
31600 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31610 44 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  DecryptUpdate = 
31620 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b  C_DecryptUpdate;
31630 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31640 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20  >C_DecryptFinal 
31650 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
31660 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31670 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d  ->C_DigestInit =
31680 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09   C_DigestInit;..
31690 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
316a0 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65  _Digest = C_Dige
316b0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
316c0 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61  st->C_DigestUpda
316d0 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64  te = C_DigestUpd
316e0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
316f0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79  ist->C_DigestKey
31700 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a   = C_DigestKey;.
31710 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31720 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20  C_DigestFinal = 
31730 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09  C_DigestFinal;..
31740 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31750 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69  _SignInit = C_Si
31760 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  gnInit;..pFuncti
31770 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d  onList->C_Sign =
31780 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74   C_Sign;..pFunct
31790 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55  ionList->C_SignU
317a0 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70  pdate = C_SignUp
317b0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
317c0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61  List->C_SignFina
317d0 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b  l = C_SignFinal;
317e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
317f0 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e  >C_SignRecoverIn
31800 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  it = C_SignRecov
31810 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  erInit;..pFuncti
31820 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65  onList->C_SignRe
31830 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65  cover = C_SignRe
31840 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
31850 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49  nList->C_VerifyI
31860 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e  nit = C_VerifyIn
31870 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
31880 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43  st->C_Verify = C
31890 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74  _Verify;..pFunct
318a0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
318b0 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69  yUpdate = C_Veri
318c0 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
318d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
318e0 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69  fyFinal = C_Veri
318f0 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  fyFinal;..pFunct
31900 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
31910 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43  yRecoverInit = C
31920 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
31930 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
31940 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
31950 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65  ver = C_VerifyRe
31960 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f  cover;..pFunctio
31970 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45  nList->C_DigestE
31980 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ncryptUpdate = C
31990 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
319a0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
319b0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44  List->C_DecryptD
319c0 69 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f  igestUpdate = C_
319d0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
319e0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
319f0 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79  ist->C_SignEncry
31a00 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67  ptUpdate = C_Sig
31a10 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a  nEncryptUpdate;.
31a20 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31a30 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
31a40 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
31a50 74 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  tVerifyUpdate;..
31a60 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31a70 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43  _GenerateKey = C
31a80 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70  _GenerateKey;..p
31a90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31aa0 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20  GenerateKeyPair 
31ab0 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50  = C_GenerateKeyP
31ac0 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  air;..pFunctionL
31ad0 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d  ist->C_WrapKey =
31ae0 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75   C_WrapKey;..pFu
31af0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e  nctionList->C_Un
31b00 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72  wrapKey = C_Unwr
31b10 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
31b20 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b  nList->C_DeriveK
31b30 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79  ey = C_DeriveKey
31b40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31b50 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d  ->C_SeedRandom =
31b60 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09   C_SeedRandom;..
31b70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31b80 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20  _GenerateRandom 
31b90 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64  = C_GenerateRand
31ba0 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
31bb0 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
31bc0 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46  nStatus = C_GetF
31bd0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09  unctionStatus;..
31be0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31bf0 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20  _CancelFunction 
31c00 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  = C_CancelFuncti
31c10 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
31c20 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f  st->C_GetFunctio
31c30 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e  nList = C_GetFun
31c40 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70  ctionList;...*pp
31c50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70  FunctionList = p
31c60 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09  FunctionList;...
31c70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
31c80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
31c90 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
31ca0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
31cb0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a                 KR_OK);.}..