Hex Artifact Content

Artifact 5d076538a251da0b0132216c25bd8205a00784b3:


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 75 6e 73 69 67 6e 65 64  slot {..unsigned
5460: 20 69 6e 74 20 69 64 3b 0a 0a 09 69 6e 74 20 61   int id;...int a
5470: 63 74 69 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65  ctive;..int inte
5480: 72 6e 61 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63  rnal;...char *pc
5490: 73 63 5f 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74  sc_reader;...int
54a0: 20 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65   pcsc_card_conne
54b0: 63 74 65 64 3b 0a 09 53 43 41 52 44 48 41 4e 44  cted;..SCARDHAND
54c0: 4c 45 20 70 63 73 63 5f 63 61 72 64 3b 0a 09 44  LE pcsc_card;..D
54d0: 57 4f 52 44 20 70 63 73 63 5f 73 74 61 74 65 3b  WORD pcsc_state;
54e0: 0a 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69  ...int transacti
54f0: 6f 6e 5f 64 65 70 74 68 3b 0a 09 69 6e 74 20 74  on_depth;..int t
5500: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
5510: 68 77 5f 6c 6f 63 6b 3b 0a 0a 09 69 6e 74 20 73  hw_lock;...int s
5520: 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 4b 5f  lot_reset;...CK_
5530: 46 4c 41 47 53 20 74 6f 6b 65 6e 5f 66 6c 61 67  FLAGS token_flag
5540: 73 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  s;...unsigned ch
5550: 61 72 20 2a 6c 61 62 65 6c 3b 0a 0a 09 44 57 4f  ar *label;...DWO
5560: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 75  RD protocol;...u
5570: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 61 63 68  nsigned int cach
5580: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
5590: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
55a0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
55b0: 63 68 65 64 5f 63 65 72 74 73 3b 0a 7d 3b 0a 0a  ched_certs;.};..
55c0: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09  typedef enum {..
55d0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 47  CACKEY_TLV_APP_G
55e0: 45 4e 45 52 49 43 20 3d 20 30 78 30 31 2c 0a 09  ENERIC = 0x01,..
55f0: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
5600: 4b 49 20 20 20 20 20 3d 20 30 78 30 32 2c 0a 09  KI     = 0x02,..
5610: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
5620: 4b 49 20 20 20 20 20 3d 20 30 78 30 34 0a 7d 20  KI     = 0x04.} 
5630: 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74 79  cackey_tlv_appty
5640: 70 65 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75  pe;..typedef enu
5650: 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  m {..CACKEY_TLV_
5660: 4f 42 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46  OBJID_GENERALINF
5670: 4f 20 20 20 20 20 20 20 3d 20 30 78 32 30 30 30  O       = 0x2000
5680: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5690: 4a 49 44 5f 50 52 4f 50 45 52 53 4f 4e 41 4c 49  JID_PROPERSONALI
56a0: 4e 46 4f 20 20 20 3d 20 30 78 32 31 30 30 2c 0a  NFO   = 0x2100,.
56b0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
56c0: 44 5f 41 43 43 45 53 53 43 4f 4e 54 52 4f 4c 20  D_ACCESSCONTROL 
56d0: 20 20 20 20 3d 20 30 78 33 30 30 30 2c 0a 09 43      = 0x3000,..C
56e0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
56f0: 4c 4f 47 49 4e 20 20 20 20 20 20 20 20 20 20 20  LOGIN           
5700: 20 20 3d 20 30 78 34 30 30 30 2c 0a 09 43 41 43    = 0x4000,..CAC
5710: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5720: 52 44 49 4e 46 4f 20 20 20 20 20 20 20 20 20 20  RDINFO          
5730: 3d 20 30 78 35 30 30 30 2c 0a 09 43 41 43 4b 45  = 0x5000,..CACKE
5740: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42 49 4f 4d  Y_TLV_OBJID_BIOM
5750: 45 54 52 49 43 53 20 20 20 20 20 20 20 20 3d 20  ETRICS        = 
5760: 30 78 36 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x6000,..CACKEY_
5770: 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41  TLV_OBJID_DIGITA
5780: 4c 53 49 47 43 45 52 54 20 20 20 20 3d 20 30 78  LSIGCERT    = 0x
5790: 37 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  7000,..CACKEY_TL
57a0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
57b0: 4f 4e 20 20 20 20 20 20 20 20 3d 20 30 78 30 32  ON        = 0x02
57c0: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
57d0: 4f 42 4a 49 44 5f 43 41 43 5f 42 45 4e 45 46 49  OBJID_CAC_BENEFI
57e0: 54 53 20 20 20 20 20 20 3d 20 30 78 30 32 30 32  TS      = 0x0202
57f0: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5800: 4a 49 44 5f 43 41 43 5f 4f 54 48 45 52 42 45 4e  JID_CAC_OTHERBEN
5810: 45 46 49 54 53 20 3d 20 30 78 30 32 30 33 2c 0a  EFITS = 0x0203,.
5820: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5830: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 4e 45 4c 20  D_CAC_PERSONNEL 
5840: 20 20 20 20 3d 20 30 78 30 32 30 31 2c 0a 09 43      = 0x0201,..C
5850: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5860: 43 41 43 5f 50 4b 49 43 45 52 54 20 20 20 20 20  CAC_PKICERT     
5870: 20 20 3d 20 30 78 30 32 46 45 0a 7d 20 63 61 63    = 0x02FE.} cac
5880: 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64  key_tlv_objectid
5890: 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20  ;..typedef enum 
58a0: 7b 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  {..CACKEY_PCSC_S
58b0: 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 20 20 20  _TOKENPRESENT   
58c0: 20 3d 20 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43   = 1,..CACKEY_PC
58d0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
58e0: 20 20 20 20 20 3d 20 30 2c 0a 09 43 41 43 4b 45       = 0,..CACKE
58f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
5900: 20 20 20 20 20 20 20 20 20 3d 20 2d 31 2c 0a 09           = -1,..
5910: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
5920: 44 50 49 4e 20 20 20 20 20 20 20 20 20 20 3d 20  DPIN          = 
5930: 2d 32 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -2,..CACKEY_PCSC
5940: 5f 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20  _E_LOCKED       
5950: 20 20 20 3d 20 2d 33 2c 0a 09 43 41 43 4b 45 59     = -3,..CACKEY
5960: 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
5970: 4e 20 20 20 20 20 20 20 3d 20 2d 34 2c 0a 09 43  N       = -4,..C
5980: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
5990: 45 4e 41 42 53 45 4e 54 20 20 20 20 20 3d 20 2d  ENABSENT     = -
59a0: 36 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  6,..CACKEY_PCSC_
59b0: 45 5f 52 45 54 52 59 20 20 20 20 20 20 20 20 20  E_RETRY         
59c0: 20 20 3d 20 2d 37 0a 7d 20 63 61 63 6b 65 79 5f    = -7.} cackey_
59d0: 72 65 74 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ret;..struct cac
59e0: 6b 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20  key_tlv_cardurl 
59f0: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
5a00: 20 20 20 20 20 20 20 20 72 69 64 5b 35 5d 3b 0a          rid[5];.
5a10: 09 63 61 63 6b 65 79 5f 74 6c 76 5f 61 70 70 74  .cackey_tlv_appt
5a20: 79 70 65 20 20 20 61 70 70 74 79 70 65 3b 0a 09  ype   apptype;..
5a30: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5a40: 74 69 64 20 20 6f 62 6a 65 63 74 69 64 3b 0a 09  tid  objectid;..
5a50: 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62 6a 65 63  cackey_tlv_objec
5a60: 74 69 64 20 20 61 70 70 69 64 3b 0a 09 75 6e 73  tid  appid;..uns
5a70: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
5a80: 20 20 70 69 6e 69 64 3b 0a 7d 3b 0a 0a 73 74 72    pinid;.};..str
5a90: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5aa0: 6e 74 69 74 79 3b 0a 73 74 72 75 63 74 20 63 61  ntity;.struct ca
5ab0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5ac0: 7b 0a 09 75 69 6e 74 38 5f 74 20 74 61 67 3b 0a  {..uint8_t tag;.
5ad0: 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a  .size_t length;.
5ae0: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 76 6f 69 64  ..union {...void
5af0: 20 2a 76 61 6c 75 65 3b 0a 09 09 73 74 72 75 63   *value;...struc
5b00: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61 72  t cackey_tlv_car
5b10: 64 75 72 6c 20 2a 76 61 6c 75 65 5f 63 61 72 64  durl *value_card
5b20: 75 72 6c 3b 0a 09 09 75 69 6e 74 38 5f 74 20 76  url;...uint8_t v
5b30: 61 6c 75 65 5f 62 79 74 65 3b 0a 09 7d 3b 0a 0a  alue_byte;..};..
5b40: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5b50: 6c 76 5f 65 6e 74 69 74 79 20 2a 5f 6e 65 78 74  lv_entity *_next
5b60: 3b 0a 7d 3b 0a 0a 2f 2a 20 43 41 43 4b 45 59 20  ;.};../* CACKEY 
5b70: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5b80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
5b90: 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 20 3d 20  ackey_biglock = 
5ba0: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 73 74 72  NULL;.static str
5bb0: 75 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69  uct cackey_sessi
5bc0: 6f 6e 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  on cackey_sessio
5bd0: 6e 73 5b 31 32 38 5d 3b 0a 73 74 61 74 69 63 20  ns[128];.static 
5be0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
5bf0: 6f 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ot cackey_slots[
5c00: 31 32 38 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  128];.static int
5c10: 20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69   cackey_initiali
5c20: 7a 65 64 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  zed = 0;.static 
5c30: 69 6e 74 20 63 61 63 6b 65 79 5f 62 69 67 6c 6f  int cackey_biglo
5c40: 63 6b 5f 69 6e 69 74 20 3d 20 30 3b 0a 43 4b 5f  ck_init = 0;.CK_
5c50: 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
5c60: 53 20 63 61 63 6b 65 79 5f 61 72 67 73 3b 0a 0a  S cackey_args;..
5c70: 2f 2a 2a 20 45 78 74 72 61 20 63 65 72 74 69 66  /** Extra certif
5c80: 69 63 61 74 65 73 20 74 6f 20 69 6e 63 6c 75 64  icates to includ
5c90: 65 20 69 6e 20 74 6f 6b 65 6e 20 2a 2a 2f 0a 73  e in token **/.s
5ca0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
5cb0: 63 5f 69 64 65 6e 74 69 74 79 20 65 78 74 72 61  c_identity extra
5cc0: 5f 63 65 72 74 73 5b 5d 20 3d 20 7b 0a 23 69 6e  _certs[] = {.#in
5cd0: 63 6c 75 64 65 20 22 63 61 63 6b 65 79 5f 62 75  clude "cackey_bu
5ce0: 69 6c 74 69 6e 5f 63 65 72 74 73 2e 68 22 0a 7d  iltin_certs.h".}
5cf0: 3b 0a 0a 2f 2a 20 50 72 6f 74 65 63 74 65 64 20  ;../* Protected 
5d00: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 50  Authentication P
5d10: 61 74 68 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 23  ath command */.#
5d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 50 49  define CACKEY_PI
5d30: 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c  N_COMMAND_DEFAUL
5d40: 54 5f 58 53 54 52 28 73 74 72 29 20 43 41 43 4b  T_XSTR(str) CACK
5d50: 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44  EY_PIN_COMMAND_D
5d60: 45 46 41 55 4c 54 5f 53 54 52 28 73 74 72 29 0a  EFAULT_STR(str).
5d70: 23 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 50  #define CACKEY_P
5d80: 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
5d90: 4c 54 5f 53 54 52 28 73 74 72 29 20 23 73 74 72  LT_STR(str) #str
5da0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 61  .static char *ca
5db0: 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
5dc0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
5dd0: 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 70 69 6e  char *cackey_pin
5de0: 5f 63 6f 6d 6d 61 6e 64 5f 78 6f 6e 6c 79 20 3d  _command_xonly =
5df0: 20 4e 55 4c 4c 3b 0a 0a 2f 2a 20 50 43 53 43 20   NULL;../* PCSC 
5e00: 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20 2a  Global Handles *
5e10: 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52 44  /.static LPSCARD
5e20: 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f 70  CONTEXT cackey_p
5e30: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
5e40: 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67  L;..static unsig
5e50: 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f  ned long cackey_
5e60: 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  getversion(void)
5e70: 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69 67   {..static unsig
5e80: 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c 20  ned long retval 
5e90: 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65 64  = 255;..unsigned
5ea0: 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30 3b   long major = 0;
5eb0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5ec0: 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61 72  minor = 0;..char
5ed0: 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e 55   *major_str = NU
5ee0: 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f 72  LL;..char *minor
5ef0: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 43  _str = NULL;...C
5f00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
5f10: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
5f20: 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20 32  .if (retval != 2
5f30: 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  55) {...CACKEY_D
5f40: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
5f50: 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63 61  urning 0x%lx (ca
5f60: 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c 29  ched).", retval)
5f70: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
5f80: 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c  al);..}...retval
5f90: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50 41   = 0;..#ifdef PA
5fa0: 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20 20  CKAGE_VERSION.  
5fb0: 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72 20        major_str 
5fc0: 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  = PACKAGE_VERSIO
5fd0: 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73 74  N;..if (major_st
5fe0: 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d 61  r) {..        ma
5ff0: 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d 61  jor = strtoul(ma
6000: 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72 5f  jor_str, &minor_
6010: 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66 20  str, 10);....if 
6020: 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09 09  (minor_str) {...
6030: 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75 6c  .minor = strtoul
6040: 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c 20  (minor_str + 1, 
6050: 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a 09  NULL, 10);...}..
6060: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d 61  }...retval = (ma
6070: 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d 69  jor << 16) | (mi
6080: 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64 69  nor << 8);.#endi
6090: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
60a0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
60b0: 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76 61  ng 0x%lx", retva
60c0: 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
60d0: 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f 53  val);.}../* PC/S
60e0: 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69  C Related Functi
60f0: 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e  ons */./*. * SYN
6100: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
6110: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
6120: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
6130: 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  id);. *. * ARGUM
6140: 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ENTS. *     None
6150: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
6160: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
6170: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
6180: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
6190: 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f   disconnects fro
61a0: 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a 0a  m all cards.. *.
61b0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
61c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
61d0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69 64  connect_all(void
61e0: 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  ) {..uint32_t id
61f0: 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  x;...CACKEY_DEBU
6200: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
6210: 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20  .");...for (idx 
6220: 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
6230: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
6240: 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
6250: 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
6260: 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
6270: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
6280: 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f 2a 20  ternal) {..../* 
6290: 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20 73 6c  Skip internal sl
62a0: 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e  ots */....contin
62b0: 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  ue;...}....if (c
62c0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
62d0: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
62e0: 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b 45  cted) {....CACKE
62f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6300: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
6310: 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28 75  %lu) called", (u
6320: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
6330: 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73  x);.....SCardDis
6340: 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f 73  connect(cackey_s
6350: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
6360: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
6370: 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09 69  _CARD);...}....i
6380: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6390: 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  idx].label) {...
63a0: 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
63b0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b 0a  ts[idx].label);.
63c0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
63d0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  [idx].label = NU
63e0: 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  LL;...}....cacke
63f0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
6400: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
6410: 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
6420: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6430: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
6440: 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
6450: 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
6460: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
6470: 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  0;....if (cackey
6480: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69  _slots[idx].acti
6490: 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  ve) {....CACKEY_
64a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
64b0: 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c 6f  rking active slo
64c0: 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20 72  t %lu as being r
64d0: 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65 64  eset", (unsigned
64e0: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09 7d   long) idx);...}
64f0: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6500: 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
6510: 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
6520: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6530: 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09 72  Returning");...r
6540: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
6550: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6560: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6570: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
6580: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
6590: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
65a0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
65b0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
65c0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
65d0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
65e0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
65f0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
6600: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
6610: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6620: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65 63   function connec
6630: 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43 20  ts to the PC/SC 
6640: 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61 67  Connection Manag
6650: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 74  er and updates t
6660: 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61 6c  he. *     global
6670: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6680: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6690: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  t cackey_pcsc_co
66a0: 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c  nnect(void) {..L
66b0: 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63 6f  ONG scard_est_co
66c0: 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64 65  ntext_ret;.#ifde
66d0: 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56 41  f HAVE_SCARDISVA
66e0: 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e 47  LIDCONTEXT..LONG
66f0: 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72   scard_isvalid_r
6700: 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  et;.#endif...CAC
6710: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6720: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
6730: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
6740: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
6750: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6760: 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 73  andle = malloc(s
6770: 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70 63  izeof(*cackey_pc
6780: 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09 69  sc_handle));...i
6790: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
67a0: 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  andle == NULL) {
67b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
67c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
67d0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
67e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
67f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63 61  ailure");.....ca
6800: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
6810: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
6820: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6830: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
6840: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
6850: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6860: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6870: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
6880: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6890: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
68a0: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
68b0: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
68c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
68d0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
68e0: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
68f0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
6900: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6910: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
6920: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6930: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
6940: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
6950: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
6960: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
6970: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
6980: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6990: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
69a0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
69b0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
69c0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
69d0: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
69e0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
69f0: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
6a00: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
6a10: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6a20: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6a30: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6a40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6a50: 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  ERIC);...}..}..#
6a60: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
6a70: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
6a80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6a90: 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c 69  NTF("SCardIsVali
6aa0: 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65  dContext() calle
6ab0: 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76 61  d");..scard_isva
6ac0: 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64 49  lid_ret = SCardI
6ad0: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a 63  sValidContext(*c
6ae0: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6af0: 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 69  e);..if (scard_i
6b00: 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53 43  svalid_ret != SC
6b10: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6b20: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6b30: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6b40: 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  as become invali
6b50: 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64 43  d (SCardIsValidC
6b60: 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69 29  ontext = %s/%li)
6b70: 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d 65  , trying to re-e
6b80: 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43 41  stablish...", CA
6b90: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
6ba0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
6bb0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6bc0: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
6bd0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a 0a  _isvalid_ret);..
6be0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6bf0: 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61  RINTF("SCardEsta
6c00: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63  blishContext() c
6c10: 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64  alled");...scard
6c20: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6c30: 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73   = SCardEstablis
6c40: 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53  hContext(SCARD_S
6c50: 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c  COPE_SYSTEM, NUL
6c60: 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f  L, NULL, cackey_
6c70: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
6c80: 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
6c90: 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
6ca0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
6cb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6cc0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20  PRINTF("Call to 
6cd0: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6ce0: 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65  ntext failed (re
6cf0: 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20  turned %s/%li), 
6d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
6d10: 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45  lure", CACKEY_DE
6d20: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
6d30: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65  R_TO_STR(scard_e
6d40: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c  st_context_ret),
6d50: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73   (long) scard_es
6d60: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a  t_context_ret);.
6d70: 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
6d80: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09  pcsc_handle);...
6d90: 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  .cackey_pcsc_han
6da0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  dle = NULL;.....
6db0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6dc0: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
6dd0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6de0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6df0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
6e00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61  DEBUG_PRINTF("Ha
6e10: 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65  ndle has been re
6e20: 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b 0a  -established");.
6e30: 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  .}.#endif...CACK
6e40: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6e50: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  "Sucessfully con
6e60: 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43 2c  nected to PC/SC,
6e70: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75   returning in su
6e80: 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75 72  ccess");...retur
6e90: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
6ea0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  OK);.}../*. * SY
6eb0: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
6ec0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6ed0: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
6ee0: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
6ef0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
6f00: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
6f10: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
6f20: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
6f30: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
6f40: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6f50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
6f60: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
6f70: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6f80: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
6f90: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20  nnects from the 
6fa0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
6fb0: 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64   manager and upd
6fc0: 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65 20  ates. *     the 
6fd0: 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20  global handle.. 
6fe0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
6ff0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70  key_ret cackey_p
7000: 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 76  csc_disconnect(v
7010: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
7020: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
7030: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
7040: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7050: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
7060: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
7070: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
7080: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
7090: 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64  _OK);..}...scard
70a0: 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _rel_context_ret
70b0: 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65 43   = SCardReleaseC
70c0: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
70d0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69  csc_handle);...i
70e0: 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  f (cackey_pcsc_h
70f0: 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65 28  andle) {...free(
7100: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7110: 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79 5f  le);.....cackey_
7120: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
7130: 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  LL;..}...if (sca
7140: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
7150: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
7160: 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75 72  CCESS) {...retur
7170: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
7180: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 72  GENERIC);..}...r
7190: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
71a0: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
71b0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
71c0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61    void cackey_ma
71d0: 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 74  rk_slot_reset(st
71e0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
71f0: 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41   *slot);. *. * A
7200: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
7210: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
7220: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
7230: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
7240: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
7250: 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c 6f  tion marks a slo
7260: 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65 65  t has having bee
7270: 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74 65  n reset, to late
7280: 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 2e  r be cleaned up.
7290: 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70 20  . *     Cleanup 
72a0: 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
72b0: 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69 65  n a PKCS#11 clie
72c0: 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64 4f  nt calls C_FindO
72d0: 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a 20  bjectsInit.. *. 
72e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
72f0: 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
7300: 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61 63  reset(struct cac
7310: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
7320: 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e  {..if (slot == N
7330: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
7340: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
7350: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
7360: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
7370: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7380: 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61 72 64  ected) {...SCard
7390: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
73a0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
73b0: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
73c0: 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72  }...slot->slot_r
73d0: 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74 2d  eset = 1;..slot-
73e0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
73f0: 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f 74 2d  cted = 0;..slot-
7400: 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
7410: 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
7420: 44 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 73  D;..slot->pcsc_s
7430: 74 61 74 65 20 3d 20 53 43 41 52 44 5f 53 54 41  tate = SCARD_STA
7440: 54 45 5f 55 4e 41 57 41 52 45 3b 0a 0a 09 43 41  TE_UNAWARE;...CA
7450: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7460: 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b  F("Returning.");
7470: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
7480: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
7490: 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f      LONG cackey_
74a0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
74b0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
74c0: 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64  t *slot, DWORD d
74d0: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c  efault_protocol,
74e0: 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65   LPDWORD selecte
74f0: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a  d_protocol);. *.
7500: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
7510: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
7520: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
7530: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
7540: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
7550: 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c      DWORD defaul
7560: 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20  t_protocol. *   
7570: 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74        Protocol t
7580: 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a  o attempt first.
7590: 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f 52   *. *     LPDWOR
75a0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
75b0: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  col. *         [
75c0: 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65  OUT] Protocol se
75d0: 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54  lected. *. * RET
75e0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
75f0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
7600: 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f  e from SCardReco
7610: 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f  nnect(). *. * NO
7620: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
7630: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
7640: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61  apper around SCa
7650: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a  rdReconnect(). *
7660: 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61 72  . *     The SCar
7670: 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e  dReconnect() fun
7680: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20  ction call will 
7690: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20  be called first 
76a0: 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20  with the. *     
76b0: 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f  dwPreferredProto
76c0: 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74  cols of "default
76d0: 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20  _protocol".  If 
76e0: 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e  that call return
76f0: 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45  s. *     SCARD_E
7700: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20  _PROTO_MISMATCH 
7710: 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20 61  try again with a
7720: 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30   protocol of T=0
7730: 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a  , and failing. *
7740: 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20       that T=1.. 
7750: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e  *. */.static LON
7760: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7770: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7780: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7790: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
77a0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
77b0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
77c0: 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  col) {..LONG sca
77d0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73  rd_conn_ret;...s
77e0: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
77f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
7800: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7810: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7820: 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74  ED, default_prot
7830: 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45  ocol, SCARD_RESE
7840: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7850: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66  _protocol);...if
7860: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
7870: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
7880: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
7890: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
78a0: 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e  NTF("SCardReconn
78b0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
78c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
78d0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
78e0: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
78f0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7900: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7910: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7920: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7930: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7940: 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45  COL_T0, SCARD_RE
7950: 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74  SET_CARD, select
7960: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  ed_protocol);...
7970: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7980: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7990: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
79a0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
79b0: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
79c0: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
79d0: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
79e0: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
79f0: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7a00: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
7a10: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7a20: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7a30: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7a40: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
7a50: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41  PROTOCOL_T1, SCA
7a60: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73  RD_RESET_CARD, s
7a70: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
7a80: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  );...}..}...retu
7a90: 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  rn(scard_conn_re
7aa0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
7ab0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7ac0: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
7ad0: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7ae0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7af0: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
7b00: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
7b10: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
7b20: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
7b30: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
7b40: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
7b50: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
7b60: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
7b70: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
7b80: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
7b90: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
7ba0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
7bb0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
7bc0: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
7bd0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7be0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7bf0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7c00: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
7c10: 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
7c20: 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
7c30: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47   protocol;..LONG
7c40: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7c50: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7c60: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
7c70: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20  );...if (!slot) 
7c80: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7c90: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
7ca0: 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c   slot specified,
7cb0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
7cc0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
7cd0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7ce0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
7cf0: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7d00: 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63   = cackey_pcsc_c
7d10: 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70  onnect();..if (p
7d20: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7d30: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
7d40: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
7d50: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
7d60: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
7d70: 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  C failed, return
7d80: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
7d90: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7da0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7db0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e  C);..}.../* Conn
7dc0: 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69  ect to reader, i
7dd0: 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20  f needed */..if 
7de0: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
7df0: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7e00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7e10: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
7e20: 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20  ct(%s) called", 
7e30: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7e40: 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e  r);...scard_conn
7e50: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7e60: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7e70: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7e80: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7e90: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7ea0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7eb0: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
7ec0: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
7ed0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
7ee0: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
7ef0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
7f00: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7f10: 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45  ATCH) {....CACKE
7f20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7f30: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7f40: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7f50: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7f60: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7f70: 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f   T=0")....scard_
7f80: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
7f90: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
7fa0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
7fb0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
7fc0: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7fd0: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7fe0: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
7ff0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
8000: 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61  ol);.....if (sca
8010: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
8020: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8030: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43  MATCH) {.....CAC
8040: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8050: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8060: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
8070: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8080: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
8090: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61  st T=1").....sca
80a0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
80b0: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
80c0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
80d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
80e0: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
80f0: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
8100: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
8110: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8120: 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d  tocol);....}...}
8130: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8140: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8150: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
8160: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8170: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
8180: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8190: 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ned SCARD_W_UNPO
81a0: 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69  WERED_CARD, tryi
81b0: 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74  ng to re-connect
81c0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
81d0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
81e0: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
81f0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8200: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8210: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52   SCARD_SHARE_DIR
8220: 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  ECT, SCARD_PROTO
8230: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
8240: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
8250: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
8260: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
8270: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8280: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8290: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
82a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
82b0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
82c0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
82d0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
82e0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
82f0: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
8300: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8310: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8320: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8330: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8340: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
8350: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
8360: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26  D_PROTOCOL_T0, &
8370: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
8380: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
8390: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
83a0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
83b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
83c0: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
83d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
83e0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
83f0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8400: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8410: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
8420: 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f  ")......scard_co
8430: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8440: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
8450: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
8460: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
8470: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
8480: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8490: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
84a0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
84b0: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
84c0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
84d0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
84e0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70  ect_card(slot, p
84f0: 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63  rotocol, &protoc
8500: 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ol);...}....if (
8510: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
8520: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
8530: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
8540: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
8550: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
8560: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
8570: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
8580: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
8590: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
85a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
85b0: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
85c0: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
85d0: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
85e0: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
85f0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8600: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
8610: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8620: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
8630: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8640: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c  _depth = 0;...sl
8650: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8660: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
8670: 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ;...slot->protoc
8680: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
8690: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
86a0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
86b0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
86c0: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
86d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
86e0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
86f0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
8700: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
8710: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8720: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8730: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8740: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8750: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8760: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8770: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8780: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8790: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
87a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
87b0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
87c0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
87d0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
87e0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
87f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20  OTES. *     The 
8800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75  transaction shou
8810: 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64  ld be terminated
8820: 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65   using "cackey_e
8830: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a  nd_transaction".
8840: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8850: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8860: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8870: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8880: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
8890: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
88a0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47  _conn_ret;..LONG
88b0: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
88c0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
88d0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
88e0: 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e  ");...cackey_con
88f0: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  n_ret = cackey_c
8900: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
8910: 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63  );..if (cackey_c
8920: 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  onn_ret != CACKE
8930: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
8940: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8950: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
8960: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
8970: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8980: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8990: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
89a0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
89b0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
89c0: 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73  depth++;...if (s
89d0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
89e0: 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73  _depth > 1 && !s
89f0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8a00: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b  _need_hw_lock) {
8a10: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8a20: 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20  PRINTF("Already 
8a30: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
8a40: 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20  , performing no 
8a50: 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74  action (new dept
8a60: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8a70: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8a80: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
8a90: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
8aa0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8ab0: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8ac0: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72  lock = 0;...scar
8ad0: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8ae0: 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74  ardBeginTransact
8af0: 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ion(slot->pcsc_c
8b00: 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ard);..if (scard
8b10: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8b20: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8b30: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8b40: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8b50: 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  o begin transact
8b60: 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ion, returning i
8b70: 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65  n error");....re
8b80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8b90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
8ba0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8bb0: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
8bc0: 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63  ly began transac
8bd0: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
8be0: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
8bf0: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
8c00: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8c10: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
8c20: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8c30: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65  key_ret cackey_e
8c40: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8c50: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8c60: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
8c70: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
8c80: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8c90: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
8ca0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
8cb0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
8cc0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
8cd0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
8ce0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
8cf0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
8d00: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8d10: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
8d20: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
8d30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8d40: 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f  equires "cackey_
8d50: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8d60: 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  n" to be called 
8d70: 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61  first. *. */.sta
8d80: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
8d90: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
8da0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
8db0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
8dc0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72  {..LONG scard_tr
8dd0: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ans_ret;...CACKE
8de0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8df0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
8e00: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
8e10: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
8e20: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8e30: 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f  INTF("Card is no
8e40: 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61  t connected, una
8e50: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73  ble to end trans
8e60: 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29  action on card")
8e70: 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  ;....if (slot->t
8e80: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8e90: 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45   > 0) {....CACKE
8ea0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8eb0: 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73  Decreasing trans
8ec0: 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64  action depth and
8ed0: 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61   asking for a ha
8ee0: 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74  rdware lock on t
8ef0: 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72  he next begin tr
8f00: 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65  ansaction (curre
8f10: 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  nt depth = %i)",
8f20: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
8f30: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73  on_depth);.....s
8f40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8f50: 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66  _depth--;.....if
8f60: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8f70: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
8f80: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
8f90: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8fa0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09  ock = 1;....}...
8fb0: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
8fc0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8fd0: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  C);..}...if (slo
8fe0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8ff0: 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43  epth == 0) {...C
9000: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9010: 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20  TF("Terminating 
9020: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
9030: 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e  at has not begun
9040: 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  !");....return(C
9050: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9060: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
9070: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
9080: 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth--;...if (slo
9090: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
90a0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41  epth > 0) {...CA
90b0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
90c0: 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  F("Transactions 
90d0: 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73  still in progres
90e0: 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69  s, not terminati
90f0: 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73  ng on-card Trans
9100: 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20  action (current 
9110: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c  depth = %i)", sl
9120: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9130: 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72  depth);....retur
9140: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9150: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
9160: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
9170: 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  dEndTransaction(
9180: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
9190: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
91a0: 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  D);..if (scard_t
91b0: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
91c0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
91d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
91e0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
91f0: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  end transaction,
9200: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
9210: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
9220: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9230: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9240: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9250: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74  F("Sucessfully t
9260: 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61  erminated transa
9270: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
9280: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
9290: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
92a0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
92b0: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20  OK);.}../* APDU 
92c0: 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  Related Function
92d0: 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  s */./*. * SYNPO
92e0: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
92f0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
9300: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
9310: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9320: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9330: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9340: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
9350: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
9360: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
9370: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p2, unsigned ch
9380: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  ar lc, unsigned 
9390: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
93a0: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69  gned char le, ui
93b0: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
93c0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
93d0: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f  *respdata, size_
93e0: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  t *respdata_len)
93f0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
9400: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
9410: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
9420: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
9430: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9440: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9450: 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20  d char class. * 
9460: 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61          APDU Cla
9470: 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f  ss (GSCIS_CLASS_
9480: 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53  ISO7816 or GSCIS
9490: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
94a0: 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20  ATFORM. *       
94b0: 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41    usually), (CLA
94c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
94d0: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
94e0: 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20  ction. *        
94f0: 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f   APDU Instructio
9500: 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20  n (INS). *. *   
9510: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9520: 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  p1. *         AP
9530: 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28  DU Parameter 1 (
9540: 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  P1). *. *     un
9550: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20  signed char p2. 
9560: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
9570: 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a  arameter 2 (P2).
9580: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9590: 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20  ed char lc. *   
95a0: 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74        APDU Lengt
95b0: 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63  h of Content (Lc
95c0: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
95d0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61   length of "data
95e0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72  ". *         par
95f0: 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74  ameter.  If "dat
9600: 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20  a" is specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61  as NULL, this pa
9620: 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20  rameter will. * 
9630: 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72          be ignor
9640: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
9650: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
9660: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69  a. *         Poi
9670: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74  nter to buffer t
9680: 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75  o send.  It shou
9690: 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73  ld be "Lc" bytes
96a0: 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20   long.  If. *   
96b0: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
96c0: 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69  as NULL, "Lc" wi
96d0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20  ll not be sent, 
96e0: 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20  and this buffer 
96f0: 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20  will be. *      
9700: 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20     ignored.. *. 
9710: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9720: 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20  har le. *       
9730: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
9740: 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65   Expectation (Le
9750: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
9760: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20   length of the. 
9770: 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74  *         expect
9780: 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68  ed reply.  If th
9790: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20  is is specified 
97a0: 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c  as 0 then it wil
97b0: 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  l not. *        
97c0: 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20   be sent.. *. * 
97d0: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65      uint16_t *re
97e0: 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20  spcode. *       
97f0: 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20    [OUT] Pointer 
9800: 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50  to storage of AP
9810: 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65  DU response code
9820: 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a  .  If this is. *
9830: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
9840: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ed as NULL, the 
9850: 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69  response code wi
9860: 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  ll be discarded.
9870: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9880: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
9890: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  ta. *         [O
98a0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
98b0: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
98c0: 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49  esponse data.  I
98d0: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
98e0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
98f0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9900: 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62  onse data will b
9910: 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  e discarded.  If
9920: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
9930: 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70  "respdata_len" p
9940: 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63  arameter is spec
9950: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
9960: 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20  his buffer. *   
9970: 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62        will not b
9980: 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a  e updated.. *. *
9990: 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73       size_t *res
99a0: 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20  pdata_len. *    
99b0: 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50       [IN, OUT] P
99c0: 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e  ointer initialin
99d0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
99e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65   size of the "re
99f0: 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20  spdata". *      
9a00: 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f     buffer.  Befo
9a10: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68  re returning, th
9a20: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c  e pointed to val
9a30: 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ue is updated to
9a40: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20   the. *         
9a50: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9a60: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62  written to the b
9a70: 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20  uffer.  If this 
9a80: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a  is specified as.
9a90: 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c   *         NULL,
9aa0: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
9ab0: 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65  updated, and "re
9ac0: 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20  spdata" will be 
9ad0: 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a  ignored causing.
9ae0: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72   *         the r
9af0: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20  esponse data to 
9b00: 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a  be discarded.. *
9b10: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
9b20: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
9b30: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
9b40: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
9b50: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
9b60: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
9b70: 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20  On error. *     
9b80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
9b90: 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68  KENABSENT  If th
9ba0: 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  e sending failed
9bb0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b   because the tok
9bc0: 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  en is. *        
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20          absent. 
9bf0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9c00: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
9c10: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9c20: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
9c30: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61  tion Manager via
9c40: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70  . *     cackey_p
9c50: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66  csc_connect() if
9c60: 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20   needed.. *. *  
9c70: 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65     It will conne
9c80: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9c90: 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74  n the reader att
9ca0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f  ached to the slo
9cb0: 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69  t. *     specifi
9cc0: 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63  ed.  It will rec
9cd0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
9ce0: 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  rd if the connec
9cf0: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73  tion. *     goes
9d00: 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74   away.. *. */.st
9d10: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
9d20: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
9d30: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9d40: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
9d50: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
9d60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9d70: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9d80: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9d90: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9da0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20  nsigned int lc, 
9db0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9dc0: 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  ata, unsigned in
9dd0: 74 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  t le, uint16_t *
9de0: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
9df0: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9e00: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
9e10: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
9e20: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
9e30: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
9e40: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
9e50: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
9e60: 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45  ..LPCSCARD_IO_RE
9e70: 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69  QUEST pioSendPci
9e80: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
9e90: 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c  l;..DWORD xmit_l
9ea0: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c  en, recv_len;..L
9eb0: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ONG scard_xmit_r
9ec0: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
9ed0: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74  _ret;..BYTE xmit
9ee0: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76  _buf[1024], recv
9ef0: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74  _buf[1024];..int
9f00: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
9f10: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f  t, pcsc_getresp_
9f20: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
9f30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9f40: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
9f50: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a  ...if (!slot) {.
9f60: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9f70: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73  RINTF("Invalid s
9f80: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29  lot specified.")
9f90: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9fa0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9fb0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
9fc0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
9fd0: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
9fe0: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
9ff0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
a000: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
a010: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a020: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
a030: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
a040: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
a050: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
a060: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
a070: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
a080: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
a090: 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c  e which protocol
a0a0: 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 20 2a   to send using *
a0b0: 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  /..switch (slot-
a0c0: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63  >protocol) {...c
a0d0: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
a0e0: 4f 4c 5f 54 30 3a 0a 09 09 09 43 41 43 4b 45 59  OL_T0:....CACKEY
a0f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
a100: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
a110: 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 30 22  datagram is T=0"
a120: 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  );.....pioSendPc
a130: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
a140: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
a150: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
a160: 4f 4c 5f 54 31 3a 0a 09 09 09 43 41 43 4b 45 59  OL_T1:....CACKEY
a170: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
a180: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
a190: 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 31 22  datagram is T=1"
a1a0: 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  );.....pioSendPc
a1b0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31  i = SCARD_PCI_T1
a1c0: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  ;.....break;...d
a1d0: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
a1e0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a1f0: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
a200: 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67   found, aborting
a210: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
a220: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
a230: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
a240: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69  Transmit */..xmi
a250: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74  t_len = 0;..xmit
a260: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a270: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f   = class;..xmit_
a280: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a290: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09  = instruction;..
a2a0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a2b0: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74  n++] = p1;..xmit
a2c0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a2d0: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61   = p2;..if (data
a2e0: 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32  ) {...if (lc > 2
a2f0: 35 35 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  55) {....CACKEY_
a300: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a310: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a320: 20 4c 63 20 67 72 65 61 74 65 72 20 74 68 61 6e   Lc greater than
a330: 20 32 35 35 20 69 73 20 75 6e 74 65 73 74 65 64   255 is untested
a340: 2e 20 20 4c 63 20 3d 20 25 75 22 2c 20 6c 63 29  .  Lc = %u", lc)
a350: 3b 0a 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 30 78 38  mit_len++] = 0x8
a370: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a380: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a390: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a3a0: 28 6c 63 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (lc & 0xff00) >>
a3b0: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a3c0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
a3d0: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a3e0: 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  e {....xmit_buf[
a3f0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
a400: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 64 78  ;...}...for (idx
a410: 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20   = 0; idx < lc; 
a420: 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74  idx++) {....xmit
a430: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a440: 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09   = data[idx];...
a450: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d  }..}...if (le !=
a460: 20 30 78 30 30 29 20 7b 0a 09 09 69 66 20 28 6c   0x00) {...if (l
a470: 65 20 3e 20 32 35 36 29 20 7b 0a 09 09 09 43 41  e > 256) {....CA
a480: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a490: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
a4a0: 6e 67 20 61 6e 20 4c 65 20 67 72 65 61 74 65 72  ng an Le greater
a4b0: 20 74 68 61 6e 20 32 35 36 20 69 73 20 75 6e 74   than 256 is unt
a4c0: 65 73 74 65 64 2e 20 20 4c 65 20 3d 20 25 75 22  ested.  Le = %u"
a4d0: 2c 20 6c 65 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , le);.....xmit_
a4e0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a4f0: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
a500: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
a510: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a520: 2b 5d 20 3d 20 28 6c 65 20 26 20 30 78 66 66 30  +] = (le & 0xff0
a530: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
a540: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a550: 20 3d 20 6c 65 20 26 20 30 78 66 66 3b 0a 09 09   = le & 0xff;...
a560: 7d 20 65 6c 73 65 20 69 66 20 28 6c 65 20 3d 3d  } else if (le ==
a570: 20 32 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f   256) {....xmit_
a580: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a590: 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65  = 0x00;...} else
a5a0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a5b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b  mit_len++] = le;
a5c0: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ...}..}.../* Beg
a5d0: 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  in Smartcard Tra
a5e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
a5f0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
a600: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
a610: 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53 43 49  f (class == GSCI
a620: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
a630: 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d  && instruction =
a640: 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  = GSCIS_INSTR_VE
a650: 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20 30 78  RIFY && p1 == 0x
a660: 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  00) {...CACKEY_D
a670: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e  EBUG_PRINTF("Sen
a680: 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e  ding APDU: <<cen
a690: 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c  sored>>");..} el
a6a0: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
a6b0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
a6c0: 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d  nding APDU:", xm
a6d0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a6e0: 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e  );..}...recv_len
a6f0: 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62   = sizeof(recv_b
a700: 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74  uf);..scard_xmit
a710: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
a720: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
a730: 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69  card, pioSendPci
a740: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
a750: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
a760: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
a770: 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ;...if (scard_xm
a780: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
a790: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
a7a0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a7b0: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
a7c0: 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74  d to send APDU t
a7d0: 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  o card (SCardTra
a7e0: 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78  nsmit() = %s/%lx
a7f0: 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c  ), will ask call
a800: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ing function to 
a810: 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74  retry (not reset
a820: 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20  ting card)...", 
a830: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
a840: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
a850: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
a860: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
a870: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a880: 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e 20  t);..../* Begin 
a890: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
a8a0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
a8b0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
a8c0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
a8d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a8e0: 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66  _RETRY);..}...if
a8f0: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
a900: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
a910: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
a920: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
a930: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
a940: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
a950: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
a960: 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %lx)", CACKEY_DE
a970: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
a980: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
a990: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
a9a0: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
a9b0: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43 41  xmit_ret);....CA
a9c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a9d0: 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20  F("Marking slot 
a9e0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72  as having been r
a9f0: 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65 79  eset");...cackey
aa00: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
aa10: 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
aa20: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
aa30: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
aa40: 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ARD) {....CACKEY
aa50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
aa60: 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70  eset required, p
aa70: 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b  lease hold...");
aa80: 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e  .....scard_recon
aa90: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
aaa0: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
aab0: 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ot, SCARD_PROTOC
aac0: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
aad0: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74  OTOCOL_T1, &prot
aae0: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73  ocol);.....if (s
aaf0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
ab00: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
ab10: 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64  SS) {...../* Upd
ab20: 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ate protocol */.
ab30: 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ....slot->protoc
ab40: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
ab50: 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  ...switch (slot-
ab60: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09  >protocol) {....
ab70: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
ab80: 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09  TOCOL_T0:.......
ab90: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
aba0: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09  RD_PCI_T0;......
abb0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
abc0: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
abd0: 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T1:.......pioS
abe0: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
abf0: 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T1;........br
ac00: 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c  eak;......defaul
ac10: 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  t:.......CACKEY_
ac20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
ac30: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
ac40: 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61  ound, but too la
ac50: 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  te to do anythin
ac60: 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d  g about it now -
ac70: 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e  - trying anyway.
ac80: 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
ac90: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
aca0: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
acb0: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
acc0: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
acd0: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
ace0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
acf0: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
ad00: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
ad10: 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
ad20: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
ad30: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
ad40: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
ad50: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
ad60: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
ad70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ad80: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
ad90: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
ada0: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63  ting");......rec
adb0: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
adc0: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63  ecv_buf);.....sc
add0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
ade0: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
adf0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69  t->pcsc_card, pi
ae00: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62  oSendPci, xmit_b
ae10: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55  uf, xmit_len, NU
ae20: 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72  LL, recv_buf, &r
ae30: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ecv_len);......i
ae40: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
ae50: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
ae60: 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
ae70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ae80: 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69  ("Retransmit fai
ae90: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
aea0: 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20  n failure after 
aeb0: 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68  disconnecting th
aec0: 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  e card (SCardTra
aed0: 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22  nsmit = %s/%li)"
aee0: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
aef0: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
af00: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
af10: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
af20: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
af30: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
af40: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
af50: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
af60: 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74  CARD);......slot
af70: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
af80: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09  ected = 0;......
af90: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
afa0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
afb0: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
afc0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
afd0: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65  1;......cackey_e
afe0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
aff0: 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  lot);.......retu
b000: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b010: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
b020: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
b030: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
b040: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
b050: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
b060: 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
b070: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
b080: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
b090: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f  E_CARD);.....slo
b0a0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
b0b0: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
b0c0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b0d0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b0e0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
b0f0: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
b100: 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  ;.....cackey_end
b110: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b120: 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  t);......CACKEY_
b130: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
b140: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b150: 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  re");.....return
b160: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
b170: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
b180: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
b190: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b1a0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
b1b0: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
b1c0: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
b1d0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
b1e0: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
b1f0: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
b200: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
b210: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  = 0;...../* End 
b220: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b230: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74  ction */....slot
b240: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b250: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  pth = 1;....cack
b260: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b270: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41  on(slot);.....CA
b280: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b290: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
b2a0: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65  failure");....re
b2b0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b2c0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b2d0: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
b2e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
b2f0: 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a  "Returned Value:
b300: 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63  ", recv_buf, rec
b310: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65  v_len);...if (re
b320: 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09  cv_len < 2) {...
b330: 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f  /* Minimal respo
b340: 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20  nse length is 2 
b350: 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67  bytes, returning
b360: 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09   in failure */..
b370: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b380: 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74  INTF("Response t
b390: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
b3a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28  ing in failure (
b3b0: 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22  recv_len = %lu)"
b3c0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b3d0: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09  ) recv_len);....
b3e0: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b3f0: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b400: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b410: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b420: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b430: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
b440: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
b450: 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ine result code 
b460: 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72  */..major_rc = r
b470: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
b480: 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63   - 2];..minor_rc
b490: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
b4a0: 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28  _len - 1];..if (
b4b0: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72  respcode) {...*r
b4c0: 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72  espcode = (major
b4d0: 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f  _rc << 8) | mino
b4e0: 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64  r_rc;..}.../* Ad
b4f0: 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66  just message buf
b500: 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e  fer */..recv_len
b510: 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20   -= 2;.../* Add 
b520: 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20  bytes to return 
b530: 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65  value */..tmp_re
b540: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a  spdata_len = 0;.
b550: 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26  .if (respdata &&
b560: 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b   respdata_len) {
b570: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
b580: 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  len = *respdata_
b590: 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f  len;....bytes_to
b5a0: 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74  _copy = *respdat
b5b0: 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65  a_len;....if (re
b5c0: 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74  cv_len < bytes_t
b5d0: 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74  o_copy) {....byt
b5e0: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63  es_to_copy = rec
b5f0: 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41  v_len;...}....CA
b600: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b610: 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62  F("Copying %lu b
b620: 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66  ytes to the buff
b630: 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62  er (recv'd %lu b
b640: 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25  ytes, but only %
b650: 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  lu bytes left in
b660: 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28   our buffer)", (
b670: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
b680: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75  ytes_to_copy, (u
b690: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
b6a0: 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  cv_len, (unsigne
b6b0: 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74  d long) *respdat
b6c0: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70  a_len);....memcp
b6d0: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
b6e0: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
b6f0: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
b700: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
b710: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
b720: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
b730: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
b740: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
b750: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
b760: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
b770: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
b780: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b790: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
b7a0: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
b7b0: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
b7c0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
b7d0: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
b7e0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
b7f0: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
b800: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
b810: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
b820: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
b830: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
b840: 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e  ed");....if (min
b850: 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b  or_rc == 0x00) {
b860: 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43  ....minor_rc = C
b870: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
b880: 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72  ..}....pcsc_getr
b890: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  esp_ret = cackey
b8a0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
b8b0: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
b8c0: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
b8d0: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20  R_GET_RESPONSE, 
b8e0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e  0x00, 0x00, 0, N
b8f0: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72  ULL, minor_rc, r
b900: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74  espcode, respdat
b910: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61  a, &tmp_respdata
b920: 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63  _len);....if (pc
b930: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21  sc_getresp_ret !
b940: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b950: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
b960: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
b970: 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64  ffer read failed
b980: 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  !  Returning in 
b990: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f  failure");...../
b9a0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
b9b0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
b9c0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b9d0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b9e0: 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
b9f0: 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b  resp_ret == CACK
ba00: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
ba10: 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41   {.....return(CA
ba20: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
ba30: 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  Y);....}.....ret
ba40: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
ba50: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
ba60: 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f  ...if (respdata_
ba70: 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64  len) {....*respd
ba80: 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72  ata_len += tmp_r
ba90: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d  espdata_len;...}
baa0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
bab0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
bac0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
bad0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
bae0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
baf0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
bb00: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
bb10: 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f   (buffer read co
bb20: 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74  mplete)");...ret
bb30: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
bb40: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45  S_OK);..}.../* E
bb50: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
bb60: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
bb70: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
bb80: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
bb90: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
bba0: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
bbb0: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
bbc0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
bbd0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
bbe0: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
bbf0: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
bc00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
bc10: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
bc20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
bc30: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
bc40: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
bc50: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
bc60: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bc70: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
bc80: 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
bc90: 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 72  d char *cackey_r
bca0: 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 75  ead_bertlv_tag(u
bcb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
bcc0: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75  ffer, size_t *bu
bcd0: 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69  ffer_len_p, unsi
bce0: 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20 75  gned char tag, u
bcf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
bd00: 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  tbuffer, size_t 
bd10: 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  *outbuffer_len_p
bd20: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
bd30: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
bd40: 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72 5f  ize_t outbuffer_
bd50: 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b  len, buffer_len;
bd60: 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09  ..size_t size;..
bd70: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
bd80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bd90: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
bda0: 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d  (buffer_len_p ==
bdb0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
bdc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bdd0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20  buffer_len_p is 
bde0: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67  NULL.  Returning
bdf0: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a   in failure.");.
be00: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
be10: 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
be20: 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c  fer_len_p == NUL
be30: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
be40: 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74 62  BUG_PRINTF("outb
be50: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e  uffer_len_p is N
be60: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ULL.  Returning 
be70: 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a  in failure.");..
be80: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
be90: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20  .}...buffer_len 
bea0: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
beb0: 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c  _p;..outbuffer_l
bec0: 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f  en = *outbuffer_
bed0: 6c 65 6e 5f 70 3b 0a 0a 09 62 75 66 66 65 72 5f  len_p;...buffer_
bee0: 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20  p = buffer;..if 
bef0: 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d 20  (buffer_p[0] != 
bf00: 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  tag) {...CACKEY_
bf10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
bf20: 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74 20  g found was not 
bf30: 74 61 67 20 65 78 70 65 63 74 65 64 2e 20 20 54  tag expected.  T
bf40: 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65 63  ag = %02x, Expec
bf50: 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65 74  ted = %02x.  Ret
bf60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bf70: 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  e.", (unsigned i
bf80: 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d 2c  nt) buffer_p[0],
bf90: 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e   tag);....return
bfa0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
bfb0: 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72  fer_p++;..buffer
bfc0: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28 62  _len--;...if ((b
bfd0: 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 38  uffer_p[0] & 0x8
bfe0: 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09  0) == 0x80) {...
bff0: 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78 20  size = 0;...idx 
c000: 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26  = (buffer_p[0] &
c010: 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28 69   0x7f);....if (i
c020: 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e 29  dx > buffer_len)
c030: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
c040: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f  UG_PRINTF("Malfo
c050: 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20 2d  rmed BER value -
c060: 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  - not enough byt
c070: 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  es available to 
c080: 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64 78  read length (idx
c090: 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c 65   = %i, buffer_le
c0a0: 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c 20  n = %lu)", idx, 
c0b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c0c0: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09  buffer_len);....
c0d0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
c0e0: 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64 78  .}....for (; idx
c0f0: 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09   > 0; idx--) {..
c100: 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09  ..buffer_p++;...
c110: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
c120: 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09  ...size <<= 8;..
c130: 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65 72  ..size |= buffer
c140: 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c  _p[0];...}..} el
c150: 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62 75  se {...size = bu
c160: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09  ffer_p[0];..}...
c170: 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66  buffer_p++;..buf
c180: 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20  fer_len--;...if 
c190: 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66 65  (size > outbuffe
c1a0: 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45  r_len) {...CACKE
c1b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c1c0: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20 76  Unable to copy v
c1d0: 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20 6f  alue buffer to o
c1e0: 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65 6e  utbuffer, not en
c1f0: 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c 75  ough room.  Valu
c200: 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20  e buffer length 
c210: 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66 65  = %lu, out buffe
c220: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  r length = %lu",
c230: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c240: 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64   size, (unsigned
c250: 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65 72   long) outbuffer
c260: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
c270: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75  (NULL);..}...*ou
c280: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20  tbuffer_len_p = 
c290: 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62 75  size;..if (outbu
c2a0: 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70 79  ffer) {...memcpy
c2b0: 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66 66  (outbuffer, buff
c2c0: 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62  er_p, size);...b
c2d0: 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65 3b  uffer_p += size;
c2e0: 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d 3d  ...buffer_len -=
c2f0: 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66 65   size;....*buffe
c300: 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65 72  r_len_p = buffer
c310: 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  _len;....CACKEY_
c320: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
c330: 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a  BER-TLV results:
c340: 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73 69  ", outbuffer, si
c350: 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ze);..} else {..
c360: 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c  .memmove(buffer,
c370: 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29   buffer_p, size)
c380: 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20 62  ;...buffer_p = b
c390: 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45 59  uffer;....CACKEY
c3a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c3b0: 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73  "BER-TLV results
c3c0: 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  :", buffer, size
c3d0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
c3e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
c3f0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
c400: 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e 74  s.  Size of cont
c410: 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30 32  ents for tag %02
c420: 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73 69  x is %lu", (unsi
c430: 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20 28  gned int) tag, (
c440: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
c450: 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62  ize);...return(b
c460: 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  uffer_p);.}../*.
c470: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
c480: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
c490: 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63  y_get_data(struc
c4a0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
c4b0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
c4c0: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
c4d0: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75  _t buffer_len, u
c4e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c4f0: 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  [3]);. *. * ARGU
c500: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
c510: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c520: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
c530: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
c540: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
c550: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
c560: 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20  r *buffer. *    
c570: 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65       [OUT] Buffe
c580: 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  r. *. *     size
c590: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20 2a  _t buffer_len. *
c5a0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
c5b0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
c5c0: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
c5d0: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
c5e0: 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20 20  har oid[3]. *   
c5f0: 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49 44        3-byte OID
c600: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a 20   to read. *. *. 
c610: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
c620: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
c630: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
c640: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c650: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f  actually read, o
c660: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20  r -1 on error.. 
c670: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c680: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
c690: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c6a0: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72  key_get_data(str
c6b0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c6c0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
c6d0: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
c6e0: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
c6f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
c700: 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e  id[3]) {..unsign
c710: 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20  ed char cmd[] = 
c720: 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78 30  {0x5C, 0x03, 0x0
c730: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
c740: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
c750: 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f  buffer_p;..size_
c760: 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65  t init_buffer_le
c770: 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31 36  n, size;..uint16
c780: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
c790: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
c7a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c7b0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c7c0: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 20  init_buffer_len 
c7d0: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09  = buffer_len;...
c7e0: 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b  cmd[2] = oid[0];
c7f0: 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31  ..cmd[3] = oid[1
c800: 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64  ];..cmd[4] = oid
c810: 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f  [2];.../* 256 to
c820: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c 61   indicate the la
c830: 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73 69  rgest message si
c840: 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20  ze -- not clear 
c850: 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f 72  if this will wor
c860: 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73 61  k with all messa
c870: 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ges */..send_ret
c880: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
c890: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
c8a0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e  CLASS_ISO7816, N
c8b0: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
c8c0: 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30 78  STR_GET_DATA, 0x
c8d0: 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f 66  3F, 0xFF, sizeof
c8e0: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c  (cmd), cmd, 256,
c8f0: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
c900: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 29  er, &buffer_len)
c910: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
c920: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
c930: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
c940: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c950: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
c960: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
c970: 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a  read buffer");..
c980: 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f  ..return(cackey_
c990: 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62  get_data(slot, b
c9a0: 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66 66  uffer, init_buff
c9b0: 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a 09  er_len, oid));..
c9c0: 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  }...if (send_ret
c9d0: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
c9e0: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
c9f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
ca00: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
ca10: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
ca20: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
ca30: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
ca40: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
ca50: 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
ca60: 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
ca70: 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66 65  E_MAX..if (buffe
ca80: 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53  r_len > _POSIX_S
ca90: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
caa0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cab0: 46 28 22 52 65 61 64 20 62 79 74 65 73 20 28 62  F("Read bytes (b
cac0: 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65 65  uffer_len) excee
cad0: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
cae0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
caf0: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
cb00: 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d  li, buffer_len =
cb10: 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
cb20: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
cb30: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
cb40: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
cb50: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cb60: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
cb70: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e  ..if (buffer_len
cb80: 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 2) {...CACKEY
cb90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
cba0: 50 44 55 20 47 45 54 20 44 41 54 41 20 72 65 74  PDU GET DATA ret
cbb0: 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73 2c  urned %lu bytes,
cbc0: 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68   which is too sh
cbd0: 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54 4c  ort for a BER-TL
cbe0: 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e  V response", (un
cbf0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
cc00: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  fer_len);....ret
cc10: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69  urn(-1);..}...si
cc20: 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b  ze = buffer_len;
cc30: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63  ..buffer_p = cac
cc40: 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
cc50: 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66  tag(buffer, &buf
cc60: 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e  fer_len, 0x53, N
cc70: 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69  ULL, &size);...i
cc80: 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e  f (buffer_p == N
cc90: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
cca0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
ccb0: 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c 65  g decoding faile
ccc0: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
ccd0: 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74  error.");....ret
cce0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41  urn(-1);..}...CA
ccf0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cd00: 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65  BUF("GET DATA re
cd10: 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73  sult", buffer, s
cd20: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
cd30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
cd40: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
cd50: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
cd60: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
cd70: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
cd80: 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  urn(size);.}../*
cd90: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
cda0: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
cdb0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
cdc0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cdd0: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
cde0: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
cdf0: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
ce00: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
ce10: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
ce20: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
ce30: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
ce40: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
ce50: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
ce60: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
ce70: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
ce80: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
ce90: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
cea0: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
ceb0: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
cec0: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
ced0: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
cee0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
cef0: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
cf00: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
cf10: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
cf20: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
cf30: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
cf40: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
cf50: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
cf60: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
cf70: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
cf80: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
cf90: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
cfa0: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
cfb0: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
cfc0: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
cfd0: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
cfe0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
cff0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
d000: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
d010: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
d020: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
d030: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
d040: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
d050: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
d060: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d070: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
d080: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
d090: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
d0a0: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
d0b0: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
d0c0: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69  _offset) {..unsi
d0d0: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f  gned char *init_
d0e0: 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20  buffer;..size_t 
d0f0: 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a  init_count;..siz
d100: 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  e_t init_initial
d110: 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f  _offset;...size_
d120: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
d130: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
d140: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
d150: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
d160: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
d170: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
d180: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d190: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
d1a0: 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d  ...init_buffer =
d1b0: 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63   buffer;..init_c
d1c0: 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69  ount = count;..i
d1d0: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
d1e0: 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66  et = initial_off
d1f0: 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  set;...max_offse
d200: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
d210: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
d220: 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74  PDU_MTU;...if (t
d230: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
d240: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
d250: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d260: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
d270: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
d280: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
d290: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d2a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d2b0: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
d2c0: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
d2d0: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
d2e0: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
d2f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d300: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
d310: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
d320: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
d330: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
d340: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
d350: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
d360: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
d370: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
d380: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
d390: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
d3a0: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
d3b0: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
d3c0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
d3d0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
d3e0: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
d3f0: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
d400: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
d410: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
d420: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
d430: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
d440: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
d450: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
d460: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
d470: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
d480: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
d490: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
d4a0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
d4b0: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41  E_RETRY) {....CA
d4c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d4d0: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
d4e0: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
d4f0: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
d500: 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
d510: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
d520: 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c  ot, init_buffer,
d530: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f   init_count, t_o
d540: 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61  r_v, init_initia
d550: 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a  l_offset));...}.
d560: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d570: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d580: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
d590: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
d5a0: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
d5b0: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
d5c0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
d5d0: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
d5e0: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
d5f0: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
d600: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
d610: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
d620: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
d630: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
d640: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d650: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d660: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
d670: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
d680: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
d690: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d6a0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
d6b0: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
d6c0: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
d6d0: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
d6e0: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
d6f0: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
d700: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
d710: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
d720: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
d730: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
d740: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
d750: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
d760: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
d770: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
d780: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
d790: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
d7a0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
d7b0: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
d7c0: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
d7d0: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
d7e0: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
d7f0: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
d800: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
d810: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d820: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
d830: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
d840: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
d850: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d860: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
d870: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
d880: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d890: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
d8a0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d8b0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
d8c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d8d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
d8e0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
d8f0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d900: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d920: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d930: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d940: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d950: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
d960: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
d970: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d980: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
d990: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
d9a0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
d9b0: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
d9c0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
d9d0: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
d9e0: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
d9f0: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
da00: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
da10: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
da20: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
da30: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
da40: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
da50: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
da60: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
da70: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
da80: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
da90: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
daa0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
dab0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
dac0: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
dad0: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
dae0: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
daf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
db00: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
db10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
db20: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
db30: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
db40: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
db50: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
db60: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
db70: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
db80: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
db90: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
dba0: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
dbb0: 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  0, aid_len, aid,
dbc0: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
dbd0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
dbe0: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
dbf0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
dc00: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
dc10: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
dc20: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
dc30: 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61  etrying select a
dc40: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75  pplet");....retu
dc50: 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  rn(cackey_select
dc60: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69  _applet(slot, ai
dc70: 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d  d, aid_len));..}
dc80: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
dc90: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
dca0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
dcb0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
dcc0: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
dcd0: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
dce0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
dcf0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
dd00: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
dd10: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
dd20: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
dd30: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
dd40: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
dd50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
dd60: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
dd70: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
dd80: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
dd90: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
dda0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
ddb0: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
ddc0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
ddd0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
dde0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
ddf0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
de00: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
de10: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
de20: 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20  uint16_t ef. *  
de30: 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c         Elemental
de40: 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a   File to select.
de50: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
de60: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
de70: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
de80: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
de90: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
dea0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
deb0: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
dec0: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73  ES. *     This s
ded0: 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e  elects an Elemen
dee0: 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75  tary File (EF) u
def0: 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  nder the current
df00: 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20  ly selected. *  
df10: 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c     Dedicated Fil
df20: 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20  e (DF). *. *    
df30: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20   Typically this 
df40: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
df50: 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f  selecting the co
df60: 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73  rrect Applet (us
df70: 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  ing. *     cacke
df80: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29  y_select_applet)
df90: 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a   for VM cards. *
dfa0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
dfb0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
dfc0: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
dfd0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
dfe0: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
dff0: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
e000: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
e010: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
e020: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e030: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
e040: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
e050: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
e060: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
e070: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
e080: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
e090: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
e0a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e0b0: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
e0c0: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
e0d0: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
e0e0: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
e0f0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
e100: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
e110: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
e120: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
e130: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
e140: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
e150: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
e160: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
e170: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e180: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e190: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e1a0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
e1b0: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
e1c0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e1d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
e1e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
e1f0: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
e200: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
e210: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
e220: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
e230: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e240: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
e250: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e260: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
e270: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
e280: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e290: 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  root);. *. * ARG
e2a0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
e2b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e2c0: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20  entity *root. * 
e2d0: 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20          Root of 
e2e0: 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20  the TLV list to 
e2f0: 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a  start freeing. *
e300: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
e310: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
e320: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
e330: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72  This function fr
e340: 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b  ees the TLV link
e350: 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e  ed listed return
e360: 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22  ed from. *     "
e370: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22  cackey_read_tlv"
e380: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
e390: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
e3a0: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
e3b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
e3c0: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
e3d0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e3e0: 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09  *curr, *next;...
e3f0: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
e400: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
e410: 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72  ...for (curr = r
e420: 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20  oot; curr; curr 
e430: 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74  = next) {...next
e440: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a   = curr->_next;.
e450: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d  ...switch (curr-
e460: 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  >tag) {....case 
e470: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
e480: 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43  BLE:....case GSC
e490: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
e4a0: 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  TE:.....if (curr
e4b0: 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  ->value) {......
e4c0: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
e4d0: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
e4e0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
e4f0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
e500: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
e510: 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09  ue_cardurl) {...
e520: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
e530: 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09  lue_cardurl);...
e540: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
e550: 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29  .}....free(curr)
e560: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
e570: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
e580: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e590: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
e5a0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
e5b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e5c0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
e5d0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e5e0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
e5f0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e600: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
e610: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
e620: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
e630: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
e640: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
e650: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
e660: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
e670: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
e680: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
e690: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
e6a0: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
e6b0: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
e6c0: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
e6d0: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
e6e0: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
e6f0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
e700: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73 69   tmpbuflen;..ssi
e710: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
e720: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
e730: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
e740: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
e750: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
e760: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
e770: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
e780: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e  ef HAVE_LIBZ..in
e790: 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
e7a0: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
e7b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e7c0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61  Called.");...rea
e7d0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e7e0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e7f0: 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   tlen_buf, sizeo
e800: 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20  f(tlen_buf), 1, 
e810: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
e820: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e830: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(tlen_buf)) {.
e840: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e850: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e860: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e870: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e880: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e890: 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62  ..tlen = (tlen_b
e8a0: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c  uf[1] << 8) | tl
e8b0: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61  en_buf[0];...rea
e8c0: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e8d0: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e8e0: 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   vlen_buf, sizeo
e8f0: 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20  f(vlen_buf), 2, 
e900: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
e910: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e920: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(vlen_buf)) {.
e930: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e940: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e950: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e960: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e970: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e980: 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62  ..vlen = (vlen_b
e990: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c  uf[1] << 8) | vl
e9a0: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43  en_buf[0];...CAC
e9b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e9c0: 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25  ("Tag Length = %
e9d0: 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74 68  lu, Value Length
e9e0: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
e9f0: 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20 28  ed long) tlen, (
ea00: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76  unsigned long) v
ea10: 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74  len);...offset_t
ea20: 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   += 2;..offset_v
ea30: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
ea40: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
ea50: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
ea60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
ea70: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
ea80: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
ea90: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
eaa0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
eab0: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
eac0: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
ead0: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
eae0: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
eaf0: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
eb00: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
eb10: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
eb20: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
eb30: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
eb40: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
eb50: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
eb60: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
eb70: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
eb80: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
eb90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eba0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
ebb0: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
ebc0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
ebd0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
ebe0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ebf0: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
ec00: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
ec10: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
ec20: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
ec30: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
ec40: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
ec50: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ec60: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
ec70: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
ec80: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
ec90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
eca0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ecb0: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
ecc0: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
ecd0: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
ece0: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
ecf0: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
ed00: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
ed10: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
ed20: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
ed30: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
ed40: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
ed50: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
ed60: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
ed70: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
ed80: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
ed90: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
eda0: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
edb0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
edc0: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
edd0: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
ede0: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
edf0: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
ee00: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
ee10: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ee20: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
ee30: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
ee40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
ee50: 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28  NULL;...switch (
ee60: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47  tag) {....case G
ee70: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
ee80: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
ee90: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
eea0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
eeb0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
eec0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
eed0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
eee0: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  (*curr_entity->v
eef0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a  alue_cardurl));.
ef00: 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
ef10: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
ef20: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61  ardurl->rid, vva
ef30: 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f  l, 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 61 70 70 74 79 70 65 20 3d  rdurl->apptype =
ef60: 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75   vval[5];.....cu
ef70: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
ef80: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
ef90: 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c  id = (vval[6] <<
efa0: 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09   8) | vval[7];..
efb0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
efc0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
efd0: 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20  ppid = (vval[8] 
efe0: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b  << 8) | vval[9];
eff0: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
f000: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
f010: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f020: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f030: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f040: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
f050: 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  ABLE:.....curr_e
f060: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
f070: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f080: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
f090: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
f0a0: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
f0b0: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
f0c0: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
f0d0: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f0e0: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f0f0: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
f100: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
f110: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
f120: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
f130: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f140: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f150: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f160: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
f170: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
f180: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
f190: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
f1a0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
f1b0: 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  Z.....tmpbuflen 
f1c0: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
f1d0: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
f1e0: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
f1f0: 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
f200: 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74  t = uncompress(t
f210: 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65  mpbuf, &tmpbufle
f220: 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  n, vval, length)
f230: 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ;.....if (uncomp
f240: 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b  ress_ret != Z_OK
f250: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
f260: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
f270: 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65  iled to decompre
f280: 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ss, uncompress()
f290: 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20   returned %i -- 
f2a0: 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72  resorting to dir
f2b0: 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d  ect copy", uncom
f2c0: 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09  press_ret);.....
f2d0: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
f2e0: 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70  ngth;......memcp
f2f0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
f300: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a  length);.....}..
f310: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f320: 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
f330: 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
f340: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
f350: 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b  ;.#else.....CACK
f360: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f370: 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75  "Missing ZLIB Su
f380: 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74  pport, this cert
f390: 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c  ificate is likel
f3a0: 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a  y useless...");.
f3b0: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
f3c0: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d   length;.....mem
f3d0: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
f3e0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69  , length);.#endi
f3f0: 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f......curr_enti
f400: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
f410: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f420: 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c  length = tmpbufl
f430: 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  en;.....curr_ent
f440: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
f450: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
f460: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
f470: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
f480: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
f490: 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75  G_PKCS15:.....cu
f4a0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f4b0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f4c0: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63  entity));......c
f4d0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f4e0: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f4f0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79  entity->value_by
f500: 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09  te = vval[0];...
f510: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f520: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f530: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
f540: 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  vval += length;.
f550: 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68  ..vlen -= length
f560: 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e  ;....if (curr_en
f570: 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  tity != NULL) {.
f580: 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
f590: 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20  ULL) {.....root 
f5a0: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
f5b0: 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74  ..}.....if (last
f5c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
f5d0: 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75  last->_next = cu
f5e0: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
f5f0: 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f  ....last = curr_
f600: 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a  entity;...}..}..
f610: 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d  .return(root);.}
f620: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
f630: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f640: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
f650: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
f660: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
f670: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
f680: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f690: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f6a0: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
f6b0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
f6c0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
f6d0: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
f6e0: 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72  t, int free_star
f6f0: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
f700: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
f710: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
f720: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  n;..}...for (idx
f730: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
f740: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
f750: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72   (start[idx].cer
f760: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66  tificate) {....f
f770: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  ree(start[idx].c
f780: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d  ertificate);...}
f790: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73  ..}...if (free_s
f7a0: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73  tart) {...free(s
f7b0: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tart);..}...retu
f7c0: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  rn;.}..static st
f7d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f7e0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
f7f0: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74 72  y_copy_certs(str
f800: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
f810: 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c 20  identity *dest, 
f820: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
f830: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61  sc_identity *sta
f840: 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  rt, size_t count
f850: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b  ) {..size_t idx;
f860: 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20  ...if (start == 
f870: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
f880: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
f890: 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (dest == NULL) {
f8a0: 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f 63  ...dest = malloc
f8b0: 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20 2a  (sizeof(*dest) *
f8c0: 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f   count);..}...fo
f8d0: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
f8e0: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
f8f0: 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69 64  {...dest[idx].id
f900: 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69 64  _type = start[id
f910: 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09 73  x].id_type;....s
f920: 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78 5d  witch (dest[idx]
f930: 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
f940: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
f950: 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d 63  PE_CAC:.....memc
f960: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  py(dest[idx].car
f970: 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 74  d.cac.applet, st
f980: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  art[idx].card.ca
f990: 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
f9a0: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
f9b0: 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
f9c0: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
f9d0: 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61 72  .cac.file = star
f9e0: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f9f0: 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b 3b  file;.....break;
fa00: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
fa10: 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
fa20: 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  .dest[idx].card.
fa30: 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74 61  piv.key_id = sta
fa40: 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76  rt[idx].card.piv
fa50: 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 6d 65 6d  .key_id;.....mem
fa60: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  cpy(dest[idx].ca
fa70: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 74  rd.piv.label, st
fa80: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  art[idx].card.pi
fa90: 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  v.label, sizeof(
faa0: 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  dest[idx].card.p
fab0: 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  iv.label));.....
fac0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
fad0: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
fae0: 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
faf0: 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b 69  ak;...}...dest[i
fb00: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
fb10: 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  len = start[idx]
fb20: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fb30: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65  ;...dest[idx].ke
fb40: 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69 64  ysize = start[id
fb50: 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64  x].keysize;....d
fb60: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fb70: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65  cate = malloc(de
fb80: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fb90: 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63  ate_len);...memc
fba0: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  py(dest[idx].cer
fbb0: 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74 5b  tificate, start[
fbc0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fbd0: 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  , dest[idx].cert
fbe0: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d  ificate_len);..}
fbf0: 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29 3b  ...return(dest);
fc00: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
fc10: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
fc20: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
fc30: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
fc40: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
fc50: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
fc60: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
fc70: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
fc80: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
fc90: 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
fca0: 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63  read_certs(struc
fcb0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
fcc0: 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
fcd0: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fce0: 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65   *certs, unsigne
fcf0: 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b  d long *count) {
fd00: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
fd10: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fd20: 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
fd30: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
fd40: 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
fd50: 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
fd60: 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
fd70: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
fd80: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
fd90: 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b  D_CCC}, piv_aid[
fda0: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
fdb0: 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75  3_3_PIV_AID};..u
fdc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
fdd0: 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70  v_oid, piv_oid_p
fde0: 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54  ivauth[] = {NIST
fdf0: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50  SP800_73_3_OID_P
fe00: 49 56 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64  IVAUTH}, piv_oid
fe10: 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b  _signature[] = {
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 53 49 47 4e 41 54 55 52 45 7d 2c 20 70  ID_SIGNATURE}, p
fe40: 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20  iv_oid_keymgt[] 
fe50: 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
fe60: 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09  3_OID_KEYMGT};..
fe70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
fe80: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
fe90: 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72  gned char buffer
fea0: 5b 38 31 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f  [8192], *buffer_
feb0: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  p;..unsigned lon
fec0: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63  g outidx = 0;..c
fed0: 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a  har *piv_label;.
fee0: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
fef0: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73  saction_ret;..ss
ff00: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
ff10: 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c  .size_t buffer_l
ff20: 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72  en;..int certs_r
ff30: 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73  esizable;..int s
ff40: 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f  end_ret, select_
ff50: 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65  ret;..int piv_ke
ff60: 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74  y, piv = 0;..int
ff70: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
ff80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
ff90: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f  led.");...if (co
ffa0: 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
ffb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ffc0: 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e  INTF("count is N
ffd0: 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ULL, returning i
ffe0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
fff0: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
10000 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20  ...if (certs != 
10010 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63  NULL) {...if (*c
10020 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ount == 0) {....
10030 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10040 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77  NTF("Requested w
10050 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63  e return 0 objec
10060 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69  ts, short-circui
10070 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
10080 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  certs);...}..}..
10090 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74  .if (!slot->slot
100a0 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28  _reset) {...if (
100b0 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
100c0 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72  ts) {....if (cer
100d0 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
100e0 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
100f0 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
10100 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  * slot->cached_c
10110 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09  erts_count);....
10120 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e  .*count = slot->
10130 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
10140 6e 74 3b 0a 0a 09 09 09 7d 20 65 6c 73 65 20 7b  nt;.....} else {
10150 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
10160 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
10170 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
10180 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
10190 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
101a0 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
101b0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
101c0 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
101d0 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
101e0 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
101f0 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
10200 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
10210 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
10220 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10230 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10240 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
10250 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
10260 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
10270 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
10280 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
10290 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
102a0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
102b0 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
102c0 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
102d0 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
102e0 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
102f0 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
10300 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
10310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10320 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10330 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10340 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
10350 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
10360 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
10370 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
10380 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
10390 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
103a0 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
103b0 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
103c0 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
103d0 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
103e0 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
103f0 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
10400 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
10410 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10420 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10430 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10440 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
10450 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
10460 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10470 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
10480 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
10490 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
104a0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
104b0 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
104c0 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
104d0 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
104e0 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
104f0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
10500 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10510 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
10520 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10530 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10540 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
10550 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
10560 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
10570 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10580 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
10590 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
105a0 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
105b0 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
105c0 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
105d0 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
105e0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
105f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
10600 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
10610 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
10620 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10630 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10640 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
10650 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
10660 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
10670 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
10680 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
10690 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
106a0 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
106b0 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
106c0 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
106d0 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
106e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
106f0 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
10700 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
10710 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
10720 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10730 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10740 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
10750 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
10760 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
10770 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
10780 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10790 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
107a0 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
107b0 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
107c0 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
107d0 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
107e0 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
107f0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
10800 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10810 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10820 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10830 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10840 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10850 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10860 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
10870 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
10880 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
10890 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
108a0 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
108b0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
108c0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
108d0 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
108e0 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
108f0 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10900 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10910 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10920 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10930 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10940 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
10950 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10960 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
10970 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10980 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
10990 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
109a0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
109b0 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
109c0 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
109d0 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
109e0 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
109f0 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
10a00 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10a10 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10a20 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10a30 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10a40 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
10a50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
10a60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10a70 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
10a80 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
10a90 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
10aa0 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10ab0 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 09 09 09  y %i", idx);....
10ac0 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63  .free(curr_id->c
10ad0 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09  ertificate);....
10ae0 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09  ..outidx--;.....
10af0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10b00 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
10b10 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
10b20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65  applets from the
10b30 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09   CCC's TLV */...
10b40 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
10b50 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
10b60 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..../* Look for 
10b70 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
10b80 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
10b90 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72  applets */...for
10ba0 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
10bb0 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
10bc0 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
10bd0 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
10be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10bf0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
10c00 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45   %s ... ", CACKE
10c10 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
10c20 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10c30 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20  ->tag));.....if 
10c40 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
10c50 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
10c60 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  URL) {.....CACKE
10c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10c80 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
10c90 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
10ca0 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
10cb0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10cc0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
10cd0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10ce0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10cf0 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
10d00 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
10d10 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
10d20 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10d30 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10d40 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10d50 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50  nly care about P
10d60 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73  KI applets, this
10d70 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73   applet supports
10d80 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43  : %s/%02x)", CAC
10d90 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
10da0 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63  PPTYPE_TO_STR(cc
10db0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10dc0 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c  rdurl->apptype),
10dd0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
10de0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10df0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10e00 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10e10 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
10e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
10e30 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
10e40 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10e50 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
10e60 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10e70 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
10e80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10e90 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
10ea0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
10eb0 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
10ec0 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10ed0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
10ee0 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
10ef0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
10f00 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10f10 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43  ->appid);....CAC
10f20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10f30 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
10f40 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
10f50 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
10f60 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(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 2c 20 28 75 6e 73 69  objectid), (unsi
10f90 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
10fa0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10fb0 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
10fc0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
10fd0 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  id, ccc_curr->va
10fe0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
10ff0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
11000 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11010 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72  ->rid));....curr
11020 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
11030 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
11040 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11050 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
11060 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75  8) & 0xff;....cu
11070 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
11080 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
11090 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
110a0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
110b0 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  0xff;...../* Sel
110c0 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
110d0 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63   ... */....selec
110e0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
110f0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
11100 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
11110 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a  eof(curr_aid));.
11120 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
11130 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
11140 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
11150 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11160 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
11170 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
11180 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11190 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
111a0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
111b0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20  ...}...../* ... 
111c0 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
111d0 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  ) */....select_r
111e0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
111f0 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63  ct_file(slot, cc
11200 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11210 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
11220 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f  ;....if (select_
11230 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11240 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43  SC_S_OK) {.....C
11250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11260 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
11270 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
11280 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
11290 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
112a0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
112b0 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63  ...}...../* Proc
112c0 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
112d0 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
112e0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
112f0 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63  ...app_tlv = cac
11300 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
11310 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70  t);......for (ap
11320 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
11330 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
11340 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
11350 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41  >_next) {.....CA
11360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11370 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
11380 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
11390 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
113a0 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
113b0 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72  .....if (app_cur
113c0 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
113d0 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29  TAG_CERTIFICATE)
113e0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
113f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
11400 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
11410 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
11420 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
11430 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  ");.......contin
11440 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
11450 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b  urr_id = &certs[
11460 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74  outidx];.....out
11470 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72  idx++;......curr
11480 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
11490 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
114a0 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  C;.....memcpy(cu
114b0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
114c0 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
114d0 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
114e0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
114f0 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  t));.....curr_id
11500 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ->card.cac.file 
11510 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
11520 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
11530 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
11540 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
11550 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11560 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
11570 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  g curr_id->card.
11580 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20  cac.applet (%p) 
11590 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
115a0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
115b0 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73  cac.applet, (uns
115c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
115d0 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
115e0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
115f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11600 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
11610 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11620 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
11630 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11640 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  cac.applet));...
11650 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
11660 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
11670 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
11680 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
11690 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
116a0 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
116b0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
116c0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
116d0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61  ->certificate, a
116e0 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20  pp_curr->value, 
116f0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11700 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
11710 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
11720 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20  ount) {......if 
11730 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
11740 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74  ) {.......*count
11750 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 63 65 72   *= 2;.......cer
11760 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
11770 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
11780 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
11790 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
117a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
117b0 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  }.....}....}....
117c0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
117d0 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69  (app_tlv);.....i
117e0 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
117f0 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
11800 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  ;....}...}....ca
11810 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63  ckey_free_tlv(cc
11820 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f  c_tlv);..}...*co
11830 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
11840 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
11850 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
11860 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
11870 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
11880 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
11890 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  .slot->cached_ce
118a0 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70  rts = cackey_cop
118b0 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65  y_certs(NULL, ce
118c0 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73  rts, *count);..s
118d0 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
118e0 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74  s_count = *count
118f0 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
11900 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
11910 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
11920 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
11930 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
11940 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
11950 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
11960 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
11970 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
11980 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
11990 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
119a0 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
119b0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
119c0 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
119d0 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
119e0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
119f0 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
11a00 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
11a10 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
11a20 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
11a30 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
11a40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
11a50 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
11a60 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
11a70 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
11a80 75 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79  utput) {..cackey
11a90 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64  _pcsc_id_type id
11aa0 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
11ab0 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f 74   char dyn_auth_t
11ac0 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a 09 75 6e  emplate[10];..un
11ad0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
11ae0 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20  buf, *tmpbuf_s, 
11af0 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *outbuf_s, *outb
11b00 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  uf_p;..unsigned 
11b10 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65  char bytes_to_se
11b20 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09  nd, p1, class;..
11b30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c  unsigned char bl
11b40 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  ocktype;..cackey
11b50 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  _ret send_ret;..
11b60 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
11b70 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76  e;..ssize_t retv
11b80 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66  al = 0, unpadoff
11b90 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70  set;..size_t tmp
11ba0 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20  buflen, padlen, 
11bb0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75  tmpoutbuflen, ou
11bc0 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66  tbuf_len;..int f
11bd0 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
11be0 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45  .int le;...CACKE
11bf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11c00 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
11c10 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
11c20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11c30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11c40 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  slot is NULL");.
11c50 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11c60 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e  }...if (buf == N
11c70 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11c90 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c  ror.  buf is NUL
11ca0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11cb0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
11cc0 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
11cd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11ce0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75  INTF("Error.  ou
11cf0 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tbuf is NULL");.
11d00 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11d10 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
11d20 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11d40 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
11d50 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
11d60 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
11d70 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11d80 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  >pcsc_identity =
11d90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11da0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11db0 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
11dc0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11dd0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11de0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11df0 69 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69  id_type = identi
11e00 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11e10 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20  y->id_type;..if 
11e20 28 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  (id_type == CACK
11e30 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
11e40 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ONLY) {...CACKEY
11e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11e60 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11e70 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11e80 73 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  s CACKEY_ID_TYPE
11e90 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63  _CERT_ONLY, whic
11ea0 68 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  h cannot be used
11eb0 20 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70   for sign/decryp
11ec0 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  t");....return(-
11ed0 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
11ee0 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61  (id_type) {...ca
11ef0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11f00 45 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41  E_PIV:...case CA
11f10 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11f20 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  :....break;...de
11f30 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59  fault:....CACKEY
11f40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11f50 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11f60 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11f70 73 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65  s not a supporte
11f80 64 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73  d value. Type is
11f90 3a 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30  : 0x%lx (PIV = 0
11fa0 78 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c  x%lx, CAC = 0x%l
11fb0 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  x)", (unsigned l
11fc0 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75  ong) id_type, (u
11fd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11fe0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
11ff0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
12000 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ) CACKEY_ID_TYPE
12010 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72  _CAC);.....retur
12020 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  n(-1);..}.../* D
12030 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74  etermine identit
12040 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69  y Key size */..i
12050 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
12060 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
12070 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65  ize < 0) {...ide
12080 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12090 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  tity->keysize = 
120a0 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28  x509_to_keysize(
120b0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
120c0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
120d0 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  cate, identity->
120e0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
120f0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
12100 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73  ..}.../* Pad mes
12110 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65  sage to key size
12120 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75   */..if (padInpu
12130 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  t) {...if (ident
12140 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12150 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29  ty->keysize > 0)
12160 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e   {....if (buflen
12170 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63   != identity->pc
12180 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
12190 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28  size) {.....if (
121a0 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69  buflen > (identi
121b0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
121c0 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29  y->keysize + 3))
121d0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
121e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
121f0 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20  or.  Message is 
12200 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67  too large to sig
12210 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09  n/decrypt");....
12220 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12230 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66  ...}......tmpbuf
12240 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
12250 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12260 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62  eysize;.....tmpb
12270 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
12280 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65  uflen);.....free
12290 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09  _tmpbuf = 1;....
122a0 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75  ..padlen = tmpbu
122b0 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20  flen - buflen - 
122c0 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50  3;....../* RSA P
122d0 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31  KCS#1 EMSA-PKCS1
122e0 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f  -v1_5 Padding */
122f0 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d  .....tmpbuf[0] =
12300 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75   0x00;.....tmpbu
12310 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09  f[1] = 0x01;....
12320 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b  .memset(&tmpbuf[
12330 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e  2], 0xFF, padlen
12340 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61  );.....tmpbuf[pa
12350 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b  dlen + 2]= 0x00;
12360 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70  .....memcpy(&tmp
12370 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c  buf[padlen + 3],
12380 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a   buf, buflen);..
12390 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
123a0 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64  _PRINTBUF("Unpad
123b0 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c  ded:", buf, bufl
123c0 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  en);.....CACKEY_
123d0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
123e0 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66  Padded:", tmpbuf
123f0 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09  , tmpbuflen);...
12400 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d  .} else {.....tm
12410 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09  pbuf = buf;.....
12420 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
12430 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  en;.....free_tmp
12440 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64  buf = 0;.....pad
12450 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09  len = 0;....}...
12460 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
12470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12480 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72  "Unable to deter
12490 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68  mine key size, h
124a0 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67  oping the messag
124b0 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61  e is properly pa
124c0 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70  dded!");.....tmp
124d0 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d  buf = buf;....tm
124e0 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
124f0 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  ;....free_tmpbuf
12500 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20   = 0;....padlen 
12510 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  = 0;...}..} else
12520 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75   {...tmpbuf = bu
12530 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  f;...tmpbuflen =
12540 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f   buflen;...free_
12550 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61  tmpbuf = 0;...pa
12560 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  dlen = 0;..}.../
12570 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74  * Begin transact
12580 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
12590 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
125a0 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c  (slot);.../* Sel
125b0 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c  ect correct appl
125c0 65 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69  et */..switch (i
125d0 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  d_type) {...case
125e0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
125f0 43 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  CAC:....CACKEY_D
12600 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
12610 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f  ecting applet fo
12620 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20  und at %p ...", 
12630 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12640 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12650 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61  c.applet);....ca
12660 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
12670 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  et(slot, identit
12680 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12690 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
126a0 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
126b0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
126c0 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
126d0 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  et));...../* Sel
126e0 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65  ect correct file
126f0 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   */....cackey_se
12700 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
12710 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12720 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12730 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61  c.file);....brea
12740 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
12750 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
12760 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12770 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09  te[0] = 0x7C;...
12780 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12790 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[1] = 0x82;...
127a0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
127b0 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66  te[2] = ((tmpbuf
127c0 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30  len + 6) & 0xff0
127d0 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f  0) >> 8;....dyn_
127e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d  auth_template[3]
127f0 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20   = (tmpbuflen + 
12800 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09  6) & 0x00ff;....
12810 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12820 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[4] = 0x82;....
12830 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12840 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  e[5] = 0x00;....
12850 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12860 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09  e[6] = 0x81;....
12870 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12880 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[7] = 0x82;....
12890 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
128a0 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65  e[8] = (tmpbufle
128b0 6e 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  n & 0xff00) >> 8
128c0 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
128d0 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62  mplate[9] = tmpb
128e0 75 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a  uflen & 0x00ff;.
128f0 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
12900 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
12910 73 6c 6f 74 2c 20 30 78 31 30 2c 20 4e 49 53 54  slot, 0x10, NIST
12920 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
12930 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50  _GENAUTH, NISTSP
12940 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53  800_78_3_ALGO_RS
12950 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d  A2048, identity-
12960 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12970 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c  card.piv.key_id,
12980 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68   sizeof(dyn_auth
12990 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79 6e 5f  _template), dyn_
129a0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 30  auth_template, 0
129b0 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  x00, NULL, NULL,
129c0 20 4e 55 4c 4c 29 3b 0a 09 09 09 62 72 65 61 6b   NULL);....break
129d0 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
129e0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
129f0 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
12a00 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
12a10 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
12a20 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
12a30 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
12a40 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f  tmpoutbuflen = o
12a50 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20  utbuflen;....if 
12a60 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
12a70 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
12a80 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
12a90 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
12aa0 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  TU;...} else {..
12ab0 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20  ..bytes_to_send 
12ac0 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d  = tmpbuflen;...}
12ad0 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 43  ....send_ret = C
12ae0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
12af0 45 52 49 43 3b 0a 09 09 73 77 69 74 63 68 20 28  ERIC;...switch (
12b00 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
12b10 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12b20 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 20 28 74  E_CAC:.....if (t
12b30 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45  mpbuflen > CACKE
12b40 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09  Y_APDU_MTU) {...
12b50 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09  ...p1 = 0x80;...
12b60 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
12b70 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
12b80 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 09  p1 = 0x00;......
12b90 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
12ba0 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d  ......send_ret =
12bb0 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
12bc0 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
12bd0 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
12be0 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
12bf0 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31  _SIGNDECRYPT, p1
12c00 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f  , 0x00, bytes_to
12c10 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c  _send, tmpbuf, l
12c20 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75  e, &respcode, ou
12c30 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66  tbuf, &tmpoutbuf
12c40 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  len);.....break;
12c50 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
12c60 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
12c70 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e  .if (tmpbuflen >
12c80 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
12c90 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  ) {......class =
12ca0 20 30 78 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x10;......le =
12cb0 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
12cc0 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  e {......class =
12cd0 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
12ce0 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20  7816;......le = 
12cf0 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  256;.....}......
12d00 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12d10 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12d20 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50 38  , class, NISTSP8
12d30 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
12d40 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30  NAUTH, NISTSP800
12d50 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
12d60 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  48, identity->pc
12d70 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
12d80 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79  d.piv.key_id, by
12d90 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70  tes_to_send, tmp
12da0 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f  buf, le, &respco
12db0 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70  de, outbuf, &tmp
12dc0 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  outbuflen);.....
12dd0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12de0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12df0 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
12e00 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ak;...}....if (s
12e10 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
12e20 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
12e30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12e40 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
12e50 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
12e60 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
12e70 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  .");.....if (fre
12e80 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
12e90 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
12ea0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
12eb0 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
12ec0 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
12ed0 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
12ee0 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
12ef0 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
12f00 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
12f10 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43  x6982) {.....CAC
12f20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12f30 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
12f40 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
12f50 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45  .  Returning NEE
12f60 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63  DLOGIN");......c
12f70 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
12f80 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09  reset(slot);....
12f90 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
12fa0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
12fb0 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
12fc0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
12fd0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
12fe0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
12ff0 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
13000 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
13010 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
13020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
13030 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
13040 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
13050 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  NT");......cacke
13060 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
13070 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65  t(slot);......re
13080 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13090 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
130a0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
130b0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  (-1);...}....tmp
130c0 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
130d0 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
130e0 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
130f0 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
13100 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
13110 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
13120 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
13130 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
13140 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
13150 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
13160 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
13170 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
13180 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
13190 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
131a0 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
131b0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
131c0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
131d0 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
131e0 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
131f0 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
13200 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
13210 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
13220 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
13230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13240 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
13250 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
13260 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
13270 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
13280 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
13290 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
132a0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
132b0 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
132c0 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
132d0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
132e0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
132f0 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
13300 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
13310 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
13320 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77  signature */..sw
13330 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
13340 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
13350 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f  D_TYPE_PIV:....o
13360 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76  utbuf_len = retv
13370 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20  al;....outbuf_p 
13380 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
13390 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c  rtlv_tag(outbuf,
133a0 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78   &outbuf_len, 0x
133b0 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62  7C, NULL,  &outb
133c0 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  uf_len);....if (
133d0 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c  outbuf_p == NULL
133e0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
133f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
13400 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
13410 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
13420 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
13430 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72  ot a 0x7C tag, r
13440 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
13450 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ure");......retu
13460 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  rn(-1);....}....
13470 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66  .retval = outbuf
13480 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66  _len;.....outbuf
13490 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09  _len = retval;..
134a0 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63  ..outbuf_p = cac
134b0 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
134c0 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74  tag(outbuf, &out
134d0 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e  buf_len, 0x82, N
134e0 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65  ULL,  &outbuf_le
134f0 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75  n);....if (outbu
13500 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f_p == NULL) {..
13510 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13520 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
13530 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45   from PIV for GE
13540 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43  NERATE AUTHENTIC
13550 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20  ATION was not a 
13560 30 78 38 32 20 77 69 74 68 20 74 68 65 6e 20 30  0x82 with then 0
13570 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69  x7C tag, returni
13580 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
13590 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
135a0 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61  ;....}.....retva
135b0 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a  l = outbuf_len;.
135c0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
135d0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
135e0 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43  _CAC:...case CAC
135f0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
13600 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b  _ONLY:....break;
13610 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72  ..}.../* Unpad r
13620 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70  eply */..if (unp
13630 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66  adOutput) {...if
13640 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a   (retval < 3) {.
13650 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13660 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73  PRINTF("Reply is
13670 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61   too small, we a
13680 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75  re not able to u
13690 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20  npad -- passing 
136a0 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
136b0 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
136c0 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
136d0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
136e0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
136f0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
13700 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
13710 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
13720 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
13730 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21  .if (outbuf[0] !
13740 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43  = 0x00) {....CAC
13750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13760 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70  ("Unrecognized p
13770 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d  adding scheme --
13780 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
13790 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
137a0 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
137b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
137c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
137d0 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
137e0 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
137f0 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
13800 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
13810 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74  );...}....blockt
13820 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b  ype = outbuf[1];
13830 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  ...unpadoffset =
13840 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62   0;....switch (b
13850 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63  locktype) {....c
13860 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a  ase 0x00:...../*
13870 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
13880 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  1, the first non
13890 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68  -zero byte is th
138a0 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  e start of data 
138b0 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
138c0 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
138d0 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
138e0 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
138f0 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
13900 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
13910 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   != 0x00) {.....
13920 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
13930 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
13940 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ....case 0x01:..
13950 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
13960 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65  heme 2, pad byte
13970 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f  s are 0xFF follo
13980 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09  wed by 0x00 */..
13990 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
139a0 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
139b0 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
139c0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
139d0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
139e0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
139f0 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66  0xFF) {.......if
13a00 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
13a10 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
13a20 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  ........unpadoff
13a30 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62  set++;.........b
13a40 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c  reak;.......} el
13a50 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  se {........CACK
13a60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13a70 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
13a80 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
13a90 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13aa0 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
13ab0 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30  een 0x00 found 0
13ac0 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
13ad0 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
13ae0 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
13af0 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13b00 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
13b10 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43  else {.......CAC
13b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13b30 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
13b40 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
13b50 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
13b60 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
13b70 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20  been 0xFF found 
13b80 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
13b90 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
13ba0 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
13bb0 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13bc0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
13bd0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
13be0 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61   0x02:...../* Pa
13bf0 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20  dding Scheme 3, 
13c00 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f  pad bytes are no
13c10 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72  n-zero first zer
13c20 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20  o byte found is 
13c30 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79  the seperator by
13c40 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  te */.....for (u
13c50 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
13c60 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
13c70 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
13c80 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
13c90 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
13ca0 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
13cb0 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
13cc0 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
13cd0 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
13ce0 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
13cf0 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
13d00 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
13d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13d20 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
13d30 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
13d40 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
13d50 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
13d60 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
13d70 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13d80 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
13d90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13da0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
13db0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
13dc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13dd0 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
13de0 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
13df0 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
13e00 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
13e10 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f  emmove(outbuf, o
13e20 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66  utbuf + unpadoff
13e30 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  set, retval);...
13e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13e50 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
13e60 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
13e70 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
13e80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e90 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
13ea0 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
13eb0 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
13ec0 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  ng) retval);...r
13ed0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
13ee0 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
13ef0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13f00 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
13f10 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
13f20 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
13f30 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
13f40 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13f50 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
13f60 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69  _ret cackey_logi
13f70 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
13f80 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
13f90 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
13fa0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
13fb0 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65  n_len, int *trie
13fc0 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
13fd0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
13fe0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
13ff0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
14000 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
14010 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
14020 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
14030 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
14040 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
14050 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
14060 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f  _certs;..uint16_
14070 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b  t response_code;
14080 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
14090 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64  ining;..int send
140a0 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72  _ret;..int key_r
140b0 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 3b  eference = 0x00;
140c0 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
140d0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
140e0 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
140f0 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
14100 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
14110 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
14120 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
14130 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
14140 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
14150 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
14160 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
14170 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
14180 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
14190 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
141a0 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
141b0 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
141c0 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
141d0 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
141e0 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
141f0 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74  ;..}.../* Reject
14200 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20   PINs which are 
14210 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
14220 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b   (pin_len < 5) {
14230 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14240 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e  PRINTF("Rejectin
14250 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  g PIN which is t
14260 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
14270 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
14280 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e  atleast 5)", pin
14290 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
142a0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
142b0 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
142c0 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
142d0 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
142e0 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
142f0 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
14300 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
14310 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
14320 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
14330 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
14340 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
14350 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
14360 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
14370 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
14380 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
14390 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
143a0 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
143b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
143c0 22 57 65 20 72 65 63 65 6e 74 6c 79 20 68 61 64  "We recently had
143d0 20 61 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20   a PIV card, so 
143e0 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  we will attempt 
143f0 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20  to authenticate 
14400 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70  using the PIV Ap
14410 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65  plication key re
14420 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09  ference");......
14430 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20  key_reference = 
14440 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b  0x80;.....break;
14450 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
14460 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
14470 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
14480 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
14490 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
144a0 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
144b0 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
144c0 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
144d0 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65  FY, 0x00, key_re
144e0 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28  ference, sizeof(
144f0 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
14500 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  n, 0x00, &respon
14510 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
14520 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
14530 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
14540 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
14550 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
14560 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
14570 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
14580 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
14590 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
145a0 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
145b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
145c0 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
145d0 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
145e0 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
145f0 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
14600 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
14610 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74  ning_p) {.....*t
14620 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
14630 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69   = tries_remaini
14640 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  ng;....}.....ret
14650 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
14660 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
14670 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
14680 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
14690 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
146a0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
146b0 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
146c0 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
146d0 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
146e0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
146f0 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72  OCKED);...}....r
14700 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
14710 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
14720 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14730 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
14740 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  fication succeed
14750 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ed");...return(C
14760 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
14770 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
14780 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
14790 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
147a0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
147b0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
147c0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
147d0 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
147e0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
147f0 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74  key_ret cackey_t
14800 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72  oken_present(str
14810 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
14820 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
14830 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
14840 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65  t_ret;..DWORD re
14850 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74  ader_len = 0, st
14860 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f  ate = 0, protoco
14870 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a  l = 0, atr_len;.
14880 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54  .BYTE atr[MAX_AT
14890 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73  R_SIZE];..LONG s
148a0 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64  tatus_ret, scard
148b0 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  _reconn_ret;...C
148c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
148d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
148e0 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
148f0 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  nal) {...CACKEY_
14900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14910 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
14920 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20  esent (internal 
14930 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74  token)");....ret
14940 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
14950 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
14960 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
14970 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
14980 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
14990 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
149a0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
149b0 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
149c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
149d0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
149e0 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
149f0 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
14a00 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
14a10 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14a20 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
14a30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
14a40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14a50 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73  ling SCardStatus
14a60 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
14a70 63 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a  card status");..
14a80 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
14a90 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f  f(atr);..status_
14aa0 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75  ret = SCardStatu
14ab0 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  s(slot->pcsc_car
14ac0 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72  d, NULL, &reader
14ad0 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70  _len, &state, &p
14ae0 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61  rotocol, atr, &a
14af0 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  tr_len);...if (s
14b00 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
14b10 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
14b20 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  DLE) {...CACKEY_
14b30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
14b40 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75  ardStatus() retu
14b50 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56  rned SCARD_E_INV
14b60 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72  ALID_HANDLE, mar
14b70 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65  king is not alre
14b80 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e  ady connected an
14b90 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29  d trying again")
14ba0 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
14bb0 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
14bc0 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63  ;....pcsc_connec
14bd0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
14be0 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
14bf0 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f  );...if (pcsc_co
14c00 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
14c10 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
14c20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14c30 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
14c40 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
14c50 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
14c60 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
14c70 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
14c80 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
14c90 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  NT);...}....CACK
14ca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14cb0 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74  "Calling SCardSt
14cc0 61 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  atus() again");.
14cd0 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
14ce0 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
14cf0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
14d00 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
14d10 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
14d20 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
14d30 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
14d40 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
14d50 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
14d60 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
14d70 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
14d80 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
14d90 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
14da0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
14db0 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
14dc0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14dd0 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
14de0 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
14df0 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
14e00 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
14e10 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
14e20 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
14e30 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
14e40 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
14e50 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
14e60 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
14e70 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
14e80 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
14e90 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
14ea0 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
14eb0 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
14ec0 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
14ed0 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
14ee0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
14ef0 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
14f00 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
14f10 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
14f20 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
14f30 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
14f40 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
14f50 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
14f60 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
14f70 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
14f80 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
14f90 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
14fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14fb0 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
14fc0 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
14fd0 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
14fe0 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
14ff0 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
15000 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
15010 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
15020 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
15030 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
15040 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
15050 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
15060 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15070 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
15080 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
15090 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
150a0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
150b0 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
150c0 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
150d0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
150e0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
150f0 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
15100 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15110 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15120 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
15130 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
15140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15150 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
15160 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
15170 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
15180 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
15190 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
151a0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
151b0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
151c0 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
151d0 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
151e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
151f0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
15200 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
15210 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15220 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
15230 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
15240 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
15250 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
15260 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
15270 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
15280 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
15290 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
152a0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
152b0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
152c0 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
152d0 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
152e0 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
152f0 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
15300 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15310 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
15320 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
15330 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
15340 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
15350 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
15360 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
15370 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15380 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
15390 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
153a0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
153b0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
153c0 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
153d0 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
153e0 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
153f0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
15400 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
15410 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
15420 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
15430 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
15440 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
15450 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
15460 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
15470 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
15480 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
15490 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
154a0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
154b0 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
154c0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
154d0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
154e0 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
154f0 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
15500 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
15510 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
15520 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
15530 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
15540 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
15550 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
15560 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
15570 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
15580 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
15590 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
155a0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
155b0 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
155c0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
155d0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
155e0 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
155f0 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
15600 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
15610 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15620 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
15630 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
15640 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
15650 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
15660 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
15670 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
15680 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
15690 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
156a0 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
156b0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
156c0 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
156d0 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
156e0 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
156f0 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
15700 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
15710 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
15720 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
15730 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
15740 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
15750 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
15760 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
15770 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
15780 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
15790 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
157a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
157b0 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
157c0 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
157d0 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
157e0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
157f0 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
15800 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
15810 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
15820 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
15830 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
15840 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
15850 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
15860 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
15870 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
15880 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
15890 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
158a0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
158b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
158c0 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
158d0 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
158e0 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
158f0 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
15900 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
15910 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
15920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15930 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
15940 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
15950 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
15960 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
15970 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
15980 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
15990 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
159a0 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
159b0 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
159c0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
159d0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
159e0 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
159f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
15a00 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
15a10 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
15a20 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
15a30 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
15a40 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
15a50 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
15a60 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
15a70 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
15a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
15a90 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
15aa0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15ab0 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
15ac0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
15ad0 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
15ae0 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
15af0 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
15b00 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
15b10 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
15b20 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
15b30 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
15b40 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
15b50 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
15b60 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
15b70 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
15b80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15b90 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
15ba0 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
15bb0 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
15bc0 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
15bd0 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
15be0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
15bf0 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
15c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15c10 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
15c20 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
15c30 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
15c40 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
15c50 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
15c60 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
15c70 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
15c80 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
15c90 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
15ca0 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
15cb0 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
15cc0 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
15cd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15ce0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15cf0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
15d00 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
15d10 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
15d20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
15d30 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
15d40 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
15d50 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
15d60 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
15d70 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
15d80 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
15d90 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
15da0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
15db0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
15dc0 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
15dd0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15de0 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
15df0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
15e00 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
15e10 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
15e20 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
15e30 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
15e40 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15e50 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
15e60 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
15e70 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
15e80 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
15e90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15ea0 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
15eb0 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
15ec0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
15ed0 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
15ee0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
15ef0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
15f00 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
15f10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15f20 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
15f30 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
15f40 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
15f50 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
15f60 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
15f70 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
15f80 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
15f90 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
15fa0 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
15fb0 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
15fc0 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
15fd0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
15fe0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15ff0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
16000 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
16010 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
16020 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
16030 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
16040 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
16050 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
16060 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
16070 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
16080 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
16090 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
160a0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
160b0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
160c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
160d0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
160e0 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
160f0 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
16100 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
16110 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
16120 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
16130 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
16140 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
16150 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
16160 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
16170 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
16180 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
16190 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
161a0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
161b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
161c0 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
161d0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
161e0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
161f0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
16200 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
16210 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
16220 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
16230 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16240 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
16250 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
16260 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
16270 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
16280 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
16290 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
162a0 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
162b0 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
162c0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
162d0 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
162e0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
162f0 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
16300 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
16310 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
16320 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
16330 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
16340 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
16350 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
16360 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
16370 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
16380 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
16390 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
163a0 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
163b0 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
163c0 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
163d0 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
163e0 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
163f0 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
16400 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
16410 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
16420 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
16430 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
16440 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
16450 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
16460 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
16470 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
16480 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
16490 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
164a0 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
164b0 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
164c0 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
164d0 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
164e0 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
164f0 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
16500 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
16510 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
16520 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
16530 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
16540 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
16550 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
16560 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16570 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
16580 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
16590 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
165a0 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
165b0 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
165c0 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
165d0 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
165e0 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
165f0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
16600 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
16610 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16620 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
16630 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16640 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
16650 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
16660 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16670 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
16680 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
16690 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
166a0 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
166b0 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
166c0 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
166d0 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
166e0 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
166f0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
16700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16710 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16720 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
16730 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
16740 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
16750 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
16760 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
16770 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
16780 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
16790 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
167a0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
167b0 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
167c0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
167d0 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
167e0 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
167f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16800 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
16810 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
16820 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
16830 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
16840 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
16850 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16860 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
16870 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
16880 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
16890 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
168a0 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
168b0 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
168c0 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
168d0 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
168e0 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
168f0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
16900 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
16910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16920 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16930 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
16940 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
16950 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
16960 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
16970 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
16980 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
16990 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
169a0 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
169b0 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
169c0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
169d0 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
169e0 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
169f0 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
16a00 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
16a10 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
16a20 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
16a30 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
16a40 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
16a50 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
16a60 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
16a70 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
16a80 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
16a90 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
16aa0 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
16ab0 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
16ac0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
16ad0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
16ae0 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
16af0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
16b00 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16b10 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
16b20 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16b30 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16b40 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16b50 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
16b60 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
16b70 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16b80 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
16b90 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16ba0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
16bb0 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
16bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16bd0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
16be0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
16bf0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16c00 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
16c10 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
16c20 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
16c30 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
16c40 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
16c50 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
16c60 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
16c70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16c80 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
16c90 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
16ca0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
16cb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
16cc0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
16cd0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
16ce0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
16cf0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
16d00 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
16d10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16d20 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16d30 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
16d40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16d50 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
16d60 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
16d70 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16d80 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16d90 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16da0 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
16db0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16dc0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16dd0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16de0 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
16df0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16e00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16e10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
16e20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
16e30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
16e40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
16e50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16e60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16e70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16e80 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
16e90 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
16ea0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
16eb0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16ec0 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
16ed0 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
16ee0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
16ef0 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
16f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16f10 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16f20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16f30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16f40 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
16f50 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16f60 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16f70 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16f80 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16f90 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
16fa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16fb0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16fc0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
16fd0 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
16fe0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16ff0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
17000 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
17010 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
17020 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
17030 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
17040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17050 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
17060 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
17070 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
17080 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
17090 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
170a0 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
170b0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
170c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
170d0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
170e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
170f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
17100 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
17110 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
17120 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
17130 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
17140 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17150 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17160 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17170 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
17180 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
17190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
171a0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
171b0 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
171c0 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
171d0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
171e0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
171f0 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
17200 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
17210 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17220 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
17230 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
17240 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17250 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
17260 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
17270 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
17280 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
17290 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
172a0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
172b0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
172c0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
172d0 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
172e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
172f0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17300 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
17310 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17320 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17330 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17340 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  ....if (identity
17350 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43  ->id_type == CAC
17360 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29  KEY_ID_TYPE_PIV)
17370 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
17380 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e   identity->card.
17390 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09  piv.label;......
173a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72  ulValueLen = str
173b0 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  len(pValue);....
173c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75  .} else {......u
173d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72  lValueLen = snpr
173e0 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63  intf((char *) uc
173f0 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75  TmpBuf, sizeof(u
17400 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74  cTmpBuf), "Ident
17410 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69  ity #%lu", (unsi
17420 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
17430 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70  ity_num);......p
17440 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66  Value = ucTmpBuf
17450 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61  ;.......if (ulVa
17460 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66  lueLen >= sizeof
17470 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09  (ucTmpBuf)) {...
17480 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17490 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65   0;.......pValue
174a0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a   = NULL;......}.
174b0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
174c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
174d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
174e0 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
174f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17500 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17510 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17520 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
17530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17540 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
17550 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
17560 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20  VALUE (0x%08lx) 
17570 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17580 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17590 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74  type);......swit
175a0 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29  ch (objectclass)
175b0 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f   {......case CKO
175c0 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09  _PRIVATE_KEY:...
175d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
175e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
175f0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17600 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17610 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29  a private key.")
17620 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
17630 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45  .....case CKO_NE
17640 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09  TSCAPE_TRUST:...
17650 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17660 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17670 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17680 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17690 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
176a0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
176b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
176c0 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  se CKO_PUBLIC_KE
176d0 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72  Y:.......if (cer
176e0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
176f0 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39  0) {........x509
17700 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
17710 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69  _to_pubkey(certi
17720 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
17730 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
17740 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35  );........if (x5
17750 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
17760 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c   { .........pVal
17770 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
17780 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
17790 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
177a0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
177b0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a  ......}.......}.
177c0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
177d0 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54  ...case CKO_CERT
177e0 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70  IFICATE:.......p
177f0 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63  Value = certific
17800 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c  ate;.......ulVal
17810 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63  ueLen = certific
17820 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09  ate_len;........
17830 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17850 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17860 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
17870 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17880 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17890 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
178a0 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
178b0 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
178c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
178d0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
178e0 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78  e CKA_ISSUER (0x
178f0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
17900 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17910 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17920 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17930 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
17940 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
17950 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
17960 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
17970 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17980 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17990 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
179a0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
179b0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
179c0 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75   or Netscape tru
179d0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
179e0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
179f0 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
17a00 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
17a10 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
17a20 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73  ret = x509_to_is
17a30 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65  suer(certificate
17a40 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
17a50 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
17a60 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
17a70 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
17a80 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
17a90 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
17aa0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17ab0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
17ac0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
17ad0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17ae0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17af0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
17b00 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17b10 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17b20 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17b30 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49  ...case CKA_SERI
17b40 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43  AL_NUMBER:.....C
17b50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17b60 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17b70 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52  ttribute CKA_SER
17b80 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30  IAL_NUMBER (0x%0
17b90 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17ba0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17bb0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17bc0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
17bd0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
17be0 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
17bf0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
17c00 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17c10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17c20 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17c30 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17c40 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
17c50 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f   a certificate o
17c60 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  r Netscape trust
17c70 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17c80 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17c90 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
17ca0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
17cb0 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
17cc0 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69  t = x509_to_seri
17cd0 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
17ce0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
17cf0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
17d00 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
17d10 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
17d20 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
17d30 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
17d40 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
17d50 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
17d60 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
17d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17d80 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17d90 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
17da0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17db0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17dc0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17dd0 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
17de0 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ECT:.....CACKEY_
17df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17e00 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17e10 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28  te CKA_SUBJECT (
17e20 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17e30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17e40 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17e50 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17e60 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
17e70 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
17e80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17e90 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17ea0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17eb0 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
17ec0 61 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b  a certificate");
17ed0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17ee0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
17ef0 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
17f00 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
17f10 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
17f20 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
17f30 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
17f40 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
17f50 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
17f60 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
17f70 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
17f80 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
17f90 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
17fa0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
17fb0 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
17fc0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
17fd0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17fe0 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
17ff0 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
18000 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
18010 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
18020 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
18030 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  _ID:.....CACKEY_
18040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18050 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
18060 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38  te CKA_ID (0x%08
18070 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18080 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18090 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
180a0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
180b0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
180c0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
180d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
180e0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
180f0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18100 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
18110 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
18120 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
18130 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54  ;.....}......ucT
18140 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65  mpBuf[0] = ((ide
18150 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e  ntity_num + 1) >
18160 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09  > 8) & 0xff;....
18170 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20  .ucTmpBuf[1] =  
18180 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
18190 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09  1) & 0xff;......
181a0 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42  pValue = &ucTmpB
181b0 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  uf;.....ulValueL
181c0 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43  en = 2;......CAC
181d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
181e0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
181f0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
18200 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18210 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18220 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18230 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  se CKA_CERTIFICA
18240 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  TE_TYPE:.....CAC
18250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18260 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18270 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49  ribute CKA_CERTI
18280 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25  FICATE_TYPE (0x%
18290 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
182a0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
182b0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
182c0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
182d0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
182e0 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
182f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18300 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18310 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18320 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
18330 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
18340 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
18350 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
18360 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65  y support one ce
18370 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a  rtificate type *
18380 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69  /.....ck_certifi
18390 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f  cate_type = CKC_
183a0 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c  X_509;......pVal
183b0 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69  ue = &ck_certifi
183c0 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75  cate_type;.....u
183d0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
183e0 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74  of(ck_certificat
183f0 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41  e_type);......CA
18400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18410 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18420 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75  g CKC_X_509 (%lu
18430 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
18440 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
18450 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
18460 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
18470 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
18480 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18490 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
184a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ....case CKA_KEY
184b0 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45  _TYPE:.....CACKE
184c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
184d0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
184e0 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50  bute CKA_KEY_TYP
184f0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
18500 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18510 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18520 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18530 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
18540 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62  RIVATE_KEY && ob
18550 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
18560 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
18570 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18580 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
18590 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
185a0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
185b0 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09  not a key.");...
185c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
185d0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
185e0 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79   support one key
185f0 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
18600 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52  key_type = CKK_R
18610 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  SA;......pValue 
18620 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  = &ck_key_type;.
18630 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18640 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74   sizeof(ck_key_t
18650 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
18660 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18670 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
18680 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70  KK_RSA (%lu) (%p
18690 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
186a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
186b0 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
186c0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
186d0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
186e0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
186f0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18700 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09  ase CKA_SIGN:...
18710 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18720 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18730 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18740 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  SIGN (0x%08lx) .
18750 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18760 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18770 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18780 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18790 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
187a0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
187b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
187c0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
187d0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
187e0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
187f0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
18800 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18810 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
18820 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
18830 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
18840 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18850 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
18860 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
18870 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
18880 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
18890 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
188a0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
188b0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
188c0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
188d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
188e0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
188f0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18900 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18910 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18920 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18930 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18940 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18950 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18960 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
18970 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
18980 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18990 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
189a0 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
189b0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
189c0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
189d0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
189e0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
189f0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18a00 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
18a10 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
18a20 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18a30 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
18a40 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
18a50 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
18a60 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
18a70 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18a80 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72  ....../* We curr
18a90 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  ently only suppo
18aa0 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70  rt "Sign with Ap
18ab0 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70  pendix" */.....p
18ac0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
18ad0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
18ae0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
18af0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
18b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18b10 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18b20 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18b30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18b40 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18b50 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18b60 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18b70 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18b80 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18b90 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09  KA_DECRYPT:.....
18ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18bb0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18bc0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45  attribute CKA_DE
18bd0 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20  CRYPT (0x%08lx) 
18be0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
18bf0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
18c00 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
18c10 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18c20 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
18c30 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18c40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18c50 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18c60 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18c70 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
18c80 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18c90 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18ca0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
18cb0 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18cc0 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f  PRIVATE_KEY || o
18cd0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18ce0 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
18cf0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18d00 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
18d10 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18d20 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
18d30 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
18d40 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
18d50 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18d60 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
18d70 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
18d80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18d90 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18da0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18db0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18dc0 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18dd0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18de0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18df0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18e00 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18e10 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ase CKA_SENSITIV
18e20 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
18e30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18e40 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18e50 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28   CKA_SENSITIVE (
18e60 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18e70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18e80 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18e90 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18ea0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
18eb0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
18ec0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ed0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
18ee0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
18ef0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
18f00 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
18f10 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
18f20 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
18f30 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18f40 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
18f50 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
18f60 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
18f70 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18f80 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
18f90 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
18fa0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18fb0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
18fc0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18fd0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
18fe0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
18ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19000 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
19010 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
19020 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
19030 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
19040 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
19050 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19060 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19070 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
19080 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09  EXTRACTABLE:....
19090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
190a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
190b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45   attribute CKA_E
190c0 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30  XTRACTABLE (0x%0
190d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
190e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
190f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19100 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19110 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
19120 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
19130 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19140 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
19150 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
19160 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
19170 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
19180 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
19190 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
191a0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
191b0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
191c0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
191d0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
191e0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
191f0 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
19200 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19210 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
19220 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
19230 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
19240 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
19250 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19260 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19270 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
19280 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
19290 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
192a0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
192b0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
192c0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
192d0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
192e0 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
192f0 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUS:.....CACKEY_
19300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19310 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19320 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28  te CKA_MODULUS (
19330 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19340 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19350 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19360 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
19370 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
19380 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
19390 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
193a0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
193b0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
193c0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
193d0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
193e0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
193f0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19400 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19410 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
19420 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
19430 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c   = x509_to_modul
19440 75 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  us(certificate, 
19450 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
19460 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
19470 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
19480 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
19490 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
194a0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
194b0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
194c0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
194d0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
194e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
194f0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
19500 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
19510 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19520 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19530 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19540 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c  ...case CKA_PUBL
19550 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  IC_EXPONENT:....
19560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19570 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
19580 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50   attribute CKA_P
19590 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28  UBLIC_EXPONENT (
195a0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
195b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
195c0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
195d0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
195e0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
195f0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
19600 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19610 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19620 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19630 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19640 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19650 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19660 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19670 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19680 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
19690 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
196a0 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e   = x509_to_expon
196b0 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ent(certificate,
196c0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
196d0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
196e0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
196f0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
19700 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19710 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19720 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19730 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
19740 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
19750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19760 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
19770 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
19780 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
19790 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
197a0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
197b0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
197c0 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41  ST_DIGITAL_SIGNA
197d0 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b  TURE:....case CK
197e0 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55  A_TRUST_NON_REPU
197f0 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65  DIATION:....case
19800 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45   CKA_TRUST_KEY_E
19810 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09  NCIPHERMENT:....
19820 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44  case CKA_TRUST_D
19830 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54  ATA_ENCIPHERMENT
19840 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
19850 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e  UST_KEY_AGREEMEN
19860 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
19870 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49  RUST_KEY_CERT_SI
19880 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  GN:....case CKA_
19890 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a  TRUST_CRL_SIGN:.
198a0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
198b0 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09  T_SERVER_AUTH:..
198c0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
198d0 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09  _CLIENT_AUTH:...
198e0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
198f0 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09  CODE_SIGNING:...
19900 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
19910 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e  EMAIL_PROTECTION
19920 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19930 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19940 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19950 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30  CKA_TRUST_... (0
19960 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19970 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19980 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19990 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
199a0 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c  _trusted;.....ul
199b0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
199c0 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a  f(ck_trusted);..
199d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
199e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
199f0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
19a00 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
19a10 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55   long) *((CK_TRU
19a20 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  ST *) pValue), p
19a30 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19a40 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19a50 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19a60 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
19a70 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09  _SHA1_HASH:.....
19a80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19a90 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19aa0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
19ab0 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78  RT_SHA1_HASH (0x
19ac0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19ad0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19ae0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19af0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
19b00 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
19b10 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
19b20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19b30 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19b40 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19b50 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
19b60 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
19b70 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
19b80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
19b90 09 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73  ....SHA1Reset(&s
19ba0 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48  ha1_ctx);.....SH
19bb0 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74  A1Input(&sha1_ct
19bc0 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20  x, certificate, 
19bd0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
19be0 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74  ;.....SHA1Result
19bf0 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31  (&sha1_ctx, sha1
19c00 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61  _hash);......pVa
19c10 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b  lue = sha1_hash;
19c20 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19c30 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61  = sizeof(sha1_ha
19c40 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  sh);......CACKEY
19c50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19c60 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
19c70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
19c80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
19c90 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19ca0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
19cb0 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
19cc0 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
19cd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19ce0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19cf0 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41   CKA_CERT_MD5_HA
19d00 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SH (0x%08lx) ...
19d10 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19d20 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19d30 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19d40 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19d50 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19d60 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19d70 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19d80 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19d90 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19da0 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
19db0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19dc0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
19dd0 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69  ...}......MD5Ini
19de0 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09  t(&md5_ctx);....
19df0 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f  .MD5Update(&md5_
19e00 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65  ctx, certificate
19e10 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
19e20 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c  n);.....MD5Final
19e30 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f  (md5_hash, &md5_
19e40 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ctx);......pValu
19e50 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09  e = md5_hash;...
19e60 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
19e70 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b  izeof(md5_hash);
19e80 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19e90 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19ea0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19eb0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19ec0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19ed0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19ee0 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
19ef0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
19f00 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  L;.....ulValueLe
19f10 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
19f20 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
19f30 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e  ....if (((CK_LON
19f40 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21  G) ulValueLen) !
19f50 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29  = ((CK_LONG) -1)
19f60 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63  ) {..../* Push c
19f70 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68  urr_attr onto th
19f80 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75  e stack */....cu
19f90 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63  rr_attr.type = c
19fa0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
19fb0 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  ..curr_attr.ulVa
19fc0 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
19fd0 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  Len;.....curr_at
19fe0 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  tr.pValue = mall
19ff0 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  oc(curr_attr.ulV
1a000 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d  alueLen);....mem
1a010 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56  cpy(curr_attr.pV
1a020 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75  alue, pValue, cu
1a030 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
1a040 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61  en);.....if (pVa
1a050 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c  lue_free && pVal
1a060 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70  ue) {.....free(p
1a070 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09  Value);....}....
1a080 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d  .if (numattrs >=
1a090 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b   retval_count) {
1a0a0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65  .....retval = re
1a0b0 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1a0c0 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1a0d0 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1a0e0 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26  ..}.....memcpy(&
1a0f0 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d  retval[numattrs]
1a100 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69  , &curr_attr, si
1a110 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29  zeof(curr_attr))
1a120 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b  ;....numattrs++;
1a130 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75  ...}..}...if (nu
1a140 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09  mattrs != 0) {..
1a150 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
1a160 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76  numattrs;...retv
1a170 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
1a180 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
1a190 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
1a1a0 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  al));..} else {.
1a1b0 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a  ..free(retval);.
1a1c0 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c  ...retval = NULL
1a1d0 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1a1e0 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43   = numattrs;...C
1a1f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a200 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c  TF("Returning %l
1a210 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22  u objects (%p)."
1a220 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69  , numattrs, (voi
1a230 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  d *) retval);...
1a240 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
1a250 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
1a260 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
1a270 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
1a280 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
1a290 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e  entities, unsign
1a2a0 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69  ed long identiti
1a2b0 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f  es_count) {..CK_
1a2c0 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
1a2d0 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  attr;..unsigned 
1a2e0 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74  long id_idx, att
1a2f0 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65  r_idx;...if (ide
1a300 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20  ntities == NULL 
1a310 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  || identities_co
1a320 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  unt == 0) {...re
1a330 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
1a340 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69  id_idx = 0; id_i
1a350 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f  dx < identities_
1a360 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29  count; id_idx++)
1a370 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74   {...if (identit
1a380 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a390 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72  ibutes) {....for
1a3a0 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
1a3b0 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
1a3c0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1a3d0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
1a3e0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
1a3f0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69  ..curr_attr = &i
1a400 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a410 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74  ].attributes[att
1a420 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20  r_idx];......if 
1a430 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1a440 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
1a450 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1a460 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  e);.....}....}..
1a470 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1a480 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a490 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65  utes) {.....free
1a4a0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1a4b0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b  dx].attributes);
1a4c0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
1a4d0 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e  _free_certs(iden
1a4e0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1a4f0 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c  csc_identity, 1,
1a500 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72   1);...}..}...fr
1a510 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  ee(identities);.
1a520 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  }..static unsign
1a530 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72  ed long cackey_r
1a540 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1a550 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1a560 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1a570 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
1a580 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  long num_dod_cer
1a590 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ts) {..unsigned 
1a5a0 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69  long cert_idx, i
1a5b0 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20  d_idx = 0;...if 
1a5c0 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  (identities == N
1a5d0 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1a5e0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20  num_dod_certs * 
1a5f0 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65  3);..}...for (ce
1a600 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
1a610 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63  _idx < num_dod_c
1a620 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b  erts; cert_idx++
1a630 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  ) {...identities
1a640 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1a650 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
1a660 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a670 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1a680 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1a690 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49  ibutes(CKO_CERTI
1a6a0 46 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63  FICATE, &extra_c
1a6b0 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
1a6c0 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
1a6d0 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1a6e0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a6f0 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
1a700 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74  dx++;....identit
1a710 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1a720 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
1a730 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ;...identities[i
1a740 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a750 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1a760 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55  ttributes(CKO_PU
1a770 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61  BLIC_KEY, &extra
1a780 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
1a790 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
1a7a0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1a7b0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a7c0 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
1a7d0 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74  _idx++;....ident
1a7e0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1a7f0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1a800 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1a810 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a820 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1a830 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1a840 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20  NETSCAPE_TRUST, 
1a850 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
1a860 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
1a870 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1a880 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a890 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1a8a0 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d  ;...id_idx++;..}
1a8b0 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78  ...return(id_idx
1a8c0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
1a8d0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1a8e0 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
1a8f0 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1a900 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
1a910 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c  slot, unsigned l
1a920 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20  ong *ids_found) 
1a930 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
1a940 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
1a950 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
1a960 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1a970 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1a980 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
1a990 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64  long num_ids, id
1a9a0 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79  _idx, curr_id_ty
1a9b0 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  pe;..unsigned lo
1a9c0 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75  ng num_certs, nu
1a9d0 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72  m_dod_certs, cer
1a9e0 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c  t_idx;..int incl
1a9f0 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1aa00 3d 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64  = 0, include_dod
1aa10 5f 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59  _certs;...CACKEY
1aa20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1aa30 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1aa40 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c  ids_found == NUL
1aa50 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1aa60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1aa70 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73  r.  ids_found is
1aa80 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
1aa90 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69  rn(NULL);..}..#i
1aaa0 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44  fdef CACKEY_CARD
1aab0 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58  _SLOT_INCLUDE_EX
1aac0 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75  TRA_CERTS..inclu
1aad0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1aae0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20   1;.#endif...if 
1aaf0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1ab00 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
1ab10 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
1ab20 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
1ab30 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  ra_certs = 1;..}
1ab40 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1ab50 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52  ACKEY_NO_DOD_CER
1ab60 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1ab70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1ab80 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1ab90 73 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65  s = 0;..}..#ifde
1aba0 66 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52  f CACKEY_NO_EXTR
1abb0 41 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74  A_CERTS..if (get
1abc0 65 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52  env("CACKEY_EXTR
1abd0 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c  A_CERTS") != NUL
1abe0 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64  L) {...include_d
1abf0 6f 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  od_certs = 1;..}
1ac00 20 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64   else {...includ
1ac10 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b  e_dod_certs = 0;
1ac20 0a 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67  ..}.#else..if (g
1ac30 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
1ac40 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1ac50 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
1ac60 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  ude_dod_certs = 
1ac70 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  0;..} else {...i
1ac80 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73  nclude_dod_certs
1ac90 20 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   = 1;..}.#endif.
1aca0 0a 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f  ..if (include_do
1acb0 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d  d_certs) {...num
1acc0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a  _dod_certs = siz
1acd0 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29  eof(extra_certs)
1ace0 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   / sizeof(extra_
1acf0 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c  certs[0]);..} el
1ad00 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63  se {...num_dod_c
1ad10 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  erts = 0;..}...i
1ad20 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61  f (slot->interna
1ad30 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  l) {...num_ids =
1ad40 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1ad50 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c  _identities(NULL
1ad60 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1ad70 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73  ;....if (num_ids
1ad80 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e   != 0) {....iden
1ad90 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28  tities = malloc(
1ada0 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66  num_ids * sizeof
1adb0 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a  (*identities));.
1adc0 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f  ....cackey_read_
1add0 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69  dod_identities(i
1ade0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64  dentities, num_d
1adf0 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65  od_certs);...} e
1ae00 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74  lse {....identit
1ae10 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ies = NULL;...}.
1ae20 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
1ae30 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75  num_ids;....retu
1ae40 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
1ae50 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69  .}...pcsc_identi
1ae60 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
1ae70 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
1ae80 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
1ae90 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e  ;..if (pcsc_iden
1aea0 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
1aeb0 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e  {.../* Convert n
1aec0 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74  umber of Certs t
1aed0 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  o number of obje
1aee0 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73  cts */...num_ids
1aef0 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f   = (CKO_PRIVATE_
1af00 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46  KEY - CKO_CERTIF
1af10 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d  ICATE + 1) * num
1af20 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69  _certs;....if (i
1af30 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1af40 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73  ts) {....num_ids
1af50 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f   += cackey_read_
1af60 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e  dod_identities(N
1af70 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  ULL, num_dod_cer
1af80 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e  ts);...}....iden
1af90 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28  tities = malloc(
1afa0 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66  num_ids * sizeof
1afb0 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a  (*identities));.
1afc0 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66  .../* Add certif
1afd0 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b  icates, public k
1afe0 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65  eys, and private
1aff0 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
1b000 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64  martcard */...id
1b010 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20  _idx = 0;...for 
1b020 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63  (cert_idx = 0; c
1b030 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65  ert_idx < num_ce
1b040 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
1b050 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f   {....for (curr_
1b060 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45  id_type = CKO_CE
1b070 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f  RTIFICATE; curr_
1b080 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50  id_type <= CKO_P
1b090 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72  RIVATE_KEY; curr
1b0a0 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  _id_type++) {...
1b0b0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1b0c0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1b0d0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1b0e0 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f  ributes(curr_id_
1b0f0 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e  type, &pcsc_iden
1b100 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
1b110 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  , cert_idx, &ide
1b120 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1b130 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1b140 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
1b150 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b160 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  identity = mallo
1b170 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  c(sizeof(*identi
1b180 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1b190 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09  c_identity));...
1b1a0 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
1b1b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1b1c0 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63  _identity, &pcsc
1b1d0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1b1e0 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69  _idx], sizeof(*i
1b1f0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1b200 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
1b210 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
1b220 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b230 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
1b240 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  icate = malloc(p
1b250 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
1b260 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
1b270 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
1b280 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
1b290 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b2a0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1b2b0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1b2c0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1b2d0 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
1b2e0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1b2f0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1b300 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f  e_len);......id_
1b310 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  idx++;....}...}.
1b320 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65  ...if (include_e
1b330 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09  xtra_certs) {...
1b340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b350 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1b360 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65  US Government Ce
1b370 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61  rtificates on ha
1b380 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a  rdware slot");..
1b390 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
1b3a0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
1b3b0 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64  entities + id_id
1b3c0 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  x, num_dod_certs
1b3d0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
1b3e0 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63  _free_certs(pcsc
1b3f0 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  _identities, num
1b400 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a  _certs, 1);....*
1b410 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f  ids_found = num_
1b420 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69  ids;....return(i
1b430 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a  dentities);..}..
1b440 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30  ..*ids_found = 0
1b450 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ;..return(NULL);
1b460 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1b470 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b480 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56  Initialize)(CK_V
1b490 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67  OID_PTR pInitArg
1b4a0 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49  s) {..CK_C_INITI
1b4b0 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54  ALIZE_ARGS CK_PT
1b4c0 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f  R args;..uint32_
1b4d0 74 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73  t idx, highest_s
1b4e0 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  lot;..int mutex_
1b4f0 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  init_ret;...CACK
1b500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b510 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1b520 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
1b530 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1b540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b550 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
1b560 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1b570 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1b580 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
1b590 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1b5a0 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21  .if (pInitArgs !
1b5b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73  = NULL) {...args
1b5c0 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09   = pInitArgs;...
1b5d0 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61  memcpy(&cackey_a
1b5e0 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f  rgs, args, sizeo
1b5f0 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b  f(cackey_args));
1b600 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1b610 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  eateMutex == NUL
1b620 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1b630 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  oyMutex == NULL 
1b640 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1b650 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1b660 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1b670 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  == NULL) {....if
1b680 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1b690 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1b6a0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1b6b0 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1b6c0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  s->LockMutex != 
1b6d0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1b6e0 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  lockMutex != NUL
1b6f0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
1b700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b710 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e  ror. Some, but n
1b720 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67  ot All threading
1b730 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
1b740 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ided.");......re
1b750 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b760 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09  TS_BAD);....}...
1b770 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
1b780 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
1b790 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1b7a0 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
1b7b0 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
1b7c0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
1b7d0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1b7e0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
1b7f0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
1b800 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1b810 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
1b820 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1b830 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1b840 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1b850 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1b860 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1b870 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1b880 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1b890 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
1b8a0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1b8b0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1b8c0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1b8d0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1b8e0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
1b8f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b900 2e 69 64 20 3d 20 69 64 78 3b 0a 09 09 63 61 63  .id = idx;...cac
1b910 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61  key_slots[idx].a
1b920 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63  ctive = 0;...cac
1b930 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
1b940 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1b950 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1b960 73 5b 69 64 78 5d 2e 70 63 73 63 5f 73 74 61 74  s[idx].pcsc_stat
1b970 65 20 3d 20 53 43 41 52 44 5f 53 54 41 54 45 5f  e = SCARD_STATE_
1b980 55 4e 41 57 41 52 45 3b 0a 09 09 63 61 63 6b 65  UNAWARE;...cacke
1b990 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
1b9a0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
1b9b0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1b9c0 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
1b9d0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
1b9e0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1b9f0 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72  lots[idx].slot_r
1ba00 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  eset = 0;...cack
1ba10 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f  ey_slots[idx].to
1ba20 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09  ken_flags = 0;..
1ba30 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1ba40 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  x].label = NULL;
1ba50 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ba60 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  idx].internal = 
1ba70 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  0;..}...if (gete
1ba80 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
1ba90 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
1baa0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1bab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73  DEBUG_PRINTF("As
1bac0 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75  ked not to inclu
1bad0 64 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61  de DoD certifica
1bae0 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  tes");..} else {
1baf0 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20  ...highest_slot 
1bb00 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1bb10 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1bb20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1bb30 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  )) - 1;....CACKE
1bb40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1bb50 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65  Including DoD ce
1bb60 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22  rts in slot %lu"
1bb70 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1bb80 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b  ) highest_slot);
1bb90 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1bba0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61  [highest_slot].a
1bbb0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63  ctive = 1;...cac
1bbc0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1bbd0 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  t_slot].internal
1bbe0 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1bbf0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1bc00 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69  t].label = (unsi
1bc10 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53  gned char *) "US
1bc20 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74   Government Cert
1bc30 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63  ificates";...cac
1bc40 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1bc50 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  t_slot].pcsc_rea
1bc60 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a  der = "CACKey";.
1bc70 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1bc80 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b  ighest_slot].tok
1bc90 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d  en_flags = 0;..}
1bca0 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61  ...cackey_initia
1bcb0 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20  lized = 1;...if 
1bcc0 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  (!cackey_biglock
1bcd0 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78  _init) {...mutex
1bce0 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b  _init_ret = cack
1bcf0 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28  ey_mutex_create(
1bd00 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  &cackey_biglock)
1bd10 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69  ;....if (mutex_i
1bd20 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a  nit_ret != 0) {.
1bd30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bd40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1bd50 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  Mutex initializa
1bd60 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a  tion failed.");.
1bd70 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1bd80 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a  ANT_LOCK);...}..
1bd90 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  ..cackey_biglock
1bda0 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  _init = 1;..}...
1bdb0 2f 2a 20 44 65 66 69 6e 65 20 61 20 63 6f 6d 6d  /* Define a comm
1bdc0 61 6e 64 20 74 6f 20 70 72 6f 6d 70 74 20 75 73  and to prompt us
1bdd0 65 72 20 66 6f 72 20 61 20 50 49 4e 20 2a 2f 0a  er for a PIN */.
1bde0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 49  #ifdef CACKEY_PI
1bdf0 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c  N_COMMAND_DEFAUL
1be00 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f  T..cackey_pin_co
1be10 6d 6d 61 6e 64 20 3d 20 43 41 43 4b 45 59 5f 50  mmand = CACKEY_P
1be20 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1be30 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f 50  LT_XSTR(CACKEY_P
1be40 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55  IN_COMMAND_DEFAU
1be50 4c 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  LT);.#endif.#ifd
1be60 65 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  ef CACKEY_PIN_CO
1be70 4d 4d 41 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41  MMAND_XONLY_DEFA
1be80 55 4c 54 0a 09 63 61 63 6b 65 79 5f 70 69 6e 5f  ULT..cackey_pin_
1be90 63 6f 6d 6d 61 6e 64 5f 78 6f 6e 6c 79 20 3d 20  command_xonly = 
1bea0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1beb0 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28  ND_DEFAULT_XSTR(
1bec0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1bed0 4e 44 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54  ND_XONLY_DEFAULT
1bee0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  );.#endif...if (
1bef0 67 65 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22  getenv("DISPLAY"
1bf00 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  ) != NULL) {...c
1bf10 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1bf20 64 20 3d 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63  d = cackey_pin_c
1bf30 6f 6d 6d 61 6e 64 5f 78 6f 6e 6c 79 3b 0a 09 7d  ommand_xonly;..}
1bf40 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1bf50 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
1bf60 44 5f 58 4f 4e 4c 59 22 29 20 21 3d 20 4e 55 4c  D_XONLY") != NUL
1bf70 4c 20 26 26 20 67 65 74 65 6e 76 28 22 44 49 53  L && getenv("DIS
1bf80 50 4c 41 59 22 29 20 21 3d 20 4e 55 4c 4c 29 20  PLAY") != NULL) 
1bf90 7b 0a 09 09 63 61 63 6b 65 79 5f 70 69 6e 5f 63  {...cackey_pin_c
1bfa0 6f 6d 6d 61 6e 64 20 3d 20 67 65 74 65 6e 76 28  ommand = getenv(
1bfb0 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  "CACKEY_PIN_COMM
1bfc0 41 4e 44 5f 58 4f 4e 4c 59 22 29 3b 0a 09 7d 0a  AND_XONLY");..}.
1bfd0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1bfe0 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1bff0 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1c000 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1c010 6e 64 20 3d 20 67 65 74 65 6e 76 28 22 43 41 43  nd = getenv("CAC
1c020 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22  KEY_PIN_COMMAND"
1c030 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1c040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c050 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1c060 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1c070 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1c080 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1c090 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1c0a0 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
1c0b0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1c0c0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1c0d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c0e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1c0f0 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1c100 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1c110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c120 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1c130 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1c140 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1c150 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1c160 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1c170 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c180 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c190 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c1a0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c1b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c1c0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c1d0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1c1e0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1c1f0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1c200 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1c210 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1c220 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1c230 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1c240 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1c250 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1c260 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
1c270 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
1c280 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
1c290 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
1c2a0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1c2b0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1c2c0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1c2d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1c2e0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1c2f0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1c300 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
1c310 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1c320 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1c330 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1c340 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
1c350 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1c360 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1c370 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  er);...}....if (
1c380 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c390 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ].cached_certs) 
1c3a0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1c3b0 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c  _certs(cackey_sl
1c3c0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1c3d0 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c  certs, cackey_sl
1c3e0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1c3f0 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b  certs_count, 1);
1c400 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c410 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1c420 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  rts = NULL;...}.
1c430 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
1c440 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
1c450 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1c460 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
1c470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c480 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1c490 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1c4a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1c4b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1c4c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1c4d0 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
1c4e0 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1c4f0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1c500 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1c510 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1c520 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1c530 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
1c540 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1c550 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
1c560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c570 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1c580 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1c590 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1c5a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1c5b0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1c5c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1c5d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1c5e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1c5f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1c600 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1c610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1c620 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1c630 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1c640 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1c650 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1c660 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
1c670 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
1c680 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
1c690 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1c6a0 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
1c6b0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
1c6c0 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
1c6d0 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
1c6e0 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
1c6f0 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
1c700 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
1c710 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1c720 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1c730 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1c740 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1c750 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1c760 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1c770 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1c780 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1c790 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
1c7a0 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
1c7b0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
1c7c0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
1c7d0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1c7e0 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1c7f0 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
1c800 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
1c810 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
1c820 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
1c830 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
1c840 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
1c850 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
1c860 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1c870 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
1c880 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
1c890 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
1c8a0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
1c8b0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1c8c0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1c8d0 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
1c8e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1c8f0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1c900 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1c910 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1c920 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
1c930 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1c940 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
1c950 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
1c960 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
1c970 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
1c980 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1c990 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
1c9a0 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
1c9b0 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
1c9c0 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
1c9d0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1c9e0 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
1c9f0 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61  tic int first_ca
1ca00 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  ll = 1;..int mut
1ca10 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1ca20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1ca30 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e  ;..CK_ULONG coun
1ca40 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  t, slot_count = 
1ca50 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f  0, currslot, slo
1ca60 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63  t_idx;..char *pc
1ca70 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
1ca80 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
1ca90 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44  sc_readers_e;..D
1caa0 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72  WORD pcsc_reader
1cab0 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  s_len;..LONG sca
1cac0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1cad0 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72  et;..size_t curr
1cae0 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e  _reader_len;..in
1caf0 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09  t slot_reset;...
1cb00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cb10 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1cb20 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
1cb30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1cb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cb50 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74  "Error. pulCount
1cb60 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1cb70 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1cb80 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1cb90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1cba0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1cbb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cbc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1cbd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1cbe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1cbf0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1cc00 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
1cc10 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1cc20 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1cc30 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1cc40 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1cc50 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1cc60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cc70 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1cc80 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1cc90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1cca0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1ccb0 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c  Clear list of sl
1ccc0 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73  ots */..slot_res
1ccd0 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c  et = 0;..if (pSl
1cce0 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28  otList) {...if (
1ccf0 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09  first_call) {...
1cd00 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b  .first_call = 0;
1cd10 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20  .....slot_reset 
1cd20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49  = 1;...}..../* I
1cd30 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f  f any of the slo
1cd40 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  ts have been res
1cd50 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c  et then purge al
1cd60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  l information an
1cd70 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f  d check again */
1cd80 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1cd90 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1cda0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1cdb0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1cdc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1cdd0 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1cde0 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1cdf0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1ce00 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63  nternal) {.....c
1ce10 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1ce20 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1ce30 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1ce40 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74  tive) {.....cont
1ce50 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1ce60 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1ce70 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72  currslot].slot_r
1ce80 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74  eset) {.....slot
1ce90 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09  _reset = 1;.....
1cea0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1ceb0 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1cec0 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
1ced0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
1cee0 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
1cef0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
1cf00 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1cf10 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1cf20 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1cf30 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70  tually being sup
1cf40 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
1cf50 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  ormation */....c
1cf60 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
1cf70 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
1cf80 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1cf90 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1cfa0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1cfb0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1cfc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1cfd0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1cfe0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1cff0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1d000 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09  nternal) {......
1d010 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
1d020 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d030 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d040 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09  pcsc_reader) {..
1d050 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1d060 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d070 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
1d080 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1d090 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1d0a0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1d0b0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61  ...}......if (ca
1d0c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d0d0 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
1d0e0 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1d0f0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1d100 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63  abel);.......cac
1d110 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1d120 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1d130 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
1d140 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1d150 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
1d160 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
1d170 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  ......}..}.../* 
1d180 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f  Determine list o
1d190 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63  f readers */..pc
1d1a0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
1d1b0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
1d1c0 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73  nect();..if (pcs
1d1d0 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
1d1e0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
1d1f0 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1d200 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e  BUG_PRINTF("Conn
1d210 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1d220 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67  failed, assuming
1d230 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09   no slots");....
1d240 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1d250 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63  .} else {...pcsc
1d260 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30  _readers_len = 0
1d270 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
1d280 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
1d290 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
1d2a0 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
1d2b0 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  e, NULL, NULL, &
1d2c0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1d2d0 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
1d2e0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
1d2f0 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f  == SCARD_F_COMM_
1d300 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b  ERROR) {....CACK
1d310 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d320 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73  "Error. SCardLis
1d330 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75 72  tReaders() retur
1d340 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d  ned SCARD_F_COMM
1d350 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67  _ERROR, assuming
1d360 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50   Connection to P
1d370 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20  C/SC went away. 
1d380 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b  Reconnecting.");
1d390 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  .....cackey_pcsc
1d3a0 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  _disconnect();..
1d3b0 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  ..cackey_pcsc_co
1d3c0 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43  nnect();.....CAC
1d3d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d3e0 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69  ("Trying SCardLi
1d3f0 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61 69  stReaders() agai
1d400 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69  n");....scard_li
1d410 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1d420 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1d430 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1d440 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1d450 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1d460 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  len);...}....if 
1d470 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1d480 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
1d490 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73  S_SUCCESS && pcs
1d4a0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d  c_readers_len !=
1d4b0 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65   0) {....pcsc_re
1d4c0 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70  aders = malloc(p
1d4d0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
1d4e0 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  ;....pcsc_reader
1d4f0 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_s = pcsc_reade
1d500 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69  rs;.....scard_li
1d510 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1d520 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1d530 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1d540 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63  ndle, NULL, pcsc
1d550 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f  _readers, &pcsc_
1d560 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
1d570 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1d580 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1d590 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
1d5a0 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
1d5b0 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_e = pcsc_reade
1d5c0 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72  rs + pcsc_reader
1d5d0 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53  s_len;....../* S
1d5e0 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49  tart with Slot I
1d5f0 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  D 1, to avoid a 
1d600 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48  bug in GDM on RH
1d610 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67  EL */...../* Bug
1d620 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
1d630 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
1d640 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
1d650 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
1d660 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b  ...currslot = 1;
1d670 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20  .....slot_count 
1d680 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 0;.....while (
1d690 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
1d6a0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
1d6b0 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65  ....../* Find ne
1d6c0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  xt available slo
1d6d0 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b  t */......for (;
1d6e0 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1d6f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d700 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d710 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1d720 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
1d730 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1d740 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1d750 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62  tive) {........b
1d760 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
1d770 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f  ...}.......curr_
1d780 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72  reader_len = str
1d790 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73  len(pcsc_readers
1d7a0 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63  );.......if ((pc
1d7b0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72  sc_readers + cur
1d7c0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20  r_reader_len) > 
1d7d0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
1d7e0 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
1d7f0 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
1d800 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
1d810 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72  == 0) {.......br
1d820 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
1d830 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
1d840 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1d850 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1d860 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1d870 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ))) {.......CACK
1d880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d890 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64  "Found more read
1d8a0 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61  ers than slots a
1d8b0 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b  re available!");
1d8c0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1d8d0 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b  ....}.......CACK
1d8e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d8f0 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25  "Found reader: %
1d900 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  s", pcsc_readers
1d910 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79  );......./* Only
1d920 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
1d930 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
1d940 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
1d950 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20  ng asked supply 
1d960 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  the slot informa
1d970 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20  tion */......if 
1d980 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09  (pSlotList) {...
1d990 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1d9a0 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63 61 63  et) {........cac
1d9b0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1d9c0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
1d9d0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d9e0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e  ots[currslot].in
1d9f0 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09  ternal = 0;.....
1da00 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1da10 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1da20 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70  eader = strdup(p
1da30 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09  csc_readers);...
1da40 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1da50 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1da60 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
1da70 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
1da80 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1da90 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
1daa0 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
1dab0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1dac0 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74  rrslot].transact
1dad0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
1dae0 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
1daf0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1db00 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1db10 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1db20 49 52 45 44 3b 0a 09 09 09 09 09 09 09 63 61 63  IRED;........cac
1db30 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1db40 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1db50 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  ;.........cackey
1db60 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
1db70 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
1db80 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09  urrslot]);......
1db90 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
1dba0 0a 09 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69  ......./* Artifi
1dbb0 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20  cially increase 
1dbc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63  the number of ac
1dbd0 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68  tive slots by wh
1dbe0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  at will become a
1dbf0 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73  ctive */.......s
1dc00 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
1dc10 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
1dc20 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
1dc30 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
1dc40 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
1dc50 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28  ....}......for (
1dc60 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1dc70 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1dc80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1dc90 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1dca0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1dcb0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  lot++) {......if
1dcc0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1dcd0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1dce0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1dcf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1dd00 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
1dd10 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1dd20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
1dd30 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75  ........slot_cou
1dd40 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  nt++;......}....
1dd50 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
1dd60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dd70 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63  PRINTF("Second c
1dd80 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
1dd90 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
1dda0 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
1ddb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
1ddc0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
1ddd0 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
1dde0 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
1ddf0 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
1de00 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09  rs_ret);....}...
1de10 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 64  ..free(pcsc_read
1de20 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65  ers_s);...} else
1de30 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1de40 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74  UG_PRINTF("First
1de50 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
1de60 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
1de70 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
1de80 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
1de90 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
1dea0 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
1deb0 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
1dec0 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
1ded0 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  ders_ret);...}..
1dee0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1def0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1df00 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1df10 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1df20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1df30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1df40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1df50 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1df60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1df70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1df80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c  R);..}...if (pSl
1df90 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  otList == NULL) 
1dfa0 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1dfb0 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43  slot_count;....C
1dfc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dfd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1dfe0 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
1dff0 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62  d %lu readers, b
1e000 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49  ut not storing I
1e010 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  Ds (pSlotList ==
1e020 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c   NULL)", CKR_OK,
1e030 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1e040 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
1e050 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e060 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
1e070 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
1e080 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
1e090 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e0a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e0b0 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1e0c0 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1e0d0 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
1e0e0 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
1e0f0 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
1e100 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e110 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1e120 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1e130 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ALL");....return
1e140 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
1e150 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75  SMALL);...}...mu
1e160 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e170 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1e180 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e190 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1e1a0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1e1b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e1c0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1e1d0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e1e0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e1f0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1e200 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  lot_idx = 0;..fo
1e210 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1e220 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69   (currslot < (si
1e230 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e240 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e250 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20  ey_slots[0]))); 
1e260 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1e270 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1e280 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1e290 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  ve) {....continu
1e2a0 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  e;...}....if (sl
1e2b0 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29  ot_idx >= count)
1e2c0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1e2d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e2e0 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1e2f0 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1e300 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20  t we just tried 
1e310 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1e320 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e  %lu index -- ign
1e330 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73  oring", count, s
1e340 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f  lot_idx);.....co
1e350 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70  ntinue;...}....p
1e360 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64  SlotList[slot_id
1e370 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09  x] = currslot;..
1e380 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  .slot_idx++;..}.
1e390 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1e3a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1e3b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1e3c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1e3d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1e3e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e3f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1e400 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1e410 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e420 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1e430 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1e440 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
1e450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e460 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e470 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
1e480 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
1e490 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1e4a0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1e4b0 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
1e4c0 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
1e4d0 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
1e4e0 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
1e4f0 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
1e500 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
1e510 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1e520 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1e530 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
1e540 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1e550 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
1e560 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1e570 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
1e580 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1e590 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
1e5a0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1e5b0 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
1e5c0 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
1e5d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1e5e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1e5f0 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1e600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e610 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1e620 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1e630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1e640 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1e650 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1e660 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1e670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e680 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1e690 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1e6a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1e6b0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1e6c0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1e6d0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1e6e0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1e6f0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1e700 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1e710 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1e720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e730 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1e740 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1e750 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1e760 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1e770 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1e780 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1e790 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1e7a0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1e7b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1e7c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e7d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1e7e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1e7f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e800 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1e810 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1e820 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1e830 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1e840 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1e850 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1e860 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1e870 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e880 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1e890 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1e8a0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1e8b0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1e8c0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1e8d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e8e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e8f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e900 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1e910 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66  );..}...pInfo->f
1e920 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c  lags = CKF_HW_SL
1e930 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  OT;...if (!cacke
1e940 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1e950 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49  internal) {...pI
1e960 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
1e970 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49  F_REMOVABLE_DEVI
1e980 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  CE;..}...if (cac
1e990 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1e9a0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1e9b0 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
1e9c0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1e9d0 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
1e9e0 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1e9f0 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
1ea00 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
1ea10 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
1ea20 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1ea30 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
1ea40 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
1ea50 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1ea60 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
1ea70 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
1ea80 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
1ea90 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1eaa0 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
1eab0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1eac0 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
1ead0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
1eae0 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
1eaf0 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
1eb00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1eb10 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1eb20 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1eb30 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1eb40 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1eb50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1eb60 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1eb70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1eb80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1eb90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1eba0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
1ebb0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
1ebc0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1ebd0 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1ebe0 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
1ebf0 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
1ec00 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
1ec10 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
1ec20 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
1ec30 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1ec40 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1ec50 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1ec60 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1ec70 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
1ec80 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1ec90 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1eca0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1ecb0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1ecc0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1ecd0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1ece0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1ecf0 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1ed00 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1ed10 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1ed20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1ed30 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1ed40 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1ed50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ed60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1ed70 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1ed80 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1ed90 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1eda0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1edb0 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
1edc0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1edd0 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
1ede0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1edf0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1ee00 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
1ee10 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
1ee20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
1ee30 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1ee40 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
1ee50 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
1ee60 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
1ee70 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
1ee80 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
1ee90 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
1eea0 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
1eeb0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
1eec0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1eed0 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
1eee0 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
1eef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1ef00 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
1ef10 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
1ef20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1ef30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1ef40 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1ef50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ef60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1ef70 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1ef80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1ef90 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1efa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1efb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1efc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1efd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1efe0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1eff0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f000 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f010 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1f020 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1f030 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1f040 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1f050 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f060 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1f070 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f080 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1f090 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1f0a0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1f0b0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1f0c0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1f0d0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1f0e0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1f0f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1f100 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1f110 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f120 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f130 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f150 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1f160 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1f170 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1f180 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1f190 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1f1a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1f1b0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1f1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f1d0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1f1e0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1f1f0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1f200 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1f210 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1f220 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f230 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f240 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f250 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1f260 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1f270 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
1f280 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1f290 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
1f2a0 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
1f2b0 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
1f2c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f2d0 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
1f2e0 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
1f2f0 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
1f300 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1f310 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1f320 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1f330 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
1f340 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
1f350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1f360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1f370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1f380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1f390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1f3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f3b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1f3c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1f3d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1f3e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1f3f0 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1f400 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
1f410 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
1f420 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1f430 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
1f440 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1f450 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
1f460 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
1f470 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1f480 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
1f490 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
1f4a0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1f4b0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
1f4c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f4d0 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
1f4e0 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
1f4f0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1f500 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
1f510 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
1f520 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
1f530 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1f540 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
1f550 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
1f560 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
1f570 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1f580 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
1f590 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
1f5a0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1f5b0 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
1f5c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f5d0 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
1f5e0 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
1f5f0 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
1f600 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
1f610 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1f620 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
1f630 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1f640 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
1f650 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1f660 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1f670 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1f680 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
1f690 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
1f6a0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
1f6b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f6c0 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
1f6d0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1f6e0 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
1f6f0 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
1f700 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
1f710 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
1f720 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
1f730 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
1f740 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
1f750 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
1f760 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1f770 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1f780 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1f790 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1f7a0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1f7b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1f7c0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1f7d0 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
1f7e0 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
1f7f0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
1f800 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1f810 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
1f820 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1f830 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
1f840 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
1f850 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1f860 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
1f870 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1f880 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
1f890 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1f8a0 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
1f8b0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
1f8c0 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
1f8d0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1f8e0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1f8f0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1f900 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1f910 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1f920 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1f930 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1f940 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1f950 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1f960 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1f970 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1f980 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1f990 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1f9a0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1f9b0 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
1f9c0 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
1f9d0 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1f9e0 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
1f9f0 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
1fa00 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1fa10 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28  en_flags;...if (
1fa20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1fa30 6e 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd != NULL) {...
1fa40 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20  pInfo->flags |= 
1fa50 43 4b 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55  CKF_PROTECTED_AU
1fa60 54 48 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54  THENTICATION_PAT
1fa70 48 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 75  H;..}...pInfo->u
1fa80 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74  lMaxSessionCount
1fa90 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   = (sizeof(cacke
1faa0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1fab0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1fac0 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09  ions[0])) - 1;..
1fad0 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e  pInfo->ulSession
1fae0 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
1faf0 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1fb00 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
1fb10 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  xRwSessionCount 
1fb20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52  = 0;..pInfo->ulR
1fb30 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
1fb40 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1fb50 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1fb60 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20  fo->ulMaxPinLen 
1fb70 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75  = 128;..pInfo->u
1fb80 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a  lMinPinLen = 0;.
1fb90 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50  .pInfo->ulTotalP
1fba0 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
1fbb0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1fbc0 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1fbd0 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65  ->ulFreePublicMe
1fbe0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1fbf0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1fc00 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74  N;..pInfo->ulTot
1fc10 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20  alPrivateMemory 
1fc20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1fc30 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1fc40 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76  Info->ulFreePriv
1fc50 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  ateMemory = CK_U
1fc60 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1fc70 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59  MATION;...CACKEY
1fc80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1fc90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1fca0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1fcb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1fcc0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1fcd0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1fce0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
1fcf0 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67  t)(CK_FLAGS flag
1fd00 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  s, CK_SLOT_ID_PT
1fd10 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f  R pSlotID, CK_VO
1fd20 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64  ID_PTR pReserved
1fd30 29 20 7b 0a 09 53 43 41 52 44 5f 52 45 41 44 45  ) {..SCARD_READE
1fd40 52 53 54 41 54 45 20 72 65 61 64 65 72 5f 73 74  RSTATE reader_st
1fd50 61 74 65 73 5b 28 73 69 7a 65 6f 66 28 63 61 63  ates[(sizeof(cac
1fd60 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1fd70 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1fd80 5b 30 5d 29 29 20 2b 20 31 5d 3b 0a 09 53 43 41  [0])) + 1];..SCA
1fd90 52 44 43 4f 4e 54 45 58 54 20 70 63 73 63 5f 68  RDCONTEXT pcsc_h
1fda0 61 6e 64 6c 65 3b 0a 09 4c 4f 4e 47 20 73 63 61  andle;..LONG sca
1fdb0 72 64 5f 67 65 74 73 74 61 74 63 68 6e 67 5f 72  rd_getstatchng_r
1fdc0 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  et;..LONG scard_
1fdd0 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b  est_context_ret;
1fde0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1fdf0 73 6c 6f 74 20 2a 63 61 63 6b 65 79 5f 73 6c 6f  slot *cackey_slo
1fe00 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  t;..unsigned int
1fe10 20 63 75 72 72 73 6c 6f 74 2c 20 72 65 61 64 65   currslot, reade
1fe20 72 5f 73 74 61 74 65 5f 73 6c 6f 74 3b 0a 09 69  r_state_slot;..i
1fe30 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  nt pcsc_connect_
1fe40 72 65 74 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 63  ret;..int slot_c
1fe50 68 61 6e 67 65 64 3b 0a 0a 09 43 41 43 4b 45 59  hanged;...CACKEY
1fe60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1fe70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1fe80 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
1fe90 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1fea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1feb0 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
1fec0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
1fed0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1fee0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1fef0 69 66 20 28 70 53 6c 6f 74 49 44 20 3d 3d 20 4e  if (pSlotID == N
1ff00 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1ff10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ff20 72 6f 72 2e 20 70 53 6c 6f 74 49 44 20 69 73 20  ror. pSlotID is 
1ff30 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ff40 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ff50 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ff60 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ff70 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ff80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ff90 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ffa0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ffb0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ffc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ffd0 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
1ffe0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
1fff0 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
20000 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
20010 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
20020 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
20030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20040 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
20050 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
20060 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
20070 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
20080 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
20090 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 66 6f 72  ERROR);..}...for
200a0 20 28 72 65 61 64 65 72 5f 73 74 61 74 65 5f 73   (reader_state_s
200b0 6c 6f 74 20 3d 20 63 75 72 72 73 6c 6f 74 20 3d  lot = currslot =
200c0 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   0; currslot < (
200d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
200e0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
200f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
20100 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
20110 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
20120 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
20130 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69  rnal) {....conti
20140 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  nue;...}....if (
20150 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
20160 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 3d  rslot].active ==
20170 20 30 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75   0) {....continu
20180 65 3b 0a 09 09 7d 0a 0a 09 09 72 65 61 64 65 72  e;...}....reader
20190 5f 73 74 61 74 65 73 5b 72 65 61 64 65 72 5f 73  _states[reader_s
201a0 74 61 74 65 5f 73 6c 6f 74 5d 2e 73 7a 52 65 61  tate_slot].szRea
201b0 64 65 72 20 3d 20 63 61 63 6b 65 79 5f 73 6c 6f  der = cackey_slo
201c0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
201d0 63 5f 72 65 61 64 65 72 3b 0a 09 09 72 65 61 64  c_reader;...read
201e0 65 72 5f 73 74 61 74 65 73 5b 72 65 61 64 65 72  er_states[reader
201f0 5f 73 74 61 74 65 5f 73 6c 6f 74 5d 2e 70 76 55  _state_slot].pvU
20200 73 65 72 44 61 74 61 20 3d 20 26 63 61 63 6b 65  serData = &cacke
20210 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
20220 5d 3b 0a 0a 09 09 69 66 20 28 28 66 6c 61 67 73  ];....if ((flags
20230 20 26 20 43 4b 46 5f 44 4f 4e 54 5f 42 4c 4f 43   & CKF_DONT_BLOC
20240 4b 29 20 3d 3d 20 43 4b 46 5f 44 4f 4e 54 5f 42  K) == CKF_DONT_B
20250 4c 4f 43 4b 29 20 7b 0a 09 09 09 72 65 61 64 65  LOCK) {....reade
20260 72 5f 73 74 61 74 65 73 5b 72 65 61 64 65 72 5f  r_states[reader_
20270 73 74 61 74 65 5f 73 6c 6f 74 5d 2e 64 77 43 75  state_slot].dwCu
20280 72 72 65 6e 74 53 74 61 74 65 20 3d 20 53 43 41  rrentState = SCA
20290 52 44 5f 53 54 41 54 45 5f 55 4e 41 57 41 52 45  RD_STATE_UNAWARE
202a0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
202b0 72 65 61 64 65 72 5f 73 74 61 74 65 73 5b 72 65  reader_states[re
202c0 61 64 65 72 5f 73 74 61 74 65 5f 73 6c 6f 74 5d  ader_state_slot]
202d0 2e 64 77 43 75 72 72 65 6e 74 53 74 61 74 65 20  .dwCurrentState 
202e0 3d 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  = cackey_slots[c
202f0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 73 74  urrslot].pcsc_st
20300 61 74 65 3b 0a 09 09 7d 0a 0a 09 09 72 65 61 64  ate;...}....read
20310 65 72 5f 73 74 61 74 65 5f 73 6c 6f 74 2b 2b 3b  er_state_slot++;
20320 0a 09 7d 0a 0a 09 72 65 61 64 65 72 5f 73 74 61  ..}...reader_sta
20330 74 65 73 5b 72 65 61 64 65 72 5f 73 74 61 74 65  tes[reader_state
20340 5f 73 6c 6f 74 5d 2e 73 7a 52 65 61 64 65 72 20  _slot].szReader 
20350 3d 20 22 5c 5c 5c 5c 3f 50 6e 50 3f 5c 5c 4e 6f  = "\\\\?PnP?\\No
20360 74 69 66 69 63 61 74 69 6f 6e 22 3b 0a 09 72 65  tification";..re
20370 61 64 65 72 5f 73 74 61 74 65 73 5b 72 65 61 64  ader_states[read
20380 65 72 5f 73 74 61 74 65 5f 73 6c 6f 74 5d 2e 70  er_state_slot].p
20390 76 55 73 65 72 44 61 74 61 20 3d 20 4e 55 4c 4c  vUserData = NULL
203a0 3b 0a 09 72 65 61 64 65 72 5f 73 74 61 74 65 73  ;..reader_states
203b0 5b 72 65 61 64 65 72 5f 73 74 61 74 65 5f 73 6c  [reader_state_sl
203c0 6f 74 5d 2e 64 77 43 75 72 72 65 6e 74 53 74 61  ot].dwCurrentSta
203d0 74 65 20 3d 20 53 43 41 52 44 5f 53 54 41 54 45  te = SCARD_STATE
203e0 5f 55 4e 41 57 41 52 45 3b 0a 09 72 65 61 64 65  _UNAWARE;..reade
203f0 72 5f 73 74 61 74 65 5f 73 6c 6f 74 2b 2b 3b 0a  r_state_slot++;.
20400 0a 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
20410 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
20420 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
20430 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
20440 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
20450 26 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  &pcsc_handle);..
20460 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f  if (scard_est_co
20470 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41  ntext_ret != SCA
20480 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
20490 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
204a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
204b0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
204c0 4f 52 20 28 25 69 29 20 62 65 63 61 75 73 65 20  OR (%i) because 
204d0 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
204e0 6e 74 65 78 74 20 66 61 69 6c 65 64 3a 20 25 6c  ntext failed: %l
204f0 78 22 2c 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  x", CKR_GENERAL_
20500 45 52 52 4f 52 2c 20 73 63 61 72 64 5f 65 73 74  ERROR, scard_est
20510 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
20520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
20530 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
20540 0a 09 73 63 61 72 64 5f 67 65 74 73 74 61 74 63  ..scard_getstatc
20550 68 6e 67 5f 72 65 74 20 3d 20 53 43 61 72 64 47  hng_ret = SCardG
20560 65 74 53 74 61 74 75 73 43 68 61 6e 67 65 28 70  etStatusChange(p
20570 63 73 63 5f 68 61 6e 64 6c 65 2c 20 49 4e 46 49  csc_handle, INFI
20580 4e 49 54 45 2c 20 72 65 61 64 65 72 5f 73 74 61  NITE, reader_sta
20590 74 65 73 2c 20 72 65 61 64 65 72 5f 73 74 61 74  tes, reader_stat
205a0 65 5f 73 6c 6f 74 29 3b 0a 0a 09 53 43 61 72 64  e_slot);...SCard
205b0 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28 70  ReleaseContext(p
205c0 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09 69  csc_handle);...i
205d0 66 20 28 73 63 61 72 64 5f 67 65 74 73 74 61 74  f (scard_getstat
205e0 63 68 6e 67 5f 72 65 74 20 21 3d 20 53 43 41 52  chng_ret != SCAR
205f0 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
20600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20610 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
20620 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
20630 52 20 28 25 69 29 20 62 65 63 61 75 73 65 20 53  R (%i) because S
20640 43 61 72 64 47 65 74 53 74 61 74 75 73 43 68 61  CardGetStatusCha
20650 6e 67 65 20 66 61 69 6c 65 64 3a 20 25 6c 78 22  nge failed: %lx"
20660 2c 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  , CKR_GENERAL_ER
20670 52 4f 52 2c 20 73 63 61 72 64 5f 67 65 74 73 74  ROR, scard_getst
20680 61 74 63 68 6e 67 5f 72 65 74 29 3b 0a 0a 09 09  atchng_ret);....
20690 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
206a0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
206b0 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
206c0 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 72 65  0; currslot < re
206d0 61 64 65 72 5f 73 74 61 74 65 5f 73 6c 6f 74 3b  ader_state_slot;
206e0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
206f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20700 49 4e 54 46 28 22 5b 73 6c 6f 74 20 3d 20 25 75  INTF("[slot = %u
20710 5d 20 43 75 72 72 65 6e 74 53 74 61 74 65 20 3d  ] CurrentState =
20720 20 25 6c 78 2c 20 45 76 65 6e 74 53 74 61 74 65   %lx, EventState
20730 20 3d 20 25 6c 78 22 2c 0a 09 09 20 20 20 20 63   = %lx",...    c
20740 75 72 72 73 6c 6f 74 2c 0a 09 09 20 20 20 20 72  urrslot,...    r
20750 65 61 64 65 72 5f 73 74 61 74 65 73 5b 63 75 72  eader_states[cur
20760 72 73 6c 6f 74 5d 2e 64 77 43 75 72 72 65 6e 74  rslot].dwCurrent
20770 53 74 61 74 65 20 26 20 30 78 66 66 66 66 2c 0a  State & 0xffff,.
20780 09 09 20 20 20 20 72 65 61 64 65 72 5f 73 74 61  ..    reader_sta
20790 74 65 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 64 77  tes[currslot].dw
207a0 45 76 65 6e 74 53 74 61 74 65 20 26 20 30 78 66  EventState & 0xf
207b0 66 66 66 0a 09 09 29 3b 0a 0a 09 09 63 61 63 6b  fff...);....cack
207c0 65 79 5f 73 6c 6f 74 20 3d 20 28 73 74 72 75 63  ey_slot = (struc
207d0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 29  t cackey_slot *)
207e0 20 72 65 61 64 65 72 5f 73 74 61 74 65 73 5b 63   reader_states[c
207f0 75 72 72 73 6c 6f 74 5d 2e 70 76 55 73 65 72 44  urrslot].pvUserD
20800 61 74 61 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  ata;....if (cack
20810 65 79 5f 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29  ey_slot == NULL)
20820 20 7b 0a 09 09 09 2f 2a 20 58 58 58 3a 20 54 4f   {..../* XXX: TO
20830 44 4f 3a 20 53 6f 6d 65 6f 6e 65 20 70 6c 75 67  DO: Someone plug
20840 67 65 64 20 69 6e 20 61 20 6e 65 77 20 73 6c 6f  ged in a new slo
20850 74 20 2a 2f 0a 09 09 09 63 6f 6e 74 69 6e 75 65  t */....continue
20860 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 5f 63 68  ;...}....slot_ch
20870 61 6e 67 65 64 20 3d 20 30 3b 0a 0a 09 09 69 66  anged = 0;....if
20880 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 44   ((flags & CKF_D
20890 4f 4e 54 5f 42 4c 4f 43 4b 29 20 3d 3d 20 43 4b  ONT_BLOCK) == CK
208a0 46 5f 44 4f 4e 54 5f 42 4c 4f 43 4b 29 20 7b 0a  F_DONT_BLOCK) {.
208b0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
208c0 6f 74 2d 3e 70 63 73 63 5f 73 74 61 74 65 20 21  ot->pcsc_state !
208d0 3d 20 72 65 61 64 65 72 5f 73 74 61 74 65 73 5b  = reader_states[
208e0 63 75 72 72 73 6c 6f 74 5d 2e 64 77 45 76 65 6e  currslot].dwEven
208f0 74 53 74 61 74 65 29 20 7b 0a 09 09 09 09 73 6c  tState) {.....sl
20900 6f 74 5f 63 68 61 6e 67 65 64 20 3d 20 31 3b 0a  ot_changed = 1;.
20910 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
20920 09 09 09 69 66 20 28 72 65 61 64 65 72 5f 73 74  ...if (reader_st
20930 61 74 65 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 64  ates[currslot].d
20940 77 43 75 72 72 65 6e 74 53 74 61 74 65 20 21 3d  wCurrentState !=
20950 20 72 65 61 64 65 72 5f 73 74 61 74 65 73 5b 63   reader_states[c
20960 75 72 72 73 6c 6f 74 5d 2e 64 77 45 76 65 6e 74  urrslot].dwEvent
20970 53 74 61 74 65 29 20 7b 0a 09 09 09 09 73 6c 6f  State) {.....slo
20980 74 5f 63 68 61 6e 67 65 64 20 3d 20 31 3b 0a 09  t_changed = 1;..
20990 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
209a0 6c 6f 74 5f 63 68 61 6e 67 65 64 20 3d 3d 20 30  lot_changed == 0
209b0 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
209c0 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
209d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
209e0 75 72 6e 69 6e 67 20 73 6c 6f 74 20 63 68 61 6e  urning slot chan
209f0 67 65 64 3a 20 25 75 22 2c 20 28 75 6e 73 69 67  ged: %u", (unsig
20a00 6e 65 64 20 69 6e 74 29 20 63 61 63 6b 65 79 5f  ned int) cackey_
20a10 73 6c 6f 74 2d 3e 69 64 29 3b 0a 0a 09 09 63 61  slot->id);....ca
20a20 63 6b 65 79 5f 73 6c 6f 74 2d 3e 70 63 73 63 5f  ckey_slot->pcsc_
20a30 73 74 61 74 65 20 3d 20 72 65 61 64 65 72 5f 73  state = reader_s
20a40 74 61 74 65 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  tates[currslot].
20a50 64 77 45 76 65 6e 74 53 74 61 74 65 3b 0a 09 09  dwEventState;...
20a60 2a 70 53 6c 6f 74 49 44 20 3d 20 28 43 4b 5f 53  *pSlotID = (CK_S
20a70 4c 4f 54 5f 49 44 29 20 63 61 63 6b 65 79 5f 73  LOT_ID) cackey_s
20a80 6c 6f 74 2d 3e 69 64 3b 0a 0a 09 09 43 41 43 4b  lot->id;....CACK
20a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20aa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20ab0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20ac0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20ad0 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 28 66  OK);..}...if ((f
20ae0 6c 61 67 73 20 26 20 43 4b 46 5f 44 4f 4e 54 5f  lags & CKF_DONT_
20af0 42 4c 4f 43 4b 29 20 21 3d 20 43 4b 46 5f 44 4f  BLOCK) != CKF_DO
20b00 4e 54 5f 42 4c 4f 43 4b 29 20 7b 0a 09 09 43 41  NT_BLOCK) {...CA
20b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20b20 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
20b30 5f 4e 4f 5f 45 56 45 4e 54 20 28 25 69 29 2c 20  _NO_EVENT (%i), 
20b40 62 75 74 20 61 73 6b 65 64 20 74 6f 20 62 6c 6f  but asked to blo
20b50 63 6b 20 21 3f 20 42 55 47 20 45 4e 43 4f 55 4e  ck !? BUG ENCOUN
20b60 54 45 52 45 44 2e 22 2c 20 43 4b 52 5f 4e 4f 5f  TERED.", CKR_NO_
20b70 45 56 45 4e 54 29 3b 0a 09 7d 20 65 6c 73 65 20  EVENT);..} else 
20b80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20b90 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20ba0 6e 67 20 43 4b 52 5f 4e 4f 5f 45 56 45 4e 54 20  ng CKR_NO_EVENT 
20bb0 28 25 69 29 22 2c 20 43 4b 52 5f 4e 4f 5f 45 56  (%i)", CKR_NO_EV
20bc0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  ENT);..}...retur
20bd0 6e 28 43 4b 52 5f 4e 4f 5f 45 56 45 4e 54 29 3b  n(CKR_NO_EVENT);
20be0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20bf0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20c00 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
20c10 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
20c20 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  tID, CK_MECHANIS
20c30 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68  M_TYPE_PTR pMech
20c40 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c  anismList, CK_UL
20c50 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
20c60 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
20c70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20c80 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
20c90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
20ca0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20cb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20cc0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
20cd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20ce0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
20cf0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
20d00 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20  ...if (pulCount 
20d10 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
20d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d30 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75  ("Error.  pulCou
20d40 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
20d50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20d60 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20d70 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
20d80 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
20d90 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b  ..*pulCount = 1;
20da0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
20db0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20dc0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20dd0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
20de0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
20df0 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20  ..if (*pulCount 
20e00 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  < 1) {...CACKEY_
20e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20e20 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f  ror.  Buffer too
20e30 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65   small.");....re
20e40 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
20e50 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a  TOO_SMALL);..}..
20e60 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b  .pMechanismList[
20e70 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  0] = CKM_RSA_PKC
20e80 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  S;..*pulCount = 
20e90 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
20ea0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20eb0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
20ec0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
20ed0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
20ee0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20ef0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
20f00 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b  echanismInfo)(CK
20f10 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
20f20 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
20f30 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48  PE type, CK_MECH
20f40 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70  ANISM_INFO_PTR p
20f50 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74  Info) {..int mut
20f60 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
20f70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20f80 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
20f90 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c  f (pInfo == NULL
20fa0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20fb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20fc0 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e  . pInfo is NULL.
20fd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20fe0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
20ff0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
21000 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
21010 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21020 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21030 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
21040 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21050 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
21060 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
21070 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
21080 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
21090 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
210a0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
210b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
210c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
210d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
210e0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
210f0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
21100 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
21110 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
21120 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21130 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
21140 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
21150 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21160 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
21170 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21180 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
211a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
211b0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
211c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
211d0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
211e0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
211f0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
21200 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
21210 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21220 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
21230 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
21240 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
21250 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
21260 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
21270 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21280 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21290 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
212a0 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
212b0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
212c0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
212d0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
212e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
212f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21300 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21320 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
21330 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21350 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21360 0a 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20  ..switch (type) 
21370 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
21380 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d  _PKCS:....pInfo-
21390 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20  >ulMinKeySize = 
213a0 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75  512;....pInfo->u
213b0 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31  lMaxKeySize = 81
213c0 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c  92;....pInfo->fl
213d0 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43  ags = CKF_HW | C
213e0 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46  KF_ENCRYPT | CKF
213f0 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53  _DECRYPT | CKF_S
21400 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59  IGN | CKF_VERIFY
21410 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  ;....break;..}..
21420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21430 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
21440 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
21450 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
21460 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57  CKR_OK);.}../* W
21470 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
21480 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
21490 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
214a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
214b0 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49  Token)(CK_SLOT_I
214c0 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46  D slotID, CK_UTF
214d0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
214e0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
214f0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
21500 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41  TR pLabel) {..CA
21510 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21520 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21530 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21540 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21560 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21570 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21580 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21590 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
215a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
215b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
215c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
215d0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
215e0 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
215f0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
21600 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
21610 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
21620 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
21630 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
21640 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
21650 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
21660 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21670 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53  InitPIN)(CK_SESS
21680 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21690 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  ion, CK_UTF8CHAR
216a0 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c  _PTR pPin, CK_UL
216b0 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a  ONG ulPinLen) {.
216c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
216d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
216e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
216f0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21700 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21710 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21720 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21730 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21740 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21750 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
21760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21770 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
21780 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
21790 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43  OTECTED (%i)", C
217a0 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50  KR_TOKEN_WRITE_P
217b0 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74  ROTECTED);...ret
217c0 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  urn(CKR_TOKEN_WR
217d0 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
217e0 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
217f0 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
21800 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
21810 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
21820 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45   C_SetPIN)(CK_SE
21830 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21840 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
21850 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20  AR_PTR pOldPin, 
21860 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69  CK_ULONG ulOldPi
21870 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  nLen, CK_UTF8CHA
21880 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43  R_PTR pNewPin, C
21890 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e  K_ULONG ulNewPin
218a0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
218b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
218c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
218d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
218e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
218f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21900 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
21910 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
21920 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
21930 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
21940 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21950 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21960 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21970 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21980 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21990 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
219a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
219b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
219c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
219d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
219e0 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73  CK_RV, C_OpenSes
219f0 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  sion)(CK_SLOT_ID
21a00 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47   slotID, CK_FLAG
21a10 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44  S flags, CK_VOID
21a20 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f  _PTR pApplicatio
21a30 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74  n, CK_NOTIFY not
21a40 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify, CK_SESSION_
21a50 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73  HANDLE_PTR phSes
21a60 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  sion) {..unsigne
21a70 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74  d long idx;..int
21a80 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
21a90 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f  int found_sessio
21aa0 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  n = 0;...CACKEY_
21ab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
21ac0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
21ad0 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49  flags & CKF_SERI
21ae0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43  AL_SESSION) != C
21af0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
21b00 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b  N) {...return(CK
21b10 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c  R_SESSION_PARALL
21b20 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  EL_NOT_SUPPORTED
21b30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
21b40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
21b50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21b60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21b70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
21b80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21b90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
21ba0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
21bb0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
21bc0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
21bd0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21be0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
21bf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
21c00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21c10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21c20 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
21c30 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
21c40 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
21c50 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
21c60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21c70 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
21c80 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21c90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21ca0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21cb0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21cc0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21cd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21ce0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21cf0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
21d00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21d10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21d20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
21d30 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
21d40 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
21d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21d70 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21d80 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
21d90 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
21da0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
21db0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21dc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21dd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21de0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21df0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  NVALID);..}.../*
21e00 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
21e10 20 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c   card is actuall
21e20 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a  y in the slot. *
21e30 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b  /../* XXX: Check
21e40 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
21e50 69 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43  is is in the PKC
21e60 53 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69  S#11 specificati
21e70 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65  on */..if (cacke
21e80 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
21e90 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
21ea0 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59  otID]) != CACKEY
21eb0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
21ec0 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
21ed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21ee0 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20  rror.  Card not 
21ef0 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e  present.  Return
21f00 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  ing CKR_DEVICE_R
21f10 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63  EMOVED");....cac
21f20 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21f30 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21f40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21f50 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b  DEVICE_REMOVED);
21f60 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d  ..}...for (idx =
21f70 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f   1; idx < (sizeo
21f80 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21f90 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
21fa0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
21fb0 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
21fc0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21fd0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b  s[idx].active) {
21fe0 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f  ....found_sessio
21ff0 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65  n = 1;.....*phSe
22000 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09  ssion = idx;....
22010 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22020 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31  [idx].active = 1
22030 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
22040 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44  ions[idx].slotID
22050 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61   = slotID;....ca
22060 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
22070 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52  x].state = CKS_R
22080 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e  O_PUBLIC_SESSION
22090 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
220a0 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20  ions[idx].flags 
220b0 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b  = flags;....cack
220c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
220d0 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  .ulDeviceError =
220e0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
220f0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70  ssions[idx].pApp
22100 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c  lication = pAppl
22110 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b  ication;....cack
22120 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
22130 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79  .Notify = notify
22140 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
22150 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
22160 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
22170 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22180 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
22190 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09  _count = 0;.....
221a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
221b0 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  idx].search_acti
221c0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
221d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
221e0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
221f0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
22200 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79  sions[idx].decry
22210 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
22220 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
22230 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
22240 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
22250 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
22260 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22270 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
22280 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74  ons[idx].identit
22290 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09  ies_count);.....
222a0 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
222b0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
222c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
222d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
222e0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
222f0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
22300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
22320 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
22330 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22340 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22350 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64  ..}...if (!found
22360 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41  _session) {...CA
22370 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22380 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22390 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28  _SESSION_COUNT (
223a0 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f  %i)", CKR_SESSIO
223b0 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74  N_COUNT);....ret
223c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
223d0 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  COUNT);..}...CAC
223e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
223f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22400 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
22410 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22420 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
22430 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22440 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  , C_CloseSession
22450 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22460 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
22470 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
22480 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
22490 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
224a0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
224b0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
224c0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
224d0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
224e0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
224f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22500 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22510 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22520 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
22530 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
22540 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
22550 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
22560 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
22570 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
22580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22590 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
225a0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
225b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
225c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
225d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
225e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
225f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
22600 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22610 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22620 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22630 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22640 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
22650 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22660 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22670 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22680 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
22690 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
226a0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
226b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
226c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
226d0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
226e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
226f0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
22700 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
22710 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
22720 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
22730 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
22740 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22750 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  on].active = 0;.
22760 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65  .cackey_free_ide
22770 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73  ntities(cackey_s
22780 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22790 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61  ].identities, ca
227a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
227b0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
227c0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74  es_count);...mut
227d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
227e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
227f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22800 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22810 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22820 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22830 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
22840 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
22850 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22860 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22870 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22890 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
228a0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
228b0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
228c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
228d0 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c  CK_RV, C_CloseAl
228e0 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c  lSessions)(CK_SL
228f0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a  OT_ID slotID) {.
22900 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09  .uint32_t idx;..
22910 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22920 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
22930 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22940 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22950 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22960 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22970 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22980 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22990 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
229a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
229b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
229c0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
229d0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
229e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
229f0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
22a00 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
22a10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22a20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22a30 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
22a40 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
22a50 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
22a60 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
22a70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
22a80 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
22a90 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22aa0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22ab0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
22ac0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
22ad0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
22ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22af0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22b00 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
22b10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22b20 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
22b30 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
22b40 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
22b50 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
22b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b70 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
22b80 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
22b90 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
22ba0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
22bb0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
22bc0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
22bd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22be0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
22bf0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
22c00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  ALID);..}...for 
22c10 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
22c20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
22c30 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
22c40 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
22c50 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
22c60 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
22c70 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
22c80 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63  ve) {....if (cac
22c90 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
22ca0 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74  ].slotID != slot
22cb0 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  ID) {.....contin
22cc0 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ue;....}.....cac
22cd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22ce0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22cf0 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  ;....C_CloseSess
22d00 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63  ion(idx);....cac
22d10 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
22d20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22d30 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ..}..}...mutex_r
22d40 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
22d50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22d60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
22d70 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
22d80 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
22d90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22da0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
22db0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
22dc0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22dd0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
22de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22df0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22e00 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
22e10 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
22e20 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
22e30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22e40 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49  V, C_GetSessionI
22e50 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nfo)(CK_SESSION_
22e60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22e70 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f   CK_SESSION_INFO
22e80 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
22e90 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
22ea0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22eb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
22ec0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
22ed0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
22ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22ef0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
22f00 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
22f10 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
22f20 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
22f30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
22f40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
22f50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22f60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
22f70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
22f80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
22f90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
22fa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
22fb0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
22fc0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
22fd0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
22fe0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
22ff0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
23000 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23010 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23020 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
23030 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
23040 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
23050 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
23060 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
23070 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23080 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
23090 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
230a0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
230b0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
230c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
230d0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
230e0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
230f0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
23100 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
23110 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23120 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
23130 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
23140 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23150 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
23160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23170 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
23180 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
23190 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
231a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
231b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
231c0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20  pInfo->slotID = 
231d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
231e0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
231f0 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20  ;..pInfo->state 
23200 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
23210 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74  s[hSession].stat
23220 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  e;..pInfo->flags
23230 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
23240 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61  ns[hSession].fla
23250 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65  gs;..pInfo->ulDe
23260 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b  viceError = cack
23270 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23280 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72  sion].ulDeviceEr
23290 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ror;...mutex_ret
232a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
232b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
232c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
232d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
232e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
232f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23300 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23310 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23320 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23330 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
23340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23350 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
23360 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
23370 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
23380 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
23390 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
233a0 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_GetOperationS
233b0 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
233c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
233d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
233e0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
233f0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
23400 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
23410 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23420 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23430 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23440 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23450 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23460 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23470 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23480 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23490 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
234a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
234b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
234c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
234d0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
234e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
234f0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23500 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23510 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23520 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23530 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23540 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23550 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69  RV, C_SetOperati
23560 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53  onState)(CK_SESS
23570 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23580 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
23590 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65   pOperationState
235a0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65  , CK_ULONG ulOpe
235b0 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20  rationStateLen, 
235c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
235d0 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c   hEncryptionKey,
235e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
235f0 45 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f  E hAuthenticatio
23600 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nKey) {..CACKEY_
23610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23620 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23630 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23640 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23660 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23670 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23680 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23690 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
236a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
236b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
236c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
236d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
236e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
236f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23700 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
23710 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23720 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23730 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23740 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29  (CK_RV, C_Login)
23750 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
23760 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
23770 55 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79  USER_TYPE userTy
23780 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  pe, CK_UTF8CHAR_
23790 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
237a0 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
237b0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
237c0 44 3b 0a 09 46 49 4c 45 20 2a 70 69 6e 66 64 3b  D;..FILE *pinfd;
237d0 0a 09 63 68 61 72 20 2a 70 69 6e 63 6d 64 2c 20  ..char *pincmd, 
237e0 70 69 6e 62 75 66 5b 36 34 5d 2c 20 2a 66 67 65  pinbuf[64], *fge
237f0 74 73 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  ts_ret;..int mut
23800 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
23810 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
23820 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b  ..int login_ret;
23830 0a 09 69 6e 74 20 70 63 6c 6f 73 65 5f 72 65 74  ..int pclose_ret
23840 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
23850 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
23860 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
23870 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
23880 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23890 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
238a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
238b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
238c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
238d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
238e0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
238f0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
23900 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
23910 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
23920 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
23930 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
23940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23950 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
23960 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
23970 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
23980 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
23990 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
239a0 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20  ...if (userType 
239b0 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09  != CKU_USER) {..
239c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
239d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65  INTF("Error.  We
239e0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53   only support US
239f0 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66  ER mode, asked f
23a00 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28  or %lu mode.", (
23a10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
23a20 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75  serType)....retu
23a30 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45  rn(CKR_USER_TYPE
23a40 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
23a50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
23a60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
23a70 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
23a80 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
23a90 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
23aa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23ab0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
23ac0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
23ad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23ae0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23af0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
23b00 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
23b10 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
23b20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23b30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23b40 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23b50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23b60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
23b70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
23b80 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
23b90 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
23ba0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
23bb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23bc0 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
23bd0 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
23be0 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
23bf0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23c00 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
23c10 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
23c20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23c30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23c40 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
23c50 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
23c60 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
23c70 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
23c80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23c90 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23ca0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
23cb0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
23cc0 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
23cd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23ce0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23cf0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23d00 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
23d10 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
23d20 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
23d30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23d40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23d50 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
23d60 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23d70 29 3b 0a 09 7d 0a 0a 09 70 69 6e 63 6d 64 20 3d  );..}...pincmd =
23d80 20 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d   cackey_pin_comm
23d90 61 6e 64 3b 0a 09 69 66 20 28 70 69 6e 63 6d 64  and;..if (pincmd
23da0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
23db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23dc0 46 28 22 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  F("CACKEY_PIN_CO
23dd0 4d 4d 41 4e 44 20 3d 20 25 73 22 2c 20 70 69 6e  MMAND = %s", pin
23de0 63 6d 64 29 3b 0a 0a 09 09 69 66 20 28 70 50 69  cmd);....if (pPi
23df0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  n != NULL) {....
23e00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23e10 4e 54 46 28 22 50 72 6f 74 65 63 74 65 64 20 61  NTF("Protected a
23e20 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 70 61  uthentication pa
23e30 74 68 20 69 6e 20 65 66 66 65 63 74 20 61 6e 64  th in effect and
23e40 20 50 49 4e 20 70 72 6f 76 69 64 65 64 20 21 3f   PIN provided !?
23e50 22 29 3b 0a 09 09 7d 0a 0a 09 09 70 69 6e 66 64  ");...}....pinfd
23e60 20 3d 20 70 6f 70 65 6e 28 70 69 6e 63 6d 64 2c   = popen(pincmd,
23e70 20 22 72 22 29 3b 0a 09 09 69 66 20 28 70 69 6e   "r");...if (pin
23e80 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
23e90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23ea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73  INTF("Error.  %s
23eb0 3a 20 55 6e 61 62 6c 65 20 74 6f 20 72 75 6e 22  : Unable to run"
23ec0 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 63  , pincmd);.....c
23ed0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
23ee0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
23ef0 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
23f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23f10 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
23f20 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
23f30 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
23f40 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
23f50 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
23f60 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
23f70 66 67 65 74 73 5f 72 65 74 20 3d 20 66 67 65 74  fgets_ret = fget
23f80 73 28 70 69 6e 62 75 66 2c 20 73 69 7a 65 6f 66  s(pinbuf, sizeof
23f90 28 70 69 6e 62 75 66 29 2c 20 70 69 6e 66 64 29  (pinbuf), pinfd)
23fa0 3b 0a 09 09 69 66 20 28 66 67 65 74 73 5f 72 65  ;...if (fgets_re
23fb0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  t == NULL) {....
23fc0 70 69 6e 62 75 66 5b 30 5d 20 3d 20 27 5c 30 27  pinbuf[0] = '\0'
23fd0 3b 0a 09 09 7d 0a 0a 09 09 70 63 6c 6f 73 65 5f  ;...}....pclose_
23fe0 72 65 74 20 3d 20 70 63 6c 6f 73 65 28 70 69 6e  ret = pclose(pin
23ff0 66 64 29 3b 0a 09 09 69 66 20 28 70 63 6c 6f 73  fd);...if (pclos
24000 65 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09  e_ret != 0) {...
24010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24020 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 25 73  INTF("Error.  %s
24030 3a 20 65 78 69 74 65 64 20 77 69 74 68 20 6e 6f  : exited with no
24040 6e 2d 7a 65 72 6f 20 73 74 61 74 75 73 20 6f 66  n-zero status of
24050 20 25 69 22 2c 20 70 69 6e 63 6d 64 2c 20 70 63   %i", pincmd, pc
24060 6c 6f 73 65 5f 72 65 74 29 3b 0a 0a 09 09 09 63  lose_ret);.....c
24070 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24080 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24090 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
240a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
240b0 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49  urning CKR_PIN_I
240c0 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20  NCORRECT (%i)", 
240d0 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e  (int) CKR_PIN_IN
240e0 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65  CORRECT);.....re
240f0 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43  turn(CKR_PIN_INC
24100 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09  ORRECT);...}....
24110 69 66 20 28 73 74 72 6c 65 6e 28 70 69 6e 62 75  if (strlen(pinbu
24120 66 29 20 3c 20 31 29 20 7b 0a 09 09 09 43 41 43  f) < 1) {....CAC
24130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24140 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 72 65  ("Error.  %s: re
24150 74 75 72 6e 65 64 20 6e 6f 20 64 61 74 61 22 2c  turned no data",
24160 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09 09 63 61   pincmd);.....ca
24170 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24180 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24190 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
241a0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
241b0 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e  rning CKR_PIN_IN
241c0 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c 20 28  CORRECT (%i)", (
241d0 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43  int) CKR_PIN_INC
241e0 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72 65 74  ORRECT);.....ret
241f0 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f  urn(CKR_PIN_INCO
24200 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 69  RRECT);...}....i
24210 66 20 28 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e  f (pinbuf[strlen
24220 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 3d  (pinbuf) - 1] ==
24230 20 27 5c 6e 27 29 20 7b 0a 09 09 09 70 69 6e 62   '\n') {....pinb
24240 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66  uf[strlen(pinbuf
24250 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b 0a 09  ) - 1] = '\0';..
24260 09 7d 0a 0a 09 09 70 50 69 6e 20 3d 20 28 43 4b  .}....pPin = (CK
24270 5f 55 54 46 38 43 48 41 52 5f 50 54 52 29 20 70  _UTF8CHAR_PTR) p
24280 69 6e 62 75 66 3b 0a 09 09 75 6c 50 69 6e 4c 65  inbuf;...ulPinLe
24290 6e 20 3d 20 73 74 72 6c 65 6e 28 70 69 6e 62 75  n = strlen(pinbu
242a0 66 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72  f);..}...login_r
242b0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  et = cackey_logi
242c0 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  n(&cackey_slots[
242d0 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75  slotID], pPin, u
242e0 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f  lPinLen, &tries_
242f0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20  remaining);..if 
24300 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41  (login_ret != CA
24310 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
24320 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
24330 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24340 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28  iglock);....if (
24350 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43  login_ret == CAC
24360 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45  KEY_PCSC_E_LOCKE
24370 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
24380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24390 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f  or.  Token is lo
243a0 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63  cked.");.....cac
243b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
243c0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
243d0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f   CKF_USER_PIN_LO
243e0 43 4b 45 44 3b 0a 0a 09 09 09 43 41 43 4b 45 59  CKED;.....CACKEY
243f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24400 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e  eturning CKR_PIN
24410 5f 4c 4f 43 4b 45 44 20 28 25 69 29 22 2c 20 28  _LOCKED (%i)", (
24420 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  int) CKR_PIN_LOC
24430 4b 45 44 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  KED);.....return
24440 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29  (CKR_PIN_LOCKED)
24450 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c  ;...} else if (l
24460 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
24470 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e  EY_PCSC_E_BADPIN
24480 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
24490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
244a0 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e  r.  Invalid PIN.
244b0 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
244c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
244d0 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
244e0 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c  USER_PIN_COUNT_L
244f0 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  OW;.....if (trie
24500 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31  s_remaining == 1
24510 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  ) {.....cackey_s
24520 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
24530 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
24540 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
24550 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43  RY;....}.....CAC
24560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24570 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24580 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28 25  PIN_INCORRECT (%
24590 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f 50  i)", (int) CKR_P
245a0 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 0a  IN_INCORRECT);..
245b0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
245c0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
245d0 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
245e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
245f0 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
24600 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
24610 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
24620 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
24630 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24640 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24650 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
24660 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
24670 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
24680 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
24690 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
246a0 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
246b0 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
246c0 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
246d0 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
246e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
246f0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
24700 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
24710 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
24720 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
24730 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24740 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24750 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24760 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24770 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24780 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
24790 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
247a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
247b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
247c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
247d0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
247e0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
247f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
24800 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
24810 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
24820 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f  ogout)(CK_SESSIO
24830 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24840 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
24850 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
24860 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
24870 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24880 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24890 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
248a0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
248b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
248c0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
248d0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
248e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
248f0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24900 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
24910 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
24920 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
24930 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
24940 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
24950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
24960 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
24970 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24980 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
24990 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
249a0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
249b0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
249c0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
249d0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
249e0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
249f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24a00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24a10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24a20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24a30 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
24a40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24a50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24a60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
24a70 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
24a80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
24a90 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
24aa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
24ab0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
24ac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24ad0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
24ae0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
24af0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
24b00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
24b10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
24b20 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
24b30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24b40 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
24b50 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
24b60 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
24b70 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
24b80 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
24b90 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
24ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24bb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
24bc0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
24bd0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
24be0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
24bf0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
24c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
24c10 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
24c20 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
24c30 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
24c40 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
24c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24c60 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
24c70 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
24c80 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
24c90 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
24ca0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
24cb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24cc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24cd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24ce0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
24cf0 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
24d00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24d10 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
24d20 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63  BLIC_SESSION;..c
24d30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24d40 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
24d50 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
24d60 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IRED;...mutex_re
24d70 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
24d80 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24d90 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
24da0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
24db0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24dc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24dd0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
24de0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
24df0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
24e00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
24e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24e20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24e30 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
24e40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
24e50 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
24e60 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24e70 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
24e80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24e90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24ea0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
24eb0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
24ec0 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
24ed0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
24ee0 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
24ef0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24f00 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
24f10 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
24f20 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
24f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24f40 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
24f50 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
24f60 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
24f70 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
24f80 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
24f90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24fa0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
24fb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24fc0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
24fd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
24fe0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
24ff0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
25000 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25010 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25020 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
25030 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
25040 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
25050 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
25060 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
25070 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
25080 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
25090 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
250a0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
250b0 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
250c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
250d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
250e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
250f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
25100 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25110 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25120 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
25130 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25140 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
25150 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25160 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25170 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25180 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25190 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
251a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
251b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
251c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
251d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
251e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
251f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
25200 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
25210 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
25220 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
25230 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
25240 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
25250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25260 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
25270 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
25280 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
25290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
252a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
252b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
252c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
252d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
252e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
252f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25300 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
25310 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
25320 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
25330 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
25340 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
25350 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
25360 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
25370 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
25380 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
25390 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
253a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
253b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
253c0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
253d0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
253e0 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
253f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25400 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
25410 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
25420 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
25430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25440 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
25450 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
25460 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
25470 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
25480 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
25490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
254a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
254b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
254c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
254d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
254e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
254f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
25500 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
25510 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25520 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
25530 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
25540 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
25550 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
25560 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
25570 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
25580 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
25590 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
255a0 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
255b0 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
255c0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
255d0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
255e0 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
255f0 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
25600 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
25610 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
25620 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
25630 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
25640 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
25650 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
25660 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
25670 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
25680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25690 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
256a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
256b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
256c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
256d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
256e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
256f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
25700 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
25710 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
25720 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
25730 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
25740 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25750 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
25760 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
25770 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25780 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25790 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
257a0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
257b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
257c0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
257d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
257e0 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
257f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25800 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
25810 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
25820 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
25830 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
25840 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
25850 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
25860 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
25870 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
25880 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
25890 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
258a0 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
258b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
258c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
258d0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
258e0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
258f0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
25900 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
25910 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
25920 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
25930 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
25940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25950 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
25960 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
25970 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
25980 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
25990 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
259a0 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
259b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
259c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
259d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
259e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
259f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25a00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25a10 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
25a20 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25a30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25a40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25a50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
25a60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
25a70 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
25a80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25a90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25aa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25ab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25ac0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
25ad0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
25ae0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
25af0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
25b00 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
25b10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25b20 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
25b30 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
25b40 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
25b50 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
25b60 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25b70 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25b80 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
25b90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25ba0 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
25bb0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
25bc0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
25bd0 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
25be0 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
25bf0 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
25c00 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
25c10 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
25c20 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
25c30 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
25c40 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
25c50 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
25c60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
25c70 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
25c80 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
25c90 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
25ca0 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
25cb0 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
25cc0 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
25cd0 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
25ce0 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
25cf0 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
25d00 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
25d10 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
25d20 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
25d30 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
25d40 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
25d50 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
25d60 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
25d70 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
25d80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
25d90 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
25da0 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
25db0 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
25dc0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
25dd0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
25de0 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
25df0 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
25e00 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
25e10 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
25e20 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
25e30 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
25e40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25e50 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
25e60 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
25e70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
25e80 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
25e90 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
25ea0 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
25eb0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
25ec0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
25ed0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
25ee0 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
25ef0 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
25f00 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
25f10 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
25f20 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
25f30 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
25f40 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
25f50 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
25f60 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
25f70 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
25f80 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
25f90 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
25fa0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
25fb0 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
25fc0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
25fd0 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
25fe0 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
25ff0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
26000 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
26010 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
26020 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
26030 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
26040 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
26050 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
26060 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
26070 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
26080 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
26090 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
260a0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
260b0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
260c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
260d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
260e0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
260f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26100 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26110 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
26120 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
26130 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
26140 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
26150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26160 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
26170 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
26180 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
26190 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
261a0 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
261b0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
261c0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
261d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
261e0 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
261f0 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
26200 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
26210 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
26220 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
26230 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26240 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26250 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
26260 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
26270 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
26280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26290 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
262a0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
262b0 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
262c0 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
262d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
262e0 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
262f0 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
26300 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
26310 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
26320 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
26330 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
26340 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
26350 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
26360 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26370 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26380 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26390 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
263a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
263b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
263c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
263d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
263e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
263f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
26400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26410 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
26420 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26430 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
26440 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26450 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
26460 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26470 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
26480 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26490 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
264a0 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
264b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
264c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
264d0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
264e0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
264f0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
26500 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
26510 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
26520 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
26530 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26540 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
26550 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
26560 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
26570 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26580 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
26590 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
265a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
265b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
265c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
265d0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
265e0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
265f0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
26600 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
26610 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26620 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
26630 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26640 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
26650 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
26660 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
26670 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
26680 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26690 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
266a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
266b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
266c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
266d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
266e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
266f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
26700 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
26710 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26720 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26730 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
26740 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26750 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
26760 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26770 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26780 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
26790 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
267a0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
267b0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
267c0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
267d0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
267e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
267f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26800 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
26810 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
26820 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26830 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26850 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26860 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
26870 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
26880 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
26890 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
268a0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
268b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
268c0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
268d0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
268e0 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
268f0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
26900 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
26910 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
26920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26930 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
26940 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
26950 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
26960 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
26970 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
26980 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
26990 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
269a0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
269b0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
269c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
269d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
269e0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
269f0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
26a00 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
26a10 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
26a20 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
26a30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26a40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
26a50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
26a60 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
26a70 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
26a80 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
26a90 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45  reset) {...CACKE
26aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26ab0 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65  The slot has bee
26ac0 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65  n reset since we
26ad0 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72   last looked for
26ae0 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72   identities -- r
26af0 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09  escanning");....
26b00 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
26b10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26b20 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
26b30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
26b40 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
26b50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26b60 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
26b70 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
26b80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26b90 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
26ba0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
26bb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
26bc0 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
26bd0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
26be0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
26bf0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
26c00 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
26c10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26c20 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55  tID].label != NU
26c30 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  LL) {....free(ca
26c40 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
26c50 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61  D].label);....ca
26c60 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
26c70 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  D].label = NULL;
26c80 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ...}....cackey_m
26c90 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
26ca0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
26cb0 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f  tID]);...cackey_
26cc0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
26cd0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d  ot_reset = 0;..}
26ce0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
26cf0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26d00 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  .identities == N
26d10 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
26d20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26d30 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
26d40 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
26d50 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
26d60 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
26d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26d80 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
26d90 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
26da0 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
26db0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
26dc0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
26dd0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
26de0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26df0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
26e00 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
26e10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26e20 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26e30 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
26e40 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
26e50 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
26e60 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
26e70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26e80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
26e90 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
26ea0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
26eb0 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72  mplate));....for
26ec0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
26ed0 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   ulCount; idx++)
26ee0 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70   {.....if (pTemp
26ef0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
26f00 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  eLen == 0) {....
26f10 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26f20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26f30 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
26f40 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  alue = NULL;....
26f50 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
26f60 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
26f70 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26f80 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
26f90 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  dx].pValue = mal
26fa0 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  loc(pTemplate[id
26fb0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
26fc0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
26fd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26fe0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
26ff0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
27000 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
27010 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27020 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
27030 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  y[idx].pValue, p
27040 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56  Template[idx].pV
27050 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
27060 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
27070 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
27080 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65   else {....cacke
27090 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
270a0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
270b0 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  y_count = 0;....
270c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
270d0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
270e0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
270f0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
27100 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
27110 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
27120 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
27130 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
27140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27150 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
27160 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69  ch query specifi
27170 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20  ed as NULL, but 
27180 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
27190 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66  terms not specif
271a0 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09  ied as 0.");....
271b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
271c0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a  MENTS_BAD);...}.
271d0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
271e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
271f0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
27200 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65  = 0;...cackey_se
27210 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27220 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
27230 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
27240 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27250 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
27260 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f  ve = 1;..cackey_
27270 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27280 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
27290 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72  d = 0;...mutex_r
272a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
272b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
272c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
272d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
272e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
272f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27300 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
27310 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
27320 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27330 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
27340 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27350 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27360 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
27370 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
27380 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
27390 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31  int cackey_pkcs1
273a0 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
273b0 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54  utes(CK_ATTRIBUT
273c0 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55  E *a, CK_ATTRIBU
273d0 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e  TE *b) {..unsign
273e0 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75  ed char *smallbu
273f0 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73  f, *largebuf;..s
27400 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c  ize_t smallbuf_l
27410 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e  en, largebuf_len
27420 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20  ;...if (a->type 
27430 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09  != b->type) {...
27440 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
27450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27460 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75  NTF("    ... fou
27470 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65  nd matching type
27480 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59   ...");...CACKEY
27490 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
274a0 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c  "    ... our val
274b0 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c  ue:", a->pValue,
274c0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b   a->ulValueLen);
274d0 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65  ...if (b->pValue
274e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
274f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27500 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
27510 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74  und wildcard mat
27520 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
27530 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e  1);..}...if (a->
27540 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
27550 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
27560 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61  }.. .if (b->ulVa
27570 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56  lueLen == a->ulV
27580 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d  alueLen && memcm
27590 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  p(a->pValue, b->
275a0 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c  pValue, b->ulVal
275b0 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
275c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
275d0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
275e0 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74   found exact mat
275f0 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
27600 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
27610 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61  (a->type) {...ca
27620 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
27630 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
27640 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c  eLen == b->ulVal
27650 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  ueLen) {.....bre
27660 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
27670 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  (a->ulValueLen >
27680 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
27690 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
276a0 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
276b0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62  smallbuf_len = b
276c0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
276d0 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d  ...largebuf = a-
276e0 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
276f0 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  gebuf_len = a->u
27700 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20  lValueLen;....} 
27710 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  else {.....small
27720 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
27730 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
27740 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
27750 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
27760 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
27770 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
27780 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
27790 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20  ...}.....for (; 
277a0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
277b0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61  smallbuf_len; la
277c0 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75  rgebuf++,largebu
277d0 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69  f_len--) {.....i
277e0 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21  f (largebuf[0] !
277f0 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
27800 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
27810 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c  ..if (largebuf_l
27820 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
27830 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
27840 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65  ....}.....if (me
27850 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73  mcmp(largebuf, s
27860 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75  mallbuf, smallbu
27870 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  f_len) == 0) {..
27880 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27890 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
278a0 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69  .. found approxi
278b0 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09  mate match");...
278c0 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
278d0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
278e0 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
278f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27900 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
27910 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53  dObjects)(CK_SES
27920 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
27930 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
27940 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
27950 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ect, CK_ULONG ul
27960 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20  MaxObjectCount, 
27970 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
27980 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09  ObjectCount) {..
27990 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
279a0 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
279b0 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
279c0 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55  curr_attr;..CK_U
279d0 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78  LONG curr_id_idx
279e0 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  , curr_out_id_id
279f0 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  x, curr_attr_idx
27a00 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b  , sess_attr_idx;
27a10 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68  ..CK_ULONG match
27a20 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d  ed_count, prev_m
27a30 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69  atched_count;..i
27a40 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
27a50 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
27a60 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
27a70 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69  DTEST..struct ti
27a80 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64  meval start, end
27a90 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72  ;..uint64_t star
27aa0 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a  t_int, end_int;.
27ab0 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
27ac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27ad0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27ae0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27af0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27b00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27b10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27b20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27b30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27b40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27b50 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62  ;..}...if (pulOb
27b60 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  jectCount == NUL
27b70 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
27b80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27b90 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  r.  pulObjectCou
27ba0 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
27bb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
27bc0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
27bd0 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
27be0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f  = NULL && ulMaxO
27bf0 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
27c00 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
27c10 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
27c20 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
27c30 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
27c40 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
27c50 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a  ely */...*pulObj
27c60 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ectCount = 0;...
27c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27c80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27c90 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
27ca0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
27cb0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
27cc0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
27cd0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
27ce0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
27cf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27d00 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69  ror.  phObject i
27d10 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
27d20 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
27d30 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
27d40 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75   (ulMaxObjectCou
27d50 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  nt == 0) {...CAC
27d60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27d70 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75  ("Error.  Maximu
27d80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  m number of obje
27d90 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73  cts specified as
27da0 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74   zero.");....ret
27db0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27dc0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27dd0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
27de0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
27df0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27e00 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
27e10 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27e20 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
27e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27e40 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
27e50 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
27e60 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
27e70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
27e80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
27e90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
27ea0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
27eb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27ec0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27ed0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27ef0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
27f00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
27f10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
27f20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
27f30 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27f40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
27f50 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
27f60 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27f70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27f80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27f90 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27fa0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
27fb0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
27fc0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
27fd0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
27fe0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
27ff0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28000 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
28010 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
28020 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28030 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
28040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28050 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
28060 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
28070 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28080 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
28090 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
280a0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
280b0 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
280c0 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
280d0 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c  day(&start, NULL
280e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72  );.#endif...curr
280f0 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b  _out_id_idx = 0;
28100 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69  ..for (curr_id_i
28110 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  dx = cackey_sess
28120 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28130 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63  earch_curr_id; c
28140 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63  urr_id_idx < cac
28150 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28160 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28170 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78  s_count && ulMax
28180 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72  ObjectCount; cur
28190 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  r_id_idx++) {...
281a0 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65  curr_id = &cacke
281b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
281c0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
281d0 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09  curr_id_idx];...
281e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
281f0 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67  INTF("Processing
28200 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20   identity:%lu", 
28210 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
28220 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
28230 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  .matched_count =
28240 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72   0;....for (curr
28250 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63  _attr_idx = 0; c
28260 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  urr_attr_idx < c
28270 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28280 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
28290 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72  query_count; cur
282a0 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  r_attr_idx++) {.
282b0 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  ...prev_matched_
282c0 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f  count = matched_
282d0 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f  count;.....curr_
282e0 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73  attr = &cackey_s
282f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28300 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63  ].search_query[c
28310 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  urr_attr_idx];..
28320 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28330 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69  PRINTF("  Checki
28340 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
28350 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e   %s (0x%08lx) in
28360 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
28370 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
28380 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
28390 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e  _STR(curr_attr->
283a0 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
283b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
283c0 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
283d0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
283e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
283f0 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
28400 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
28410 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
28420 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
28430 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
28440 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
28450 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
28460 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
28470 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
28480 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
28490 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
284a0 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
284b0 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75  e_attributes(&cu
284c0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
284d0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
284e0 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a  , curr_attr)) {.
284f0 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
28500 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61  nt++;.......brea
28510 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
28520 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72  ../* If the attr
28530 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20  ibute could not 
28540 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e  be matched, do n
28550 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ot try to match 
28560 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69  additional attri
28570 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28  butes */....if (
28580 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
28590 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f  nt == matched_co
285a0 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
285b0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
285c0 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20   (matched_count 
285d0 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  == cackey_sessio
285e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
285f0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29  rch_query_count)
28600 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
28610 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
28620 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74   All %i attribut
28630 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
28640 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65  ound, adding ide
28650 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75  ntity:%i to retu
28660 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74  rned list", (int
28670 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
28680 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
28690 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
286a0 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
286b0 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74  x);.....phObject
286c0 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  [curr_out_id_idx
286d0 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20  ] = curr_id_idx 
286e0 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62  + 1;.....ulMaxOb
286f0 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09  jectCount--;....
28700 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
28710 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ++;...} else {..
28720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28730 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74  RINTF("  ... Not
28740 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f   all %i (only fo
28750 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74  und %i) attribut
28760 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
28770 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67  ound, not adding
28780 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28   identity:%i", (
28790 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
287a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
287b0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
287c0 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64  t, (int) matched
287d0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
287e0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a  rr_id_idx);...}.
287f0 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  .}..cackey_sessi
28800 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28810 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63  arch_curr_id = c
28820 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75  urr_id_idx;..*pu
28830 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63  lObjectCount = c
28840 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a  urr_out_id_idx;.
28850 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
28860 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
28870 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
28880 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b  day(&end, NULL);
28890 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73  ..start_int = (s
288a0 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30  tart.tv_sec * 10
288b0 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74  00000) + start.t
288c0 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74  v_usec;..end_int
288d0 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a   = (end.tv_sec *
288e0 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e   1000000) + end.
288f0 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74  tv_usec;..fprint
28900 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63  f(stderr, "Searc
28910 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f  h took %lu micro
28920 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73  seconds\n", (uns
28930 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64  igned long) (end
28940 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74  _int - start_int
28950 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74  ));.#endif...mut
28960 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
28970 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28980 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28990 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
289a0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...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 55 6e 6c 6f 63 6b  ("Error.  Unlock
289d0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
289e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
289f0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28a00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28a10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
28a20 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75   CKR_OK (%i), nu
28a30 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22  m objects = %lu"
28a40 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62  , CKR_OK, *pulOb
28a50 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65  jectCount);...re
28a60 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
28a70 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
28a80 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
28a90 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43  dObjectsFinal)(C
28aa0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28ab0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
28ac0 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
28ad0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
28ae0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28af0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
28b00 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
28b10 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
28b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28b30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
28b40 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
28b50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
28b60 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
28b70 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
28b80 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
28b90 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
28ba0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
28bb0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
28bc0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28bd0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
28be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28bf0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28c00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
28c10 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28c20 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28c30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28c40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
28c50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
28c60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28c70 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28c80 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28c90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28ca0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
28cb0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28cc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
28cd0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
28ce0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28cf0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28d00 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
28d10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28d20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28d30 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28d40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28d50 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
28d60 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
28d70 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
28d80 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28d90 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
28da0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28db0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
28dc0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28dd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28de0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28e00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
28e10 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
28e20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
28e30 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
28e40 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28e50 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
28e60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28e70 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
28e80 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
28e90 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65   idx < cackey_se
28ea0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28eb0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
28ec0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
28ed0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
28ee0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28ef0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
28f00 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65  pValue) {....fre
28f10 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
28f20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
28f30 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
28f40 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  alue);...}..}...
28f50 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
28f60 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
28f70 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
28f80 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
28f90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28fa0 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
28fb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28fc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
28fd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28fe0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
28ff0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29000 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29010 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29020 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
29030 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29040 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29050 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29060 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29070 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
29080 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
29090 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
290a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
290b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
290c0 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
290d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
290e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
290f0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
29100 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
29110 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
29120 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29130 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29140 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29150 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29170 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29180 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29190 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
291a0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
291b0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
291c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
291d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
291e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
291f0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
29200 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29210 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
29220 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
29230 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29240 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
29250 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
29260 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
29270 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
29280 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
29290 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
292a0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
292b0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
292c0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
292d0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
292e0 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
292f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29300 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29310 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29320 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29340 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29350 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29360 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29370 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29380 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
293a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
293b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
293c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
293d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
293e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
293f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29400 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29410 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29420 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
29430 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
29440 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29450 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
29460 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
29470 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
29480 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
29490 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
294a0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
294b0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
294c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
294d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
294e0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
294f0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29500 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29510 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29520 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29530 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29540 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29550 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
29560 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29570 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29590 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
295a0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
295b0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
295c0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
295d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
295e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
295f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29600 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
29610 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29620 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
29630 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
29640 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
29650 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
29660 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
29670 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
29680 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29690 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
296a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
296b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
296c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
296d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
296e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
296f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29700 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29710 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29720 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29730 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
29740 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
29750 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
29760 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
29770 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
29780 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29790 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
297a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
297b0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
297c0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
297d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
297e0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
297f0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
29800 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
29810 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
29820 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
29830 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
29840 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
29850 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
29860 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
29870 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29880 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29890 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
298a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
298b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
298c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
298d0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
298e0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
298f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29900 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
29910 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
29920 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
29930 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
29940 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
29950 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
29960 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
29970 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29980 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
29990 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
299a0 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
299b0 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
299c0 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
299d0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
299e0 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
299f0 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
29a00 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
29a10 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
29a20 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
29a30 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29a40 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
29a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29a60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
29a70 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
29a80 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29a90 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
29aa0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29ab0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
29ac0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
29ad0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29ae0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
29af0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
29b00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29b10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
29b20 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29b30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29b40 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29b50 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
29b60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29b70 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
29b80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29b90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29ba0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29bc0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
29bd0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
29be0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
29bf0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
29c00 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
29c10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29c20 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
29c30 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
29c40 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29c50 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29c60 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29c70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29c80 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
29c90 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
29ca0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
29cb0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
29cc0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
29cd0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
29ce0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29cf0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
29d00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
29d10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
29d20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
29d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29d40 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
29d50 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
29d60 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
29d70 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
29d80 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
29d90 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
29da0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
29db0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
29dc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29dd0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
29de0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
29df0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
29e00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
29e10 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29e20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29e30 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
29e40 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29e50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29e60 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
29e70 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
29e80 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
29e90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29ea0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
29eb0 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
29ec0 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
29ed0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29ee0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
29ef0 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
29f00 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
29f10 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
29f20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29f30 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
29f40 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
29f50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29f60 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29f70 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
29f80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
29f90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29fa0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
29fb0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
29fc0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
29fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29fe0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
29ff0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a000 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a010 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2a020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a030 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a040 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2a050 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2a060 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2a070 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a080 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
2a090 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2a0a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2a0b0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2a0c0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
2a0d0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
2a0e0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2a0f0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
2a100 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
2a110 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
2a120 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
2a130 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
2a140 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09  V decrypt_ret;..
2a150 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2a160 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2a170 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a180 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a190 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a1a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a1b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a1c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a1d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a1e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a1f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a200 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e  ..if (pulDataLen
2a210 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2a220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a230 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74  F("Error. pulDat
2a240 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  aLen is NULL.");
2a250 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2a260 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2a270 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61  }...datalen_upda
2a280 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  te = *pulDataLen
2a290 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
2a2a0 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
2a2b0 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63  e(hSession, pEnc
2a2c0 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e  ryptedData, ulEn
2a2d0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
2a2e0 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
2a2f0 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65  update);..if (de
2a300 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
2a310 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
2a320 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a330 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64  ror.  DecryptUpd
2a340 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
2a350 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2a360 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2a370 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2a380 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70  );....if (decryp
2a390 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  t_ret != CKR_BUF
2a3a0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
2a3b0 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ..../* Terminate
2a3c0 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72   decryption oper
2a3d0 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74  ation */.....mut
2a3e0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2a3f0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2a400 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2a410 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2a420 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
2a430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a440 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2a450 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2a460 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a470 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a480 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
2a490 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a4a0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2a4b0 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2a4c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a4d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2a4e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a4f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a500 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a510 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2a520 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a530 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  DLE_INVALID);...
2a540 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2a550 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a560 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
2a570 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
2a580 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2a590 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2a5a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
2a5b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a5c0 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
2a5d0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2a5e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2a5f0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2a600 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
2a610 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2a620 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2a630 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
2a640 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a650 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2a660 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a670 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2a680 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2a690 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2a6a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a6b0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2a6c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2a6d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2a6e0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2a6f0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  }....return(decr
2a700 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ypt_ret);..}...i
2a710 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44  f (pData) {...pD
2a720 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75  ata += datalen_u
2a730 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c  pdate;..}..datal
2a740 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44  en_final = *pulD
2a750 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e  ataLen - datalen
2a760 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79  _update;...decry
2a770 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
2a780 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  ptFinal(hSession
2a790 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
2a7a0 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64  n_final);..if (d
2a7b0 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
2a7c0 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
2a7d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a7e0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69  rror.  DecryptFi
2a7f0 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
2a800 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2a810 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2a820 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
2a830 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  );....return(dec
2a840 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
2a850 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61  *pulDataLen = da
2a860 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64  talen_update + d
2a870 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09  atalen_final;...
2a880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a890 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a8a0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2a8b0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2a8c0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2a8d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2a8e0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70  _RV, C_DecryptUp
2a8f0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2a900 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2a910 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
2a920 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
2a930 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
2a940 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
2a950 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2a960 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
2a970 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63  rtLen) {..static
2a980 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33   CK_BYTE buf[163
2a990 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75  84];..ssize_t bu
2a9a0 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
2a9b0 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
2a9c0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
2a9d0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
2a9e0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
2a9f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2aa00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2aa10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2aa20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2aa30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aa40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2aa50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2aa60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2aa70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2aa80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2aa90 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2aaa0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2aab0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2aac0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2aad0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2aae0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2aaf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ab00 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2ab10 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2ab20 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2ab30 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2ab40 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2ab50 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
2ab60 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
2ab70 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2ab80 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
2ab90 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
2aba0 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
2abb0 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
2abc0 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
2abd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2abe0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2abf0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
2ac00 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
2ac10 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2ac20 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
2ac30 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
2ac40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ac50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ac60 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
2ac70 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
2ac80 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ac90 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
2aca0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2acb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2acc0 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
2acd0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2ace0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2acf0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
2ad00 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2ad10 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
2ad20 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
2ad30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2ad40 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2ad50 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
2ad60 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2ad70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ad80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
2ad90 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
2ada0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2adb0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2adc0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2add0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2ade0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2adf0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2ae00 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2ae10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ae20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ae30 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2ae40 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ae50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2ae60 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2ae70 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ae80 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2ae90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2aea0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2aeb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2aec0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2aed0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2aee0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2aef0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2af00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2af10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2af20 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2af30 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
2af40 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
2af50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2af60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2af70 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2af80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2af90 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
2afa0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2afb0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2afc0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2afd0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2afe0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2aff0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b000 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2b010 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2b020 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2b030 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2b040 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2b050 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2b060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b070 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2b080 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2b090 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2b0a0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2b0b0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2b0c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b0d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2b0e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2b0f0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2b100 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b110 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b120 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2b130 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2b140 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2b150 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2b160 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2b170 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b180 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2b190 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b1a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2b1b0 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2b1c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b1d0 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
2b1e0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2b1f0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2b200 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72  Ask card to decr
2b210 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e  ypt */....buflen
2b220 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2b230 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2b240 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2b250 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b260 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
2b270 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
2b280 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
2b290 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
2b2a0 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
2b2b0 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  , 1);.....if (bu
2b2c0 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
2b2d0 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61  /* Decryption fa
2b2e0 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20  iled. */.....if 
2b2f0 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  (buflen == CACKE
2b300 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
2b310 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  IN) {......retva
2b320 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54  l = CKR_USER_NOT
2b330 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09  _LOGGED_IN;.....
2b340 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65  } else if (bufle
2b350 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2b360 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
2b370 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2b380 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
2b390 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
2b3a0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2b3b0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2b3c0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
2b3d0 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
2b3e0 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e   long) buflen) >
2b3f0 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20   *pulPartLen && 
2b400 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20  pPart) {...../* 
2b410 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74  Decrypted data t
2b420 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09  oo large */.....
2b430 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
2b440 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
2b450 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69  ..} else {.....i
2b460 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09  f (pPart) {.....
2b470 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62  .memcpy(pPart, b
2b480 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09  uf, buflen);....
2b490 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74  .}......*pulPart
2b4a0 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09  Len = buflen;...
2b4b0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2b4c0 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
2b4d0 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
2b4e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b4f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b500 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2b510 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2b520 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2b530 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b540 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2b550 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2b560 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b570 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2b580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b590 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
2b5a0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
2b5b0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
2b5c0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2b5d0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2b5e0 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28  C_DecryptFinal)(
2b5f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2b600 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2b610 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72  YTE_PTR pLastPar
2b620 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2b630 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20  pulLastPartLen) 
2b640 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
2b650 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  val;..int termin
2b660 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b  ate_decrypt = 1;
2b670 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b680 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2b690 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2b6a0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2b6b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b6c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2b6d0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2b6e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b6f0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2b700 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2b710 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2b720 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2b730 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2b740 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2b750 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2b760 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2b770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b780 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2b790 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2b7a0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2b7b0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2b7c0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2b7d0 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72  ..if (pulLastPar
2b7e0 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tLen == NULL) {.
2b7f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b800 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
2b810 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20  lLastPartLen is 
2b820 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2b830 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2b840 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
2b850 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2b860 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2b870 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2b880 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2b890 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2b8a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b8b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2b8c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2b8d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b8e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2b8f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2b900 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2b910 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2b920 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b930 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b950 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2b960 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2b970 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2b980 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2b990 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2b9a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2b9b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b9c0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2b9d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2b9e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b9f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2ba00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ba10 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2ba20 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
2ba30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ba40 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2ba50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ba60 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  ..*pulLastPartLe
2ba70 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61  n = 0;...if (pLa
2ba80 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  stPart == NULL) 
2ba90 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65  {...terminate_de
2baa0 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  crypt = 0;..}...
2bab0 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65  if (terminate_de
2bac0 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65  crypt) {...cacke
2bad0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2bae0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
2baf0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
2bb00 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2bb10 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2bb20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2bb30 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2bb40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2bb50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bb60 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2bb70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2bb80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2bb90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2bba0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bbb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2bbc0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2bbd0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2bbe0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2bbf0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bc00 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2bc10 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2bc20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2bc30 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2bc40 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b  TR pMechanism) {
2bc50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bc60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2bc70 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2bc80 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2bc90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bca0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2bcb0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2bcc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2bcd0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2bce0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2bcf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bd00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2bd10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2bd20 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2bd30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2bd40 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2bd50 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2bd60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2bd70 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2bd80 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2bd90 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45   C_Digest)(CK_SE
2bda0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2bdb0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2bdc0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2bdd0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2bde0 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73  _BYTE_PTR pDiges
2bdf0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2be00 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a  pulDigestLen) {.
2be10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2be20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2be30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2be40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2be50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2be60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2be70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2be80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2be90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2bea0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2beb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bec0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2bed0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2bee0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2bef0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2bf00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2bf10 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2bf20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2bf30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2bf40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2bf50 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28  C_DigestUpdate)(
2bf60 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2bf70 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2bf80 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2bf90 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2bfa0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2bfb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2bfc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2bfd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2bfe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c000 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2c010 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2c020 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2c030 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2c040 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2c050 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2c060 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2c070 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2c080 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2c090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2c0a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2c0b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2c0c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2c0d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c0e0 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79  _RV, C_DigestKey
2c0f0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2c100 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2c110 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2c120 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
2c130 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2c140 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2c150 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2c160 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2c170 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c180 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2c190 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2c1a0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2c1b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2c1c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2c1d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2c1e0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2c1f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2c200 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2c210 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c220 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2c230 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c240 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2c250 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2c260 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46  CK_RV, C_DigestF
2c270 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2c280 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c290 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2c2a0 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  igest, CK_ULONG_
2c2b0 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e  PTR pulDigestLen
2c2c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2c2d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2c2e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2c2f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2c300 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c310 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c320 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2c330 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c340 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2c350 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2c360 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c370 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c380 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2c390 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2c3a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2c3b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2c3c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2c3d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c3e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2c3f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2c400 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28  RV, C_SignInit)(
2c410 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c420 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2c430 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2c440 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2c450 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2c460 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
2c470 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
2c480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c490 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2c4a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2c4b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2c4c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c4d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2c4e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2c4f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2c500 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2c510 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2c520 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
2c530 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2c540 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c550 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
2c560 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
2c570 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2c580 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2c590 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
2c5a0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
2c5b0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
2c5c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c5d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
2c5e0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2c5f0 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
2c600 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
2c610 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c620 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
2c630 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2c640 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
2c650 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
2c660 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2c670 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
2c680 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
2c690 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
2c6a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c6b0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2c6c0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
2c6d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2c6e0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2c6f0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2c700 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2c710 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2c720 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c730 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2c740 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2c750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c760 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2c770 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2c780 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2c790 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2c7a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2c7b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c7c0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2c7d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c7e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c7f0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2c800 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c810 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2c820 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2c830 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2c840 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2c850 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2c860 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c870 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2c880 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2c890 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2c8a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2c8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c8c0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2c8d0 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
2c8e0 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
2c8f0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2c900 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
2c910 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
2c920 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c930 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c940 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
2c950 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c960 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c970 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c990 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
2c9a0 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
2c9b0 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
2c9c0 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
2c9d0 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
2c9e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2c9f0 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
2ca00 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
2ca10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2ca20 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2ca30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ca40 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
2ca50 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
2ca60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ca70 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
2ca80 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  = 1;...cackey_se
2ca90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2caa0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20  .sign_mechanism 
2cab0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
2cac0 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65  chanism;...cacke
2cad0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2cae0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
2caf0 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f   = 128;..cackey_
2cb00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cb10 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2cb20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 0;..cackey_ses
2cb30 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cb40 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f  sign_buf = mallo
2cb50 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
2cb60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cb70 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
2cb80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cb90 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2cba0 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59  uflen);...CACKEY
2cbb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
2cbc0 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f  ession %lu sign_
2cbd0 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28  identity is %p (
2cbe0 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c  identity #%lu)",
2cbf0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2cc00 20 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64   hSession, (void
2cc10 20 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73   *) &cackey_sess
2cc20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2cc30 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c  dentities[hKey],
2cc40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2cc50 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f   hKey);..cackey_
2cc60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cc70 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
2cc80 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
2cc90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2cca0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
2ccb0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2ccc0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2ccd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2cce0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2ccf0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2cd00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cd10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2cd20 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2cd30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2cd40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2cd50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2cd60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2cd70 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2cd80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2cd90 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2cda0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2cdb0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2cdc0 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  gn)(CK_SESSION_H
2cdd0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2cde0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2cdf0 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2ce00 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2ce10 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
2ce20 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
2ce30 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2ce40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74  unsigned long st
2ce50 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2ce60 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65  ;..CK_RV sign_re
2ce70 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
2ce80 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2ce90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2cea0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2ceb0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2cec0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2ced0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cee0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2cef0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2cf00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2cf10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2cf20 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2cf30 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2cf40 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2cf50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2cf60 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2cf70 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2cf80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cf90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cfa0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2cfb0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2cfc0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2cfd0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2cfe0 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67  ;..}...start_sig
2cff0 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b  n_bufused = cack
2d000 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d010 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2d020 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ed;...sign_ret =
2d030 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53   C_SignUpdate(hS
2d040 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75  ession, pData, u
2d050 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28  lDataLen);..if (
2d060 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2d070 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2d080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d090 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28  or.  SignUpdate(
2d0a0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2d0b0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2d0c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2d0d0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69   sign_ret);....i
2d0e0 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
2d0f0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2d100 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f  ALL) {....mutex_
2d110 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2d120 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2d130 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
2d140 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2d150 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
2d160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d170 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2d180 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2d190 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2d1a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2d1b0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2d1c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d1d0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2d1e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2d1f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2d200 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2d210 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d220 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2d230 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d240 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2d250 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2d260 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
2d270 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2d280 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d290 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2d2a0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
2d2b0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2d2c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
2d2d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d2e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2d2f0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2d300 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
2d310 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2d320 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d330 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
2d340 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d350 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2d360 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  0;.....mutex_ret
2d370 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2d380 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2d390 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2d3a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2d3b0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2d3c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d3d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2d3e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2d3f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2d400 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
2d410 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  }...}....return(
2d420 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2d430 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
2d440 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  nFinal(hSession,
2d450 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c   pSignature, pul
2d460 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09  SignatureLen);..
2d470 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
2d480 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  CKR_OK) {...if (
2d490 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f  sign_ret == CKR_
2d4a0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2d4b0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
2d4c0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e  BUG_PRINTF("Sign
2d4d0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
2d4e0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2d4f0 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29  SMALL (rv = %lu)
2d500 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e  , undoing C_Sign
2d510 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69  Update()", (unsi
2d520 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2d530 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ret);.....cackey
2d540 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d550 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2d560 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
2d570 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72  fused;.....retur
2d580 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d  n(sign_ret);...}
2d590 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2d5a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d5b0 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74   SignFinal() ret
2d5c0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
2d5d0 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
2d5e0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
2d5f0 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
2d600 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
2d610 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20  .if (pSignature 
2d620 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2d630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d640 28 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65  ("pSignature spe
2d650 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
2d660 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70  undoing C_SignUp
2d670 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63  date()");....cac
2d680 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d690 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2d6a0 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e  sed = start_sign
2d6b0 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74  _bufused;....ret
2d6c0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
2d6d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d6e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d6f0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2d700 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2d710 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2d720 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d730 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55  N(CK_RV, C_SignU
2d740 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2d750 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2d760 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2d770 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2d780 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  lPartLen) {..int
2d790 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2d7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d7b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2d7c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2d7d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2d7e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d7f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2d800 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2d810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2d820 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2d830 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2d840 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2d850 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2d860 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2d870 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2d880 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2d890 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2d8a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d8b0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2d8c0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2d8d0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2d8e0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2d8f0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2d900 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
2d910 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d  L && ulPartLen =
2d920 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
2d930 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
2d940 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67  are asked to sig
2d950 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  n nothing... */.
2d960 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d970 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2d980 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
2d990 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
2d9a0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
2d9b0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
2d9c0 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
2d9d0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2d9e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d9f0 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c  r. pPart is NULL
2da00 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20  , but ulPartLen 
2da10 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
2da20 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2da30 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2da40 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  if (ulPartLen ==
2da50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2da60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2da70 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  or. ulPartLen is
2da80 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
2da90 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
2daa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2dab0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2dac0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2dad0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2dae0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2daf0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2db00 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2db10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2db20 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2db30 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2db40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2db50 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2db60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2db70 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2db80 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2db90 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2dba0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2dbb0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2dbc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2dbd0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2dbe0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2dbf0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2dc00 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2dc10 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2dc20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2dc30 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
2dc40 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2dc50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2dc60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2dc70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dc80 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2dc90 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2dca0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2dcb0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2dcc0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2dcd0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
2dce0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2dcf0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
2dd00 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2dd10 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2dd20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63  Accumulate direc
2dd30 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63  tly */....if ((c
2dd40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dd50 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2dd60 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65  fused + ulPartLe
2dd70 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73  n) > cackey_sess
2dd80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2dd90 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09  ign_buflen) {...
2dda0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2ddb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2ddc0 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09  _buflen *= 2;...
2ddd0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2dde0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2ddf0 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28  n_buf = realloc(
2de00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2de10 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2de20 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b  uf, sizeof(*cack
2de30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2de40 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
2de50 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  * cackey_session
2de60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2de70 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a  _buflen);....}..
2de80 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
2de90 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2dea0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63  on].sign_buf + c
2deb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2dec0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2ded0 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c  fused, pPart, ul
2dee0 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61  PartLen);.....ca
2def0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2df00 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2df10 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65  used += ulPartLe
2df20 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  n;.....break;..}
2df30 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2df40 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2df50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2df60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2df70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2df80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2df90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2dfa0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2dfb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2dfc0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2dfd0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2dfe0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2dff0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2e000 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2e010 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2e020 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e030 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2e040 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ignFinal)(CK_SES
2e050 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e060 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e070 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2e080 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2e090 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73  gnatureLen) {..s
2e0a0 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69  tatic CK_BYTE si
2e0b0 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69  gbuf[1024];..ssi
2e0c0 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a  ze_t sigbuflen;.
2e0d0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
2e0e0 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  ID;..CK_RV retva
2e0f0 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
2e100 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d  ERROR;..int term
2e110 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a  inate_sign = 1;.
2e120 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2e130 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2e140 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e150 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e160 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e170 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e180 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e190 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e1a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e1b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e1c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e1d0 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74  ...if (pulSignat
2e1e0 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ureLen == NULL) 
2e1f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e200 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e210 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2e220 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2e230 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2e240 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2e250 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2e260 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2e270 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2e280 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2e290 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2e2a0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2e2b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e2c0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2e2d0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2e2e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2e2f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2e300 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2e310 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2e320 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2e330 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2e340 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2e350 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2e360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e370 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2e380 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2e390 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2e3a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2e3b0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2e3c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2e3d0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2e3e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2e3f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2e400 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2e410 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e420 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2e430 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2e440 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2e450 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2e460 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2e470 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2e480 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2e490 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2e4a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2e4b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2e4c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e4d0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2e4e0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2e4f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2e500 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2e510 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e520 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
2e530 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2e540 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
2e550 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
2e560 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
2e570 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
2e580 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2e590 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
2e5a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e5b0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2e5c0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2e5d0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
2e5e0 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
2e5f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
2e600 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2e610 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2e620 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
2e630 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
2e640 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2e650 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e660 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2e670 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2e680 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
2e690 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
2e6a0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
2e6b0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2e6c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2e6d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2e6e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2e6f0 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79  ..switch (cackey
2e700 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2e710 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69  on].sign_mechani
2e720 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
2e730 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
2e740 20 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67   Ask card to sig
2e750 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44  n */....CACKEY_D
2e760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
2e770 69 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d  ing to sign from
2e780 20 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20   identity %p in 
2e790 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76  session %lu", (v
2e7a0 6f 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65  oid *) cackey_se
2e7b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2e7c0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
2e7d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2e7e0 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69  hSession);....si
2e7f0 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  gbuflen = cackey
2e800 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2e810 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2e820 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2e830 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2e840 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63  gn_identity, cac
2e850 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2e860 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
2e870 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2e880 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2e890 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c  bufused, sigbuf,
2e8a0 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c   sizeof(sigbuf),
2e8b0 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28   1, 0);.....if (
2e8c0 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  sigbuflen < 0) {
2e8d0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20  ...../* Signing 
2e8e0 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
2e8f0 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
2e900 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2e910 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
2e920 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
2e930 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
2e940 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
2e950 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
2e960 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2e970 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2e980 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2e990 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2e9a0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
2e9b0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2e9c0 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
2e9d0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
2e9e0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2e9f0 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  igbuflen) > *pul
2ea00 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20  SignatureLen && 
2ea10 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
2ea20 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61  ../* Signed data
2ea30 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
2ea40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ea50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20  RINTF("retval = 
2ea60 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2ea70 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e  MALL;  sigbuflen
2ea80 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61   = %lu, pulSigna
2ea90 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  tureLen = %lu", 
2eaa0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2eab0 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69  sigbuflen, (unsi
2eac0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53  gned long) *pulS
2ead0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09  ignatureLen);...
2eae0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2eaf0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2eb00 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65  ;......terminate
2eb10 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20  _sign = 0;....} 
2eb20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69  else {.....termi
2eb30 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a  nate_sign = 0;..
2eb40 09 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75  ....if (pSignatu
2eb50 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  re) {......memcp
2eb60 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69  y(pSignature, si
2eb70 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29  gbuf, sigbuflen)
2eb80 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74  ;.......terminat
2eb90 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09  e_sign = 1;.....
2eba0 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61  }......*pulSigna
2ebb0 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66  tureLen = sigbuf
2ebc0 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2ebd0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2ebe0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2ebf0 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69  if (terminate_si
2ec00 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  gn) {...if (cack
2ec10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ec20 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
2ec30 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
2ec40 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ec50 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09  on].sign_buf);..
2ec60 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
2ec70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ec80 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
2ec90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2eca0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2ecb0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ecc0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2ecd0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2ece0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ecf0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ed00 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2ed10 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2ed20 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2ed30 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2ed40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ed50 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
2ed60 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
2ed70 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2ed80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2ed90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2eda0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ignRecoverInit)(
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 4d  E hSession, CK_M
2edd0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2ede0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2edf0 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2ee00 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2ee10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ee20 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ee30 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2ee40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ee50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2ee60 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ee70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ee80 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2ee90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2eea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2eeb0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2eec0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2eed0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2eee0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2eef0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ef00 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ef10 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ef20 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ef30 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ef40 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29  , C_SignRecover)
2ef50 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2ef60 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2ef70 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2ef80 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2ef90 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2efa0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2efb0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2efc0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2efd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2efe0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2eff0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2f000 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2f010 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f020 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2f030 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2f040 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2f050 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2f060 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2f070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f080 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2f090 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f0a0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2f0b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f0c0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2f0d0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2f0e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2f0f0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2f100 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2f110 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53  rifyInit)(CK_SES
2f120 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f130 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2f140 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2f150 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2f160 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2f170 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f180 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2f190 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2f1a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2f1b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f1c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2f1d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2f1e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2f1f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2f200 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2f210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f220 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2f230 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f240 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2f250 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f260 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2f270 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2f280 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2f290 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2f2a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2f2b0 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rify)(CK_SESSION
2f2c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f2d0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2f2e0 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2f2f0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2f300 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2f310 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
2f320 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2f330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f340 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2f350 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2f360 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2f370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f380 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2f390 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2f3a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2f3b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2f3c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2f3d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f3e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2f3f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f400 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2f410 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f420 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2f430 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2f440 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2f450 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2f460 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2f470 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
2f480 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f490 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2f4a0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2f4b0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
2f4c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f4d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2f4e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2f4f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2f500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f510 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2f520 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2f530 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f540 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2f550 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2f560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f570 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2f580 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f590 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2f5a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f5b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2f5c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2f5d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f5e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2f5f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2f600 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28   C_VerifyFinal)(
2f610 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2f620 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2f630 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2f640 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
2f650 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2f660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f670 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f680 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2f690 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2f6a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f6b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2f6c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2f6d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2f6e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2f6f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2f700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f710 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2f720 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f730 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2f740 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f750 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2f760 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2f770 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f780 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f790 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f7a0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2f7b0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2f7c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2f7d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2f7e0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2f7f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2f800 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2f810 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2f820 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2f830 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2f840 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2f850 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2f860 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2f870 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2f880 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2f890 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2f8a0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2f8b0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f8c0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2f8d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2f8e0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2f8f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f900 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f910 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f920 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2f930 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f940 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
2f950 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
2f960 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2f970 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2f980 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2f990 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
2f9a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2f9b0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
2f9c0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
2f9d0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2f9e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2f9f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2fa00 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2fa10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fa20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2fa30 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2fa40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2fa50 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2fa60 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2fa70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fa80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2fa90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2faa0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2fab0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2fac0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2fad0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2fae0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2faf0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2fb00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2fb10 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  , C_DigestEncryp
2fb20 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2fb30 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2fb40 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2fb50 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2fb60 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
2fb70 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2fb80 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2fb90 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2fba0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
2fbb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fbc0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2fbd0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2fbe0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2fbf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fc00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2fc10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2fc20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2fc30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2fc40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2fc50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fc60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2fc70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fc80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2fc90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fca0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2fcb0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2fcc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2fcd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2fce0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2fcf0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
2fd00 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2fd10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2fd20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
2fd30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
2fd40 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
2fd50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2fd60 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2fd70 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
2fd80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2fd90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2fda0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2fdb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2fdc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2fdd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fde0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2fdf0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2fe00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2fe10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2fe20 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2fe30 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2fe40 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2fe50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2fe60 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2fe70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fe80 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2fe90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fea0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2feb0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2fec0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72  K_RV, C_SignEncr
2fed0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2fee0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2fef0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2ff00 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2ff10 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2ff20 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2ff30 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2ff40 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2ff50 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2ff60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ff70 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ff80 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ff90 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2ffa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ffb0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2ffc0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ffd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2ffe0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2fff0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30000 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30010 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30020 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30030 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30040 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30050 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30060 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30070 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30080 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
30090 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
300a0 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
300b0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
300c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
300d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
300e0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
300f0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
30100 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
30110 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
30120 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
30130 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
30140 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30150 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
30160 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
30170 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30180 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30190 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
301a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
301b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
301c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
301d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
301e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
301f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30200 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30210 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
30220 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30230 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30240 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30250 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
30260 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30270 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
30280 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  teKey)(CK_SESSIO
30290 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
302a0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
302b0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
302c0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
302d0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
302e0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
302f0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
30300 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
30310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30320 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
30330 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
30340 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
30350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30360 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
30370 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
30380 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
30390 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
303a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
303b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
303c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
303d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
303e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
303f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30400 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
30410 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30420 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
30430 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30440 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
30450 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43  nerateKeyPair)(C
30460 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
30470 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
30480 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
30490 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
304a0 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63  BUTE_PTR pPublic
304b0 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
304c0 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65  ULONG ulPublicKe
304d0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
304e0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
304f0 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d  R pPrivateKeyTem
30500 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
30510 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72  ulPrivateKeyAttr
30520 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
30530 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
30540 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b   phPublicKey, CK
30550 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
30560 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29  TR phPrivateKey)
30570 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
30580 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
30590 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
305a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
305b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
305c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
305d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
305e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
305f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
30600 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
30610 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30620 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30630 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
30640 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
30650 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
30660 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
30670 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
30680 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
30690 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
306a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
306b0 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b  V, C_WrapKey)(CK
306c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
306d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
306e0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
306f0 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
30700 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e  _HANDLE hWrappin
30710 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  gKey, CK_OBJECT_
30720 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f  HANDLE hKey, CK_
30730 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
30740 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  dKey, CK_ULONG_P
30750 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79  TR pulWrappedKey
30760 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
30770 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
30780 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
30790 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
307a0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
307b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
307c0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
307d0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
307e0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
307f0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
30800 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30810 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30820 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
30830 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
30840 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
30850 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
30860 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
30870 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30880 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
30890 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
308a0 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b  CK_RV, C_UnwrapK
308b0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
308c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
308d0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
308e0 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
308f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55  OBJECT_HANDLE hU
30900 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  nwrappingKey, CK
30910 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
30920 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20  edKey, CK_ULONG 
30930 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c  ulWrappedKeyLen,
30940 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
30950 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
30960 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
30970 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
30980 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
30990 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
309a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
309b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
309c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
309d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
309e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
309f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
30a00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
30a10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
30a20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
30a30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
30a40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30a50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
30a60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
30a70 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
30a80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
30a90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
30aa0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30ab0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
30ac0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
30ad0 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65  K_RV, C_DeriveKe
30ae0 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
30af0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
30b00 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
30b10 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
30b20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61  BJECT_HANDLE hBa
30b30 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42  seKey, CK_ATTRIB
30b40 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
30b50 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
30b60 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
30b70 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
30b80 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
30b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30ba0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
30bb0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
30bc0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
30bd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
30be0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
30bf0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
30c00 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
30c10 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
30c20 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
30c30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
30c40 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
30c50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
30c60 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
30c70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30c80 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
30c90 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30ca0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
30cb0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
30cc0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
30cd0 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  edRandom)(CK_SES
30ce0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30cf0 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
30d00 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e  R pSeed, CK_ULON
30d10 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09  G ulSeedLen) {..
30d20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
30d30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
30d40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
30d50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
30d60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30d70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
30d80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
30d90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30da0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30db0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30dd0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30de0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30df0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30e00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30e10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30e20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30e30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30e40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
30e50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30e60 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29  _GenerateRandom)
30e70 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
30e80 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
30e90 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d  BYTE_PTR pRandom
30ea0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
30eb0 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43  lRandomLen) {..C
30ec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30ed0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30ee0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
30ef0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
30f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30f10 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
30f20 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
30f30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
30f40 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
30f50 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
30f60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30f70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
30f80 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
30f90 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
30fa0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30fb0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
30fc0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30fd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
30fe0 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
30ff0 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
31000 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
31010 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
31020 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f  ctionStatus)(CK_
31030 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
31040 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
31050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
31060 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
31070 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
31080 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
31090 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
310a0 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
310b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
310c0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
310d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
310e0 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
310f0 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
31100 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
31110 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
31120 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   warning */.}../
31130 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
31140 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
31150 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
31160 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  V, C_CancelFunct
31170 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
31180 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
31190 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
311a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
311b0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
311c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
311d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
311e0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
311f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
31200 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
31210 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
31220 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
31230 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
31240 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
31250 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
31260 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
31270 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
31280 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
31290 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
312a0 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  st)(CK_FUNCTION_
312b0 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46  LIST_PTR_PTR ppF
312c0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09  unctionList) {..
312d0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
312e0 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69  _PTR pFunctionLi
312f0 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
31300 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
31310 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75  d.");...if (ppFu
31320 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55  nctionList == NU
31330 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
31340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
31350 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  or. ppFunctionLi
31360 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  st is NULL.");..
31370 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
31380 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
31390 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  ..pFunctionList 
313a0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
313b0 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29  *pFunctionList))
313c0 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
313d0 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  t->version.major
313e0 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
313f0 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
31400 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  E) >> 16) & 0xff
31410 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31420 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  ->version.minor 
31430 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
31440 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
31450 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
31460 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31470 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20  >C_Initialize = 
31480 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70  C_Initialize;..p
31490 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
314a0 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e  Finalize = C_Fin
314b0 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
314c0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f  nList->C_GetInfo
314d0 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70   = C_GetInfo;..p
314e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
314f0 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f  GetSlotList = C_
31500 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46  GetSlotList;..pF
31510 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
31520 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47  etSlotInfo = C_G
31530 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75  etSlotInfo;..pFu
31540 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31550 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47  tTokenInfo = C_G
31560 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46  etTokenInfo;..pF
31570 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
31580 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20  aitForSlotEvent 
31590 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  = C_WaitForSlotE
315a0 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  vent;..pFunction
315b0 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61  List->C_GetMecha
315c0 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74  nismList = C_Get
315d0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09  MechanismList;..
315e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
315f0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
31600 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  o = C_GetMechani
31610 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  smInfo;..pFuncti
31620 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f  onList->C_InitTo
31630 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65  ken = C_InitToke
31640 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
31650 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43  t->C_InitPIN = C
31660 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63  _InitPIN;..pFunc
31670 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50  tionList->C_SetP
31680 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09  IN = C_SetPIN;..
31690 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
316a0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43  _OpenSession = C
316b0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70  _OpenSession;..p
316c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
316d0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43  CloseSession = C
316e0 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09  _CloseSession;..
316f0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31700 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
31710 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  s = C_CloseAllSe
31720 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69  ssions;..pFuncti
31730 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73  onList->C_GetSes
31740 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  sionInfo = C_Get
31750 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46  SessionInfo;..pF
31760 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
31770 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
31780 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f   = C_GetOperatio
31790 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
317a0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65  onList->C_SetOpe
317b0 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
317c0 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
317d0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
317e0 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c  t->C_Login = C_L
317f0 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ogin;..pFunction
31800 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d  List->C_Logout =
31810 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e   C_Logout;..pFun
31820 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65  ctionList->C_Cre
31830 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72  ateObject = C_Cr
31840 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75  eateObject;..pFu
31850 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f  nctionList->C_Co
31860 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70  pyObject = C_Cop
31870 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
31880 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72  ionList->C_Destr
31890 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73  oyObject = C_Des
318a0 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  troyObject;..pFu
318b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
318c0 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f  tObjectSize = C_
318d0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09  GetObjectSize;..
318e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
318f0 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
31900 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62  ue = C_GetAttrib
31910 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
31920 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41  tionList->C_SetA
31930 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
31940 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
31950 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
31960 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
31970 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f  tsInit = C_FindO
31980 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75  bjectsInit;..pFu
31990 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
319a0 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69  ndObjects = C_Fi
319b0 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e  ndObjects;..pFun
319c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
319d0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20  dObjectsFinal = 
319e0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
319f0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
31a00 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69  st->C_EncryptIni
31a10 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  t = C_EncryptIni
31a20 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31a30 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43  t->C_Encrypt = C
31a40 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Encrypt;..pFunc
31a50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
31a60 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e  yptUpdate = C_En
31a70 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
31a80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
31a90 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ncryptFinal = C_
31aa0 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  EncryptFinal;..p
31ab0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31ac0 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  DecryptInit = C_
31ad0 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  DecryptInit;..pF
31ae0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
31af0 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79  ecrypt = C_Decry
31b00 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
31b10 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64  st->C_DecryptUpd
31b20 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55  ate = C_DecryptU
31b30 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
31b40 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
31b50 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70  Final = C_Decryp
31b60 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
31b70 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
31b80 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49  Init = C_DigestI
31b90 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
31ba0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20  ist->C_Digest = 
31bb0 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63  C_Digest;..pFunc
31bc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
31bd0 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  stUpdate = C_Dig
31be0 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
31bf0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
31c00 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73  estKey = C_Diges
31c10 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tKey;..pFunction
31c20 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69  List->C_DigestFi
31c30 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69  nal = C_DigestFi
31c40 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
31c50 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20  ist->C_SignInit 
31c60 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70  = C_SignInit;..p
31c70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31c80 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09  Sign = C_Sign;..
31c90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31ca0 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f  _SignUpdate = C_
31cb0 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75  SignUpdate;..pFu
31cc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
31cd0 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e  gnFinal = C_Sign
31ce0 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
31cf0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
31d00 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67  overInit = C_Sig
31d10 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70  nRecoverInit;..p
31d20 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31d30 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f  SignRecover = C_
31d40 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46  SignRecover;..pF
31d50 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
31d60 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65  erifyInit = C_Ve
31d70 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63  rifyInit;..pFunc
31d80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
31d90 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09  fy = C_Verify;..
31da0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31db0 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  _VerifyUpdate = 
31dc0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  C_VerifyUpdate;.
31dd0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31de0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20  C_VerifyFinal = 
31df0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09  C_VerifyFinal;..
31e00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31e10 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
31e20 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  it = C_VerifyRec
31e30 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
31e40 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
31e50 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65  fyRecover = C_Ve
31e60 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46  rifyRecover;..pF
31e70 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
31e80 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
31e90 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63  te = C_DigestEnc
31ea0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
31eb0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
31ec0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
31ed0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67  e = C_DecryptDig
31ee0 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
31ef0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
31f00 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  nEncryptUpdate =
31f10 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
31f20 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
31f30 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56  List->C_DecryptV
31f40 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f  erifyUpdate = C_
31f50 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
31f60 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
31f70 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
31f80 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ey = C_GenerateK
31f90 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
31fa0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
31fb0 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61  yPair = C_Genera
31fc0 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e  teKeyPair;..pFun
31fd0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61  ctionList->C_Wra
31fe0 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79  pKey = C_WrapKey
31ff0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
32000 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20  ->C_UnwrapKey = 
32010 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46  C_UnwrapKey;..pF
32020 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
32030 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72  eriveKey = C_Der
32040 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  iveKey;..pFuncti
32050 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61  onList->C_SeedRa
32060 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e  ndom = C_SeedRan
32070 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
32080 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52  ist->C_GenerateR
32090 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61  andom = C_Genera
320a0 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  teRandom;..pFunc
320b0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
320c0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20  unctionStatus = 
320d0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
320e0 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  tus;..pFunctionL
320f0 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e  ist->C_CancelFun
32100 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c  ction = C_Cancel
32110 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63  Function;..pFunc
32120 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
32130 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f  unctionList = C_
32140 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  GetFunctionList;
32150 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69  ...*ppFunctionLi
32160 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69  st = pFunctionLi
32170 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
32180 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
32190 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
321a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
321b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
321c0 0a                                               .