Hex Artifact Content

Artifact 345685b6678a4623404e786b3ca068ed31b7633e:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  time = 0;.static
1760: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
1780: 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66 20  IME(void) {..if 
1790: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74  (cackey_debug_st
17a0: 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b  art_time == 0) {
17b0: 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  ...cackey_debug_
17c0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17d0: 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  e(NULL);..}...re
17e0: 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29 20  turn(time(NULL) 
17f0: 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  - cackey_debug_s
1800: 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20  tart_time);.}.# 
1810: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e 73   else.static uns
1820: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1830: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1840: 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  void) {..return(
1850: 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a 0a  0);.}.#  endif..
1860: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
1880: 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20  ..) { \..static 
1890: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
18a0: 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e  96] = {0}; \..sn
18b0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 2c  printf(buf_user,
18c0: 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72   sizeof(buf_user
18d0: 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73  ), x); \..buf_us
18e0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
18f0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1900: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1910: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1920: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1930: 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  %s\n", CACKEY_DE
1940: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1950: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1960: 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a  _, buf_user); \.
1970: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1980: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
19a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
19b0: 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73 74  f, x, y) { \..st
19c0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
19d0: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c 20  er[4096] = {0}, 
19e0: 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a 09  *buf_user_p; \..
19f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75  unsigned long bu
1a00: 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09  f_user_size; \..
1a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1a20: 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e  MPBUF; \..unsign
1a30: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09  ed long idx; \..
1a40: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
1a50: 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28 75  ; \..TMPBUF = (u
1a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a70: 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  (x); \..buf_user
1a80: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a90: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1aa0: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1ab0: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1ac0: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1ad0: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1ae0: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1af0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b00: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b10: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1b20: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1b30: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1b40: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b50: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b60: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b70: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b80: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b90: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1ba0: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1bb0: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1bc0: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1bd0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1be0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1bf0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1c00: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c10: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1c20: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1c30: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1c40: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c50: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c70: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c80: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c90: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1ca0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1cc0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1cd0: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1ce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1d00: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1d10: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1d30: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1d40: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d50: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d60: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d70: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d80: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d90: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1da0: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1db0: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1dc0: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1dd0: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1de0: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1df0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1e00: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1e10: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1e20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1e40: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e50: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e70: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e90: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1ea0: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1eb0: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1ec0: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1ed0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ee0: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ef0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1f00: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1f10: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1f20: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1f30: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1f40: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f50: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f60: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f70: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f80: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f90: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1fa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fb0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1fc0: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1fd0: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1fe0: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1ff0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
2000: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
2010: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
2020: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
2030: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
2040: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2050: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2060: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2070: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2080: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2090: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
20a0: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
20b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
20c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
20d0: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
20e0: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20f0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
2100: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
2110: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
2120: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
2130: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2140: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2150: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2160: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2170: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2180: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2190: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
21a0: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
21b0: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
21c0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
21d0: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
21e0: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21f0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
2200: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
2210: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2220: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
2230: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
2240: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2250: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2260: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2270: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2280: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2290: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
22a0: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
22b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
22c0: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
22d0: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
22e0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22f0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
2300: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
2310: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2330: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2340: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2350: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2360: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2370: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2380: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2390: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
23a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
23b0: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
23c0: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
23d0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
23e0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23f0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
2400: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
2410: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
2420: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
2430: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
2440: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2450: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2460: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2470: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2480: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2490: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
24a0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
24b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
24c0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
24d0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
24e0: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24f0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
2500: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
2510: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
2520: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2530: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
2540: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2550: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2560: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2570: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2590: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
25a0: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
25b0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
25c0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
25d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25e0: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2600: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
2610: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
2620: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
2630: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
2640: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2650: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2660: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2670: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2680: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2690: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
26a0: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
26b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
26c0: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
26d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
26e0: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
2700: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
2710: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
2720: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
2730: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
2740: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2750: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2760: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2780: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2790: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
27a0: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
27b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
27c0: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
27d0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
27e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27f0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
2800: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
2810: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2820: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
2830: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2840: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2850: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2860: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2880: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2890: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
28a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28b0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
28e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28f0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2910: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
2920: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
2930: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
2940: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2950: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2970: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2980: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2990: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
29a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
29b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
29c0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
29d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29e0: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a00: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
2a10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2a20: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
2a30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a40: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a60: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a90: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2aa0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ab0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2ac0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2ad0: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2ae0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2af0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2b00: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b10: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2b20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b30: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2b40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b50: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b70: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b80: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b90: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2ba0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bb0: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2bd0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2be0: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2bf0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2c00: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2c10: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c20: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2c30: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c40: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c50: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c60: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c80: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ca0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2cb0: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2cc0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2cd0: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2ce0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2cf0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2d00: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2d10: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2d30: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2d40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d50: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2d60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d70: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d80: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d90: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2da0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2db0: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2dc0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2dd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2de0: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2df0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2e00: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2e10: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2e20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e30: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2e40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e50: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e60: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e70: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e80: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ea0: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2eb0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ec0: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ef0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2f00: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2f10: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2f20: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2f30: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2f40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f50: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f70: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f90: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2fa0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fb0: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2fc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fd0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2fe0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ff0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
3000: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3010: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
3020: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
3030: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
3040: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3050: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3060: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3070: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3080: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3090: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30a0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30b0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
30c0: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
30d0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
30e0: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3100: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
3110: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
3120: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
3130: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
3140: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3150: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3160: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3170: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3190: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
31a0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
31b0: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
31c0: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
31d0: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
31e0: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
3200: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
3210: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
3220: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3230: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
3240: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3250: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3260: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3270: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3280: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3290: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
32a0: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
32b0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
32c0: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
32d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3300: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
3310: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3320: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
3330: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3340: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3350: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3360: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3370: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3380: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3390: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
33a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
33b0: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
33c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
33d0: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
33e0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33f0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
3400: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3410: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
3420: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3430: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
3440: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3450: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3460: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3470: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3480: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3490: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
34a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34b0: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
34c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
34d0: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
34e0: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34f0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
3500: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
3510: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
3520: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3530: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
3540: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3550: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3560: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3570: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3580: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3590: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
35a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
35b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
35c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
35d0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
35e0: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35f0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
3600: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3610: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
3620: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
3630: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
3640: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3650: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3660: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3670: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3680: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3690: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
36a0: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
36b0: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
36c0: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
36d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
36e0: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36f0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
3700: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
3710: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3720: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
3730: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
3740: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3750: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3760: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3770: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3780: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3790: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
37a0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
37b0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
37c0: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
37d0: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
37e0: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37f0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
3800: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3810: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
3820: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3830: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
3840: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3850: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3860: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3870: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3880: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3890: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
38a0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
38b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38c0: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
38d0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
38e0: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38f0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3900: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
3910: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
3920: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3930: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
3940: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3950: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3960: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3970: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3980: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3990: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
39a0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
39b0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
39c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
39d0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
39e0: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39f0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
3a00: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
3a10: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3a20: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
3a30: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
3a40: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a50: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a60: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a80: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a90: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3aa0: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3ab0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3ac0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3ad0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3ae0: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3af0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3b00: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3b10: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3b20: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3b30: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3b40: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b50: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b60: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b70: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b80: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b90: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3ba0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3bb0: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3bc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3bd0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3be0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3bf0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3c00: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
3c10: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c20: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3c30: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3c40: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c60: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c70: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3ca0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3cb0: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3cc0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3cd0: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3ce0: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3cf0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d00: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3d10: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3d20: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3d30: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d40: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d50: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d60: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d70: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d80: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d90: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3da0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3db0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3dc0: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3dd0: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3de0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3df0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3e00: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3e10: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3e20: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3e30: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3e40: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e50: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e60: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e70: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e80: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e90: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3ea0: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3eb0: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3ec0: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3ed0: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3ee0: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ef0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f00: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3f10: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3f20: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3f30: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3f40: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f60: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3f70: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f80: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f90: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3fa0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3fb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3fc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3fd0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3fe0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3ff0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
4000: 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....retur
4010: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
4020: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
4030: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
4040: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4050: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4060: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4070: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4080: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4090: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
40a0: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
40b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
40c0: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
40d0: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
40e0: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40f0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
4100: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
4110: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
4120: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
4130: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
4140: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4150: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4160: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4170: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4180: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4190: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
41a0: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
41b0: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
41c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
41d0: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
41e0: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41f0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
4200: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
4210: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
4220: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
4230: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
4240: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4250: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4260: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4270: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4280: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4290: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
42a0: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
42b0: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
42c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
42d0: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
42e0: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42f0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
4300: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
4310: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4320: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
4330: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
4340: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4350: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4360: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4370: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4380: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4390: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
43a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
43b0: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
43c0: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
43d0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
43e0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43f0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
4400: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
4410: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
4420: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
4430: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
4440: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4450: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4460: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4470: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4480: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4490: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
44a0: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
44b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
44c0: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
44d0: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
44e0: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
4500: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
4510: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
4520: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
4530: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4540: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4550: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4560: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4570: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4580: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4590: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
45a0: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
45b0: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
45c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
45d0: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
45e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45f0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
4600: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
4610: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
4620: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4630: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
4640: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4650: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4660: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4670: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4680: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4690: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
46a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
46b0: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
46c0: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
46d0: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
46e0: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46f0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
4700: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
4710: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4720: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
4730: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
4740: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4750: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4760: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4770: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4780: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4790: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
47a0: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
47b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
47c0: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
47d0: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
47e0: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47f0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
4800: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
4810: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
4820: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
4830: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
4840: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4850: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4860: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4870: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4880: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4890: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
48a0: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
48b0: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
48c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
48d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
48e0: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48f0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4900: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4910: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
4920: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4930: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
4940: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4950: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4960: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4970: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4980: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4990: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
49a0: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
49b0: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
49c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49d0: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
49e0: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a00: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
4a10: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
4a20: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
4a30: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
4a40: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a50: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a60: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a70: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a80: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a90: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4aa0: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4ab0: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4ac0: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4ad0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4ae0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4af0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4b00: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4b10: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4b20: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4b30: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4b40: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b50: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b60: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b70: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b80: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b90: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4ba0: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4bb0: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4bc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4bd0: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4be0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4bf0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4c00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4c10: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4c20: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4c30: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4c40: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c50: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c60: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c70: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c80: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c90: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4ca0: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4cb0: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4cc0: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4cd0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4ce0: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4cf0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4d00: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4d10: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4d20: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4d30: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d50: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d70: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d80: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d90: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4da0: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4db0: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4dc0: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4dd0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4de0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4df0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4e00: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4e10: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4e30: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4e40: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e50: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e60: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e70: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e80: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e90: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4ea0: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4eb0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4ec0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4ed0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4ee0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ef0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4f00: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4f10: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4f20: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f30: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4f40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f50: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f60: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f70: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74  ABLED".#endif..t
4f80: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
4f90: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
4fa0: 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  C,..CACKEY_ID_TY
4fb0: 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f  PE_PIV,..CACKEY_
4fc0: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
4fd0: 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  Y.} cackey_pcsc_
4fe0: 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74  id_type;..struct
4ff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
5000: 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f  ntity {..cackey_
5010: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
5020: 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  type;...size_t c
5030: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
5040: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5050: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
5060: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
5070: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75  ..union {...stru
5080: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
5090: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
50a0: 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ....uint16_t fil
50b0: 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73  e;...} cac;....s
50c0: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
50d0: 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b  ned char key_id;
50e0: 0a 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33  ....char label[3
50f0: 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20  2];...} piv;..} 
5100: 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  card;.};..struct
5110: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
5120: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
5130: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5140: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a  *pcsc_identity;.
5150: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
5160: 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f  attributes;..CK_
5170: 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73  ULONG attributes
5180: 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75  _count;.};..stru
5190: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
51a0: 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  n {..int active;
51b0: 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ...CK_SLOT_ID sl
51c0: 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45  otID;...CK_STATE
51d0: 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47   state;..CK_FLAG
51e0: 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f  S flags;..CK_ULO
51f0: 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72  NG ulDeviceError
5200: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
5210: 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b  Application;..CK
5220: 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a  _NOTIFY Notify;.
5230: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5240: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
5250: 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
5260: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
5270: 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61  count;...int sea
5280: 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  rch_active;..CK_
5290: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65  ATTRIBUTE_PTR se
52a0: 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f  arch_query;..CK_
52b0: 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65  ULONG search_que
52c0: 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ry_count;..unsig
52d0: 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f  ned long search_
52e0: 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73  curr_id;...int s
52f0: 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ign_active;..CK_
5300: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73  MECHANISM_TYPE s
5310: 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ign_mechanism;..
5320: 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e  CK_BYTE_PTR sign
5330: 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _buf;..unsigned 
5340: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e  long sign_buflen
5350: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5360: 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09   sign_bufused;..
5370: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
5380: 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65  entity *sign_ide
5390: 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63  ntity;...int dec
53a0: 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b  rypt_active;..CK
53b0: 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
53c0: 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
53d0: 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  m;..CK_VOID_PTR 
53e0: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
53f0: 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63  m;..CK_ULONG dec
5400: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
5410: 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  n;..struct cacke
5420: 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72  y_identity *decr
5430: 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b  ypt_identity;.};
5440: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5450: 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69  slot {..int acti
5460: 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61  ve;..int interna
5470: 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  l;...char *pcsc_
5480: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
5490: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
54a0: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
54b0: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
54c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
54d0: 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  th;..int transac
54e0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
54f0: 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  k;...int slot_re
5500: 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20  set;...CK_FLAGS 
5510: 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75  token_flags;...u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
5530: 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f  bel;...DWORD pro
5540: 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65  tocol;...unsigne
5550: 64 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72  d int cached_cer
5560: 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63  ts_count;..struc
5570: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5580: 65 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63  entity *cached_c
5590: 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  erts;.};..typede
55a0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
55b0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
55c0: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
55d0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
55e0: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
55f0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
5600: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
5610: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
5620: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
5630: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5640: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
5650: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
5660: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
5670: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
5680: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
5690: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
56a0: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
56b0: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
56c0: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
56e0: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
56f0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
5700: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
5710: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5720: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
5730: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
5740: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5750: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
5760: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
5770: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5780: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
5790: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
57a0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
57b0: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
57c0: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
57d0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
57e0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
57f0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
5800: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5810: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
5820: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
5830: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
5840: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
5850: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
5860: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
5870: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5880: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
5890: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
58a0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
58b0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
58c0: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
58d0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
58e0: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
58f0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
5900: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
5910: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
5920: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
5930: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
5940: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
5950: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
5960: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
5970: 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41  NT     = -6,..CA
5980: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
5990: 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37  Y           = -7
59a0: 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a  .} cackey_ret;..
59b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
59c0: 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73  v_cardurl {..uns
59d0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
59e0: 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65    rid[5];..cacke
59f0: 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20  y_tlv_apptype   
5a00: 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  apptype;..cackey
5a10: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f  _tlv_objectid  o
5a20: 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79  bjectid;..cackey
5a30: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61  _tlv_objectid  a
5a40: 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ppid;..unsigned 
5a50: 63 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69  char        pini
5a60: 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  d;.};..struct ca
5a70: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b  ckey_tlv_entity;
5a80: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5a90: 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e  lv_entity {..uin
5aa0: 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f  t8_t tag;..size_
5ab0: 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f  t length;...unio
5ac0: 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75  n {...void *valu
5ad0: 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b  e;...struct cack
5ae0: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a  ey_tlv_cardurl *
5af0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09  value_cardurl;..
5b00: 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62  .uint8_t value_b
5b10: 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63  yte;..};...struc
5b20: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
5b30: 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a  ity *_next;.};..
5b40: 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c  /* CACKEY Global
5b50: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5b60: 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f  ic void *cackey_
5b70: 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  biglock = NULL;.
5b80: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5b90: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63  ckey_session cac
5ba0: 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38  key_sessions[128
5bb0: 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ];.static struct
5bc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63   cackey_slot cac
5bd0: 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a  key_slots[128];.
5be0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5bf0: 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
5c00: 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  0;.static int ca
5c10: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
5c20: 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54  t = 0;.CK_C_INIT
5c30: 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b  IALIZE_ARGS cack
5c40: 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78  ey_args;../** Ex
5c50: 74 72 61 20 63 65 72 74 69 66 69 63 61 74 65 73  tra certificates
5c60: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
5c70: 6f 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20  oken **/.struct 
5c80: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
5c90: 74 69 74 79 20 65 78 74 72 61 5f 63 65 72 74 73  tity extra_certs
5ca0: 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
5cb0: 22 63 61 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f  "cackey_builtin_
5cc0: 63 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20  certs.h".};../* 
5cd0: 50 72 6f 74 65 63 74 65 64 20 41 75 74 68 65 6e  Protected Authen
5ce0: 74 69 63 61 74 69 6f 6e 20 50 61 74 68 20 63 6f  tication Path co
5cf0: 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65  mmand */.#define
5d00: 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
5d10: 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52  AND_DEFAULT_XSTR
5d20: 28 73 74 72 29 20 43 41 43 4b 45 59 5f 50 49 4e  (str) CACKEY_PIN
5d30: 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54  _COMMAND_DEFAULT
5d40: 5f 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e  _STR(str).#defin
5d50: 65 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  e CACKEY_PIN_COM
5d60: 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 53 54 52  MAND_DEFAULT_STR
5d70: 28 73 74 72 29 20 23 73 74 72 0a 73 74 61 74 69  (str) #str.stati
5d80: 63 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 70  c char *cackey_p
5d90: 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c  in_command = NUL
5da0: 4c 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  L;.static char *
5db0: 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
5dc0: 6e 64 5f 78 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b  nd_xonly = NULL;
5dd0: 0a 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c  ../* PCSC Global
5de0: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5df0: 69 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58  ic LPSCARDCONTEX
5e00: 54 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  T cackey_pcsc_ha
5e10: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74  ndle = NULL;..st
5e20: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5e30: 6e 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72  ng cackey_getver
5e40: 73 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74  sion(void) {..st
5e50: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f  atic unsigned lo
5e60: 6e 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b  ng retval = 255;
5e70: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5e80: 6d 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69  major = 0;..unsi
5e90: 67 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20  gned long minor 
5ea0: 3d 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f  = 0;..char *majo
5eb0: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63  r_str = NULL;..c
5ec0: 68 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d  har *minor_str =
5ed0: 20 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f   NULL;...CACKEY_
5ee0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
5ef0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72  lled.");...if (r
5f00: 65 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a  etval != 255) {.
5f10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
5f20: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
5f30: 20 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e   0x%lx (cached).
5f40: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ", retval);....r
5f50: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
5f60: 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a  }...retval = 0;.
5f70: 0a 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f  .#ifdef PACKAGE_
5f80: 56 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  VERSION.        
5f90: 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b  major_str = PACK
5fa0: 41 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66  AGE_VERSION;..if
5fb0: 20 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09   (major_str) {..
5fc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20          major = 
5fd0: 73 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74  strtoul(major_st
5fe0: 72 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31  r, &minor_str, 1
5ff0: 30 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72  0);....if (minor
6000: 5f 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72  _str) {....minor
6010: 20 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72   = strtoul(minor
6020: 5f 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20  _str + 1, NULL, 
6030: 31 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65  10);...}..}...re
6040: 74 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c  tval = (major <<
6050: 20 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c   16) | (minor <<
6060: 20 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41   8);.#endif...CA
6070: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6080: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25  F("Returning 0x%
6090: 6c 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  lx", retval);...
60a0: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
60b0: 7d 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61  }../* PC/SC Rela
60c0: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
60d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
60e0: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
60f0: 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
6100: 65 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20  ect_all(void);. 
6110: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
6120: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
6130: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6140: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
6150: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6160: 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f  s function disco
6170: 6e 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20  nnects from all 
6180: 63 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  cards.. *. */.st
6190: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
61a0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
61b0: 74 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75  t_all(void) {..u
61c0: 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43  int32_t idx;...C
61d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
61e0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
61f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
6200: 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
6210: 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
6220: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
6230: 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
6240: 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
6250: 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
6260: 29 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69  ) {..../* Skip i
6270: 6e 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f  nternal slots */
6280: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
6290: 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
62a0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
62b0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
62c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
62d0: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44  G_PRINTF("SCardD
62e0: 69 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63  isconnect(%lu) c
62f0: 61 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65  alled", (unsigne
6300: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09  d long) idx);...
6310: 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ..SCardDisconnec
6320: 74 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  t(cackey_slots[i
6330: 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53  dx].pcsc_card, S
6340: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
6350: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
6360: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
6370: 61 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28  abel) {....free(
6380: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6390: 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61  ].label);.....ca
63a0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
63b0: 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09  label = NULL;...
63c0: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
63d0: 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64  s[idx].pcsc_card
63e0: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
63f0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
6400: 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
6410: 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63  depth = 0;...cac
6420: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6430: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
6440: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09  hw_lock = 0;....
6450: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
6460: 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
6470: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6480: 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20  PRINTF("Marking 
6490: 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20  active slot %lu 
64a0: 61 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c  as being reset",
64b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
64c0: 20 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61   idx);...}....ca
64d0: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
64e0: 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
64f0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
6500: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
6510: 69 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b  ing");...return;
6520: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
6530: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
6540: 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63  _ret cackey_pcsc
6550: 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  _connect(void);.
6560: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
6570: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
6580: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
6590: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
65a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
65b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
65c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
65d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
65e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
65f0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6600: 69 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20  ion connects to 
6610: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6620: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64  tion Manager and
6630: 20 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20   updates the. * 
6640: 20 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c      global handl
6650: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
6660: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
6670: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
6680: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
6690: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
66a0: 72 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45  ret;.#ifdef HAVE
66b0: 5f 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e  _SCARDISVALIDCON
66c0: 54 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64  TEXT..LONG scard
66d0: 5f 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65  _isvalid_ret;.#e
66e0: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
66f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6700: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6710: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6720: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  == NULL) {...cac
6730: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6740: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
6750: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6760: 64 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63  dle));...if (cac
6770: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6780: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41  == NULL) {....CA
6790: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
67a0: 46 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f  F("Call to mallo
67b0: 63 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75  c() failed, retu
67c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
67d0: 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
67e0: 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
67f0: 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72  all();.....retur
6800: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
6810: 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09  GENERIC);...}...
6820: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6830: 49 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62  INTF("SCardEstab
6840: 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61  lishContext() ca
6850: 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f  lled");...scard_
6860: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6870: 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  = SCardEstablish
6880: 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43  Context(SCARD_SC
6890: 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c  OPE_SYSTEM, NULL
68a0: 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70  , NULL, cackey_p
68b0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69  csc_handle);...i
68c0: 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  f (scard_est_con
68d0: 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52  text_ret != SCAR
68e0: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
68f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6900: 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53  RINTF("Call to S
6910: 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e  CardEstablishCon
6920: 74 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74  text failed (ret
6930: 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72  urned %s/%li), r
6940: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
6950: 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ure", CACKEY_DEB
6960: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
6970: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73  _TO_STR(scard_es
6980: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20  t_context_ret), 
6990: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74  (long) scard_est
69a0: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a  _context_ret);..
69b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70  ...free(cackey_p
69c0: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09  csc_handle);....
69d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
69e0: 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63  le = NULL;.....c
69f0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6a00: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6a10: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6a20: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
6a30: 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
6a40: 48 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49  HAVE_SCARDISVALI
6a50: 44 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59  DCONTEXT..CACKEY
6a60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
6a70: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
6a80: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
6a90: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6aa0: 74 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64  t = SCardIsValid
6ab0: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6ac0: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69  pcsc_handle);..i
6ad0: 66 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64  f (scard_isvalid
6ae0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6af0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
6b00: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6b10: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63  ("Handle has bec
6b20: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61  ome invalid (SCa
6b30: 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74  rdIsValidContext
6b40: 20 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69   = %s/%li), tryi
6b50: 6e 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69  ng to re-establi
6b60: 73 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  sh...", CACKEY_D
6b70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6b80: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6b90: 69 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c  isvalid_ret), (l
6ba0: 6f 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c  ong) scard_isval
6bb0: 69 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b  id_ret);....CACK
6bc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6bd0: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6be0: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6bf0: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6c00: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6c10: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6c20: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6c30: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
6c40: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
6c50: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
6c60: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6c70: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6c80: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
6c90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6ca0: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
6cb0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6cc0: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6cd0: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6ce0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6cf0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6d00: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6d10: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6d20: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6d30: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
6d40: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
6d50: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
6d60: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
6d70: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6d80: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
6d90: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6da0: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
6db0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6dc0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6dd0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6de0: 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68  PRINTF("Handle h
6df0: 61 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62  as been re-estab
6e00: 6c 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e  lished");..}.#en
6e10: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6e20: 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73  UG_PRINTF("Suces
6e30: 73 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64  sfully connected
6e40: 20 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72   to PC/SC, retur
6e50: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22  ning in success"
6e60: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
6e70: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
6e80: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
6e90: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
6ea0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64  et cackey_pcsc_d
6eb0: 69 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b  isconnect(void);
6ec0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
6ed0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
6ee0: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
6ef0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
6f00: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
6f10: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
6f20: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
6f30: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
6f40: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
6f50: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
6f60: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
6f70: 20 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20   from the PC/SC 
6f80: 43 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  Connection manag
6f90: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20  er and updates. 
6fa0: 2a 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c  *     the global
6fb0: 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a   handle.. *. */.
6fc0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
6fd0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6fe0: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b  sconnect(void) {
6ff0: 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c  ..LONG scard_rel
7000: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09  _context_ret;...
7010: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7020: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7030: 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73  ..if (cackey_pcs
7040: 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c  c_handle == NULL
7050: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ) {...return(CAC
7060: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
7070: 09 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63  .}...scard_rel_c
7080: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
7090: 72 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74  rdReleaseContext
70a0: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
70b0: 6e 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63  ndle);...if (cac
70c0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
70d0: 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
70e0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
70f0: 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
7100: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  andle = NULL;..}
7110: 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c  ...if (scard_rel
7120: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20  _context_ret != 
7130: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
7140: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
7150: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7160: 43 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  C);..}...return(
7170: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
7180: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
7190: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
71a0: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
71b0: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
71c0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71d0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
71e0: 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  TS. *     None. 
71f0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7200: 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  E. *     None. *
7210: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
7220: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
7230: 61 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20  arks a slot has 
7240: 68 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65  having been rese
7250: 74 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63  t, to later be c
7260: 6c 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20  leaned up.. *   
7270: 20 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68    Cleanup only h
7280: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b  appens when a PK
7290: 43 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c  CS#11 client cal
72a0: 6c 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  ls C_FindObjects
72b0: 49 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  Init.. *. */.sta
72c0: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
72d0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
72e0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
72f0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20  ot *slot) {..if 
7300: 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
7310: 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09  ...return;..}...
7320: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7330: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
7340: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63  ..if (slot->pcsc
7350: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29  _card_connected)
7360: 20 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e   {...SCardDiscon
7370: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7380: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
7390: 45 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c  E_CARD);..}...sl
73a0: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ot->slot_reset =
73b0: 20 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f   1;..slot->pcsc_
73c0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
73d0: 20 30 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f   0;..if (cackey_
73e0: 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 3d 20 4e  pin_command == N
73f0: 55 4c 4c 29 20 7b 0a 09 09 73 6c 6f 74 2d 3e 74  ULL) {...slot->t
7400: 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
7410: 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
7420: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 6c 6f  ..} else {...slo
7430: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
7440: 20 30 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f   0;..}...CACKEY_
7450: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7460: 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65  turning.");...re
7470: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
7480: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c  YNPOSIS. *     L
7490: 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  ONG cackey_recon
74a0: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
74b0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
74c0: 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c  ot, DWORD defaul
74d0: 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57  t_protocol, LPDW
74e0: 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f  ORD selected_pro
74f0: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52  tocol);. *. * AR
7500: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
7510: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7520: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7530: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7540: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44  s to. *. *     D
7550: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7560: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20  tocol. *        
7570: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74   Protocol to att
7580: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a  empt first. *. *
7590: 20 20 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c       LPDWORD sel
75a0: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20  ected_protocol. 
75b0: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
75c0: 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  Protocol selecte
75d0: 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  d. *. * RETURN V
75e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20  ALUE. *     The 
75f0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
7600: 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  m SCardReconnect
7610: 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  (). *. * NOTES. 
7620: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
7630: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
7640: 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63   around SCardRec
7650: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20  onnect(). *. *  
7660: 20 20 20 54 68 65 20 53 43 61 72 64 52 65 63 6f     The SCardReco
7670: 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e  nnect() function
7680: 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61   call will be ca
7690: 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74 68 20  lled first with 
76a0: 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65  the. *     dwPre
76b0: 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20  ferredProtocols 
76c0: 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74  of "default_prot
76d0: 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20  ocol".  If that 
76e0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20  call returns. * 
76f0: 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54      SCARD_E_PROT
7700: 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61  O_MISMATCH try a
7710: 67 61 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74  gain with a prot
7720: 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64  ocol of T=0, and
7730: 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20   failing. *     
7740: 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f  that T=1.. *. */
7750: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63  .static LONG cac
7760: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
7770: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7780: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
7790: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
77a0: 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c  col, LPDWORD sel
77b0: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20  ected_protocol) 
77c0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f  {..LONG scard_co
77d0: 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f  nn_ret;...scard_
77e0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
77f0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
7800: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
7810: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64  _SHARE_SHARED, d
7820: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c  efault_protocol,
7830: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7840: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7850: 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61  ocol);...if (sca
7860: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7870: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7880: 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45  MATCH) {...CACKE
7890: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
78a0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
78b0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
78c0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
78d0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
78e0: 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64  st T=0")...scard
78f0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
7900: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
7910: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
7920: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7930: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7940: 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  0, SCARD_RESET_C
7950: 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72  ARD, selected_pr
7960: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
7970: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7980: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7990: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43  MISMATCH) {....C
79a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
79b0: 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65  TF("SCardReconne
79c0: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
79d0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
79e0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
79f0: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
7a00: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7a10: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7a20: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7a30: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7a40: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7a50: 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45  COL_T1, SCARD_RE
7a60: 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74  SET_CARD, select
7a70: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  ed_protocol);...
7a80: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63  }..}...return(sc
7a90: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d  ard_conn_ret);.}
7aa0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7ab0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
7ac0: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63  et cackey_connec
7ad0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
7ae0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7af0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
7b00: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
7b10: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
7b20: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
7b30: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
7b40: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7b50: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
7b60: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
7b70: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
7b80: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
7b90: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
7ba0: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
7bb0: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
7bc0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
7bd0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f  ey_ret cackey_co
7be0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63  nnect_card(struc
7bf0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7c00: 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
7c10: 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  et pcsc_connect_
7c20: 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74  ret;..DWORD prot
7c30: 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  ocol;..LONG scar
7c40: 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41  d_conn_ret;...CA
7c50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7c60: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
7c70: 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43  if (!slot) {...C
7c80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7c90: 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74  TF("Invalid slot
7ca0: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
7cb0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7cc0: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
7cd0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7ce0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  RIC);..}...pcsc_
7cf0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
7d00: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
7d10: 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
7d20: 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
7d30: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
7d40: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7d50: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
7d60: 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
7d70: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
7d80: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7d90: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7da0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7db0: 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74  }.../* Connect t
7dc0: 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65  o reader, if nee
7dd0: 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f  ded */..if (!slo
7de0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7df0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
7e00: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7e10: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73  "SCardConnect(%s
7e20: 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d  ) called", slot-
7e30: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  >pcsc_reader);..
7e40: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7e50: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7e60: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7e70: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
7e80: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
7e90: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7ea0: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
7eb0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7ec0: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7ed0: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7ee0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7ef0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7f00: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7f10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7f20: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7f30: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7f40: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7f50: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7f60: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7f70: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
7f80: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
7f90: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
7fa0: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
7fb0: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
7fc0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7fd0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
7fe0: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7ff0: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
8000: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8010: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
8020: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
8030: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
8040: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
8050: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
8060: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
8070: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
8080: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
8090: 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  1").....scard_co
80a0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
80b0: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
80c0: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
80d0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
80e0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
80f0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
8100: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
8110: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8120: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
8130: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
8140: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50  t == SCARD_W_UNP
8150: 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09  OWERED_CARD) {..
8160: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8170: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
8180: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
8190: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
81a0: 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f  _CARD, trying to
81b0: 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29   re-connect...")
81c0: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ;.....scard_conn
81d0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
81e0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
81f0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
8200: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
8210: 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20  D_SHARE_DIRECT, 
8220: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8230: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
8240: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
8250: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
8260: 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61  ol);.....if (sca
8270: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
8280: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8290: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43  MATCH) {.....CAC
82a0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
82b0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
82c0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
82d0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
82e0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
82f0: 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61  st T=0").....sca
8300: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
8310: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
8320: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
8330: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8340: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
8350: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
8360: 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d  TOCOL_T0, &slot-
8370: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8380: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20  tocol);......if 
8390: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
83a0: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
83b0: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
83c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
83d0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
83e0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
83f0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8400: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
8410: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
8420: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8430: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
8440: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
8450: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8460: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8470: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8480: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
8490: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
84a0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
84b0: 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61  ..}....}.....sca
84c0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  rd_conn_ret = ca
84d0: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
84e0: 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63  ard(slot, protoc
84f0: 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  ol, &protocol);.
8500: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
8510: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41  _conn_ret != SCA
8520: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8530: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8540: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
8550: 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65  on to card faile
8560: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8570: 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f  failure (SCardCo
8580: 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69  nnect() = %s/%li
8590: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
85a0: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
85b0: 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e  O_STR(scard_conn
85c0: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
85d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a  ard_conn_ret);..
85e0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
85f0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
8600: 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70  ;...}....slot->p
8610: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
8620: 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e  ed = 1;...slot->
8630: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8640: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74  h = 0;...slot->t
8650: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8660: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73  hw_lock = 0;...s
8670: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
8680: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 43  protocol;..}...C
8690: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
86a0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
86b0: 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65   success");...re
86c0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
86d0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
86e0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
86f0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
8700: 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
8710: 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b  tion(struct cack
8720: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
8730: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
8740: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
8750: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
8760: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
8770: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
8780: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
8790: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
87a0: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
87b0: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
87c0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
87d0: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
87e0: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
87f0: 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73   *     The trans
8800: 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
8810: 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e   terminated usin
8820: 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  g "cackey_end_tr
8830: 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a  ansaction". *. *
8840: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
8850: 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e  ret cackey_begin
8860: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72  _transaction(str
8870: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
8880: 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
8890: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
88a0: 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  _ret;..LONG scar
88b0: 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43  d_trans_ret;...C
88c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
88d0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
88e0: 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  .cackey_conn_ret
88f0: 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
8900: 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
8910: 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  f (cackey_conn_r
8920: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
8930: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
8940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8950: 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  "Unable to conne
8960: 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
8970: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
8980: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8990: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
89a0: 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74  C);..}...slot->t
89b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
89c0: 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ++;...if (slot->
89d0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
89e0: 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e  h > 1 && !slot->
89f0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
8a00: 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41  _hw_lock) {...CA
8a10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a20: 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20  F("Already in a 
8a30: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72  transaction, per
8a40: 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f  forming no actio
8a50: 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25  n (new depth = %
8a60: 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73  i)", slot->trans
8a70: 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a  action_depth);..
8a80: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8a90: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
8aa0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8ab0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8ac0: 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61  = 0;...scard_tra
8ad0: 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65  ns_ret = SCardBe
8ae0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73  ginTransaction(s
8af0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b  lot->pcsc_card);
8b00: 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e  ..if (scard_tran
8b10: 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
8b20: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41  _SUCCESS) {...CA
8b30: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8b40: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67  F("Unable to beg
8b50: 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  in transaction, 
8b60: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72  returning in err
8b70: 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  or");....return(
8b80: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
8b90: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
8ba0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8bb0: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65  ("Sucessfully be
8bc0: 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gan transaction 
8bd0: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8be0: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8bf0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8c00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8c10: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
8c20: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
8c30: 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  et cackey_end_tr
8c40: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8c50: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8c60: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8c70: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
8c80: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
8c90: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
8ca0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
8cb0: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
8cc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
8cd0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8ce0: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8cf0: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8d00: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8d10: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8d20: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
8d30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72   function requir
8d40: 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e  es "cackey_begin
8d50: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f  _transaction" to
8d60: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
8d70: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
8d80: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8d90: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
8da0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8db0: 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f  lot *slot) {..LO
8dc0: 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  NG scard_trans_r
8dd0: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
8de0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
8df0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f  d.");...if (!slo
8e00: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
8e10: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
8e20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8e30: 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e  "Card is not con
8e40: 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74  nected, unable t
8e50: 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  o end transactio
8e60: 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09  n on card");....
8e70: 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  if (slot->transa
8e80: 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29  ction_depth > 0)
8e90: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
8ea0: 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65  UG_PRINTF("Decre
8eb0: 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  asing transactio
8ec0: 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69  n depth and aski
8ed0: 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72  ng for a hardwar
8ee0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65  e lock on the ne
8ef0: 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  xt begin transac
8f00: 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65  tion (current de
8f10: 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74  pth = %i)", slot
8f20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8f30: 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e  pth);.....slot->
8f40: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8f50: 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f  h--;.....if (slo
8f60: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8f70: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
8f80: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8f90: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8fa0: 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09   1;....}...}....
8fb0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8fc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8fd0: 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  }...if (slot->tr
8fe0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8ff0: 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
9000: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
9010: 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61  erminating a tra
9020: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nsaction that ha
9030: 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a  s not begun!");.
9040: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9050: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9060: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
9070: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
9080: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
9090: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
90a0: 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  > 0) {...CACKEY_
90b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72  DEBUG_PRINTF("Tr
90c0: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
90d0: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f   in progress, no
90e0: 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e  t terminating on
90f0: 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  -card Transactio
9100: 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68  n (current depth
9110: 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74   = %i)", slot->t
9120: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
9130: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
9140: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
9150: 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  .}...scard_trans
9160: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54  _ret = SCardEndT
9170: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d  ransaction(slot-
9180: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
9190: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
91a0: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
91b0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
91c0: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
91d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
91e0: 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74  "Unable to end t
91f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75  ransaction, retu
9200: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29  rning in error")
9210: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9220: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9230: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
9240: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
9250: 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e  cessfully termin
9260: 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ated transaction
9270: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
9280: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
9290: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
92a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
92b0: 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74  }../* APDU Relat
92c0: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
92d0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
92e0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
92f0: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
9300: 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  u(struct cackey_
9310: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
9320: 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c  gned char class,
9330: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
9340: 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69  nstruction, unsi
9350: 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e  gned char p1, un
9360: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20  signed char p2, 
9370: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63  unsigned char lc
9380: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9390: 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20  *data, unsigned 
93a0: 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f  char le, uint16_
93b0: 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73  t *respcode, uns
93c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70  igned char *resp
93d0: 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65  data, size_t *re
93e0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a  spdata_len);. *.
93f0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
9400: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
9410: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
9420: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
9430: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
9440: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9450: 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20  r class. *      
9460: 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47     APDU Class (G
9470: 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
9480: 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53  16 or GSCIS_CLAS
9490: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
94a0: 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75  M. *         usu
94b0: 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a  ally), (CLA). *.
94c0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
94d0: 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e  char instruction
94e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
94f0: 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e   Instruction (IN
9500: 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  S). *. *     uns
9510: 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a  igned char p1. *
9520: 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61           APDU Pa
9530: 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20  rameter 1 (P1). 
9540: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9550: 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20  d char p2. *    
9560: 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65       APDU Parame
9570: 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a  ter 2 (P2). *. *
9580: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9590: 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20  ar lc. *        
95a0: 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20   APDU Length of 
95b0: 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20  Content (Lc) -- 
95c0: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
95d0: 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20  th of "data". * 
95e0: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
95f0: 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73  r.  If "data" is
9600: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9610: 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74  LL, this paramet
9620: 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20  er will. *      
9630: 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20     be ignored.. 
9640: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
9650: 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20  d char *data. * 
9660: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
9670: 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e  to buffer to sen
9680: 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65  d.  It should be
9690: 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67   "Lc" bytes long
96a0: 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20  .  If. *        
96b0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
96c0: 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f  LL, "Lc" will no
96d0: 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74  t be sent, and t
96e0: 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20  his buffer will 
96f0: 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67  be. *         ig
9700: 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  nored.. *. *    
9710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9720: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  e. *         APD
9730: 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65  U Length of Expe
9740: 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20  ctation (Le) -- 
9750: 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67  this is the leng
9760: 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20  th of the. *    
9770: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65       expected re
9780: 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73  ply.  If this is
9790: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20   specified as 0 
97a0: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
97b0: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73  . *         be s
97c0: 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  ent.. *. *     u
97d0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
97e0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55  e. *         [OU
97f0: 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  T] Pointer to st
9800: 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65  orage of APDU re
9810: 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66  sponse code.  If
9820: 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20   this is. *     
9830: 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73      specified as
9840: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f   NULL, the respo
9850: 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65  nse code will be
9860: 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20   discarded.. *. 
9870: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9880: 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a  har *respdata. *
9890: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50           [OUT] P
98a0: 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67  ointer to storag
98b0: 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e  e of APDU respon
98c0: 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69  se data.  If thi
98d0: 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20  s is. *         
98e0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
98f0: 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20  L, the response 
9900: 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73  data will be dis
9910: 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20  carded.  If. *  
9920: 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70         the "resp
9930: 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65  data_len" parame
9940: 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64  ter is specified
9950: 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62   as NULL, this b
9960: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
9970: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64   will not be upd
9980: 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ated.. *. *     
9990: 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61  size_t *respdata
99a0: 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  _len. *         
99b0: 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65  [IN, OUT] Pointe
99c0: 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e  r initialing con
99d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65  taining the size
99e0: 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74   of the "respdat
99f0: 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75  a". *         bu
9a00: 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65  ffer.  Before re
9a10: 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69  turning, the poi
9a20: 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73  nted to value is
9a30: 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a   updated to the.
9a40: 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65   *         numbe
9a50: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
9a60: 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  en to the buffer
9a70: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70  .  If this is sp
9a80: 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20  ecified as. *   
9a90: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77        NULL, it w
9aa0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9ab0: 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74  ed, and "respdat
9ac0: 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  a" will be ignor
9ad0: 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20  ed causing. *   
9ae0: 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e        the respon
9af0: 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69  se data to be di
9b00: 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52  scarded.. *. * R
9b10: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
9b20: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
9b30: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e  _OK           On
9b40: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
9b50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9b60: 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72  NERIC      On er
9b70: 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ror. *     CACKE
9b80: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
9b90: 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e  SENT  If the sen
9ba0: 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61  ding failed beca
9bb0: 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73  use the token is
9bc0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  . *             
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20     absent. *. * 
9bf0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
9c00: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
9c10: 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50  connect to the P
9c20: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
9c30: 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20  Manager via. *  
9c40: 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63     cackey_pcsc_c
9c50: 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64  onnect() if need
9c60: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74  ed.. *. *     It
9c70: 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f   will connect to
9c80: 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65   the card in the
9c90: 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64   reader attached
9ca0: 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20   to the slot. * 
9cb0: 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20      specified.  
9cc0: 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63  It will reconnec
9cd0: 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66  t to the card if
9ce0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   the connection.
9cf0: 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79   *     goes away
9d00: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
9d10: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
9d20: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75  y_send_apdu(stru
9d30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
9d40: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
9d50: 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67  har class, unsig
9d60: 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63  ned char instruc
9d70: 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63  tion, unsigned c
9d80: 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64  har p1, unsigned
9d90: 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e   char p2, unsign
9da0: 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67  ed int lc, unsig
9db0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20  ned char *data, 
9dc0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c  unsigned int le,
9dd0: 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63   uint16_t *respc
9de0: 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ode, unsigned ch
9df0: 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69  ar *respdata, si
9e00: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
9e10: 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d  en) {..uint8_t m
9e20: 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72  ajor_rc, minor_r
9e30: 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73  c;..size_t bytes
9e40: 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65  _to_copy, tmp_re
9e50: 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43  spdata_len;..LPC
9e60: 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54  SCARD_IO_REQUEST
9e70: 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57   pioSendPci;..DW
9e80: 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44  ORD protocol;..D
9e90: 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72  WORD xmit_len, r
9ea0: 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73  ecv_len;..LONG s
9eb0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73  card_xmit_ret, s
9ec0: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
9ed0: 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b  ..BYTE xmit_buf[
9ee0: 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b  1024], recv_buf[
9ef0: 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63  1024];..int pcsc
9f00: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63  _connect_ret, pc
9f10: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a  sc_getresp_ret;.
9f20: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
9f30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9f40: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
9f50: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
9f60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9f70: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
9f80: 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09  pecified.");....
9f90: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
9fa0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
9fb0: 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  }...pcsc_connect
9fc0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
9fd0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
9fe0: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
9ff0: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
a000: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
a010: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a020: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
a030: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
a040: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
a050: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
a060: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a070: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
a080: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
a090: 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73  ch protocol to s
a0a0: 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77  end using */..sw
a0b0: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
a0c0: 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53  ocol) {...case S
a0d0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
a0e0: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a0f0: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a100: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a110: 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09  ram is T=0");...
a120: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a130: 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09  CARD_PCI_T0;....
a140: 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53  .break;...case S
a150: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a160: 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
a170: 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63  G_PRINTF("Protoc
a180: 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67  ol to send datag
a190: 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09  ram is T=1");...
a1a0: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a1b0: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a1c0: 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
a1d0: 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
a1e0: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
a1f0: 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e  id protocol foun
a200: 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a  d, aborting.");.
a210: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
a220: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
a230: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73  );..}.../* Trans
a240: 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e  mit */..xmit_len
a250: 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b   = 0;..xmit_buf[
a260: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c  xmit_len++] = cl
a270: 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78  ass;..xmit_buf[x
a280: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73  mit_len++] = ins
a290: 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f  truction;..xmit_
a2a0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a2b0: 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  = p1;..xmit_buf[
a2c0: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32  xmit_len++] = p2
a2d0: 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09  ;..if (data) {..
a2e0: 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b  .if (lc > 255) {
a2f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a300: 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e  _PRINTF("CAUTION
a310: 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67  !  Using an Lc g
a320: 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35 20  reater than 255 
a330: 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63  is untested.  Lc
a340: 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09   = %u", lc);....
a350: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a360: 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a  en++] = 0x82; /*
a370: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a380: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a390: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26  t_len++] = (lc &
a3a0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a3b0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a3c0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78  len++] = lc & 0x
a3d0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ff;...} else {..
a3e0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a3f0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d  len++] = lc;...}
a400: 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
a410: 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b   idx < lc; idx++
a420: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a430: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61  xmit_len++] = da
a440: 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a  ta[idx];...}..}.
a450: 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30  ..if (le != 0x00
a460: 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32  ) {...if (le > 2
a470: 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  56) {....CACKEY_
a480: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a490: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a4a0: 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   Le greater than
a4b0: 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65 64   256 is untested
a4c0: 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29  .  Le = %u", le)
a4d0: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
a4e0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
a4f0: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a500: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a510: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a520: 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (le & 0xff00) >>
a530: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a540: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65  xmit_len++] = le
a550: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a560: 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29  e if (le == 256)
a570: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a580: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30  mit_len++] = 0x0
a590: 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  0;...} else {...
a5a0: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a5b0: 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a  en++] = le;...}.
a5c0: 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d  .}.../* Begin Sm
a5d0: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
a5e0: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
a5f0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
a600: 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c  (slot);...if (cl
a610: 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41  ass == GSCIS_CLA
a620: 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e  SS_ISO7816 && in
a630: 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43  struction == GSC
a640: 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20  IS_INSTR_VERIFY 
a650: 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b  && p1 == 0x00) {
a660: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a670: 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20  PRINTF("Sending 
a680: 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64  APDU: <<censored
a690: 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  >>");..} else {.
a6a0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a6b0: 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67  RINTBUF("Sending
a6c0: 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75   APDU:", xmit_bu
a6d0: 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d  f, xmit_len);..}
a6e0: 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a6f0: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a700: 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  .scard_xmit_ret 
a710: 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28  = SCardTransmit(
a720: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
a730: 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69   pioSendPci, xmi
a740: 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c  t_buf, xmit_len,
a750: 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c   NULL, recv_buf,
a760: 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69   &recv_len);...i
a770: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
a780: 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54  t == SCARD_E_NOT
a790: 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09  _TRANSACTED) {..
a7a0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a7b0: 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20  INTF("Failed to 
a7c0: 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72  send APDU to car
a7d0: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
a7e0: 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69  () = %s/%lx), wi
a7f0: 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66  ll ask calling f
a800: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79  unction to retry
a810: 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20   (not resetting 
a820: 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45  card)...", CACKE
a830: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
a840: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
a850: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75  rd_xmit_ret), (u
a860: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63  nsigned long) sc
a870: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a  ard_xmit_ret);..
a880: 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74  ../* Begin Smart
a890: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
a8a0: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
a8b0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
a8c0: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  t);....return(CA
a8d0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
a8e0: 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61  Y);..}...if (sca
a8f0: 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53  rd_xmit_ret != S
a900: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
a910: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a920: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
a930: 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20  to send APDU to 
a940: 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e 73  card (SCardTrans
a950: 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22  mit() = %s/%lx)"
a960: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
a970: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
a980: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
a990: 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  et), (unsigned l
a9a0: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
a9b0: 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ret);....CACKEY_
a9c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61  DEBUG_PRINTF("Ma
a9d0: 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61  rking slot as ha
a9e0: 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22  ving been reset"
a9f0: 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
aa00: 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
aa10: 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
aa20: 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52  xmit_ret == SCAR
aa30: 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20  D_W_RESET_CARD) 
aa40: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
aa50: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
aa60: 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65  required, please
aa70: 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09   hold...");.....
aa80: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
aa90: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
aaa0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53  ect_card(slot, S
aab0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
aac0: 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f   | SCARD_PROTOCO
aad0: 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  L_T1, &protocol)
aae0: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
aaf0: 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
ab00: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ab10: 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70  ...../* Update p
ab20: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73  rotocol */.....s
ab30: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
ab40: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77  protocol;.....sw
ab50: 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74  itch (slot->prot
ab60: 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73  ocol) {......cas
ab70: 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  e SCARD_PROTOCOL
ab80: 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65  _T0:.......pioSe
ab90: 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43  ndPci = SCARD_PC
aba0: 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65  I_T0;........bre
abb0: 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43  ak;......case SC
abc0: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a  ARD_PROTOCOL_T1:
abd0: 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63  .......pioSendPc
abe0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31  i = SCARD_PCI_T1
abf0: 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
ac00: 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09  .....default:...
ac10: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ac20: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
ac30: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c   protocol found,
ac40: 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f   but too late to
ac50: 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f   do anything abo
ac60: 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79  ut it now -- try
ac70: 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a  ing anyway.");..
ac80: 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
ac90: 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73  .}....../* Re-es
aca0: 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74  tablish transact
acb0: 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70  ion, if it was p
acc0: 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66  resent */.....if
acd0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
ace0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
acf0: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
ad00: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
ad10: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
ad20: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
ad30: 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63  lock = 1;......c
ad40: 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
ad50: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
ad60: 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
ad70: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
ad80: 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c  eset successful,
ad90: 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22   retransmitting"
ada0: 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e  );......recv_len
adb0: 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62   = sizeof(recv_b
adc0: 75 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78  uf);.....scard_x
add0: 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54  mit_ret = SCardT
ade0: 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63  ransmit(slot->pc
adf0: 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64  sc_card, pioSend
ae00: 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78  Pci, xmit_buf, x
ae10: 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72  mit_len, NULL, r
ae20: 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c  ecv_buf, &recv_l
ae30: 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63  en);......if (sc
ae40: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
ae50: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
ae60: 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
ae70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
ae80: 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20  ransmit failed, 
ae90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
aea0: 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63 6f  lure after disco
aeb0: 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61 72  nnecting the car
aec0: 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74  d (SCardTransmit
aed0: 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43   = %s/%li)", CAC
aee0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
aef0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
af00: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
af10: 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69  (long) scard_xmi
af20: 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43  t_ret);.......SC
af30: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
af40: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
af50: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
af60: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73  ;......slot->pcs
af70: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
af80: 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45   = 0;......./* E
af90: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
afa0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
afb0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
afc0: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
afd0: 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  ...cackey_end_tr
afe0: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
aff0: 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41  .......return(CA
b000: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
b010: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a  NABSENT);.....}.
b020: 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
b030: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b040: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
b050: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09  ng card");......
b060: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
b070: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
b080: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
b090: 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63  D);.....slot->pc
b0a0: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
b0b0: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45  d = 0;....../* E
b0c0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b0d0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  nsaction */.....
b0e0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
b0f0: 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09  n_depth = 1;....
b100: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
b110: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
b120: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b130: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
b140: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
b150: 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
b160: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
b170: 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d  BSENT);....}...}
b180: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
b190: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
b1a0: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
b1b0: 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  rd");.....SCardD
b1c0: 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  isconnect(slot->
b1d0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
b1e0: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09  _LEAVE_CARD);...
b1f0: 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  .slot->pcsc_card
b200: 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
b210: 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
b220: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
b230: 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61   */....slot->tra
b240: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
b250: 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   1;....cackey_en
b260: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
b270: 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ot);.....CACKEY_
b280: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
b290: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b2a0: 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  re");....return(
b2b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
b2c0: 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
b2d0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
b2e0: 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74 75  G_PRINTBUF("Retu
b2f0: 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65  rned Value:", re
b300: 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e  cv_buf, recv_len
b310: 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65  );...if (recv_le
b320: 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69  n < 2) {.../* Mi
b330: 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c  nimal response l
b340: 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65 73  ength is 2 bytes
b350: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b360: 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b  ailure */...CACK
b370: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b380: 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d  "Response too sm
b390: 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  all, returning i
b3a0: 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f  n failure (recv_
b3b0: 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e  len = %lu)", (un
b3c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63  signed long) rec
b3d0: 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e  v_len);..../* En
b3e0: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b3f0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63  saction */...cac
b400: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b410: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65  ion(slot);....re
b420: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b430: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
b440: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72  ../* Determine r
b450: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d  esult code */..m
b460: 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62  ajor_rc = recv_b
b470: 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d  uf[recv_len - 2]
b480: 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65  ;..minor_rc = re
b490: 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20  cv_buf[recv_len 
b4a0: 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63  - 1];..if (respc
b4b0: 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f  ode) {...*respco
b4c0: 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c  de = (major_rc <
b4d0: 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b  < 8) | minor_rc;
b4e0: 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20  ..}.../* Adjust 
b4f0: 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20 2a  message buffer *
b500: 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32  /..recv_len -= 2
b510: 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73  ;.../* Add bytes
b520: 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65   to return value
b530: 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74   */..tmp_respdat
b540: 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28  a_len = 0;..if (
b550: 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73 70  respdata && resp
b560: 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d  data_len) {...tm
b570: 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  p_respdata_len =
b580: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a   *respdata_len;.
b590: 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
b5a0: 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e   = *respdata_len
b5b0: 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65  ;....if (recv_le
b5c0: 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  n < bytes_to_cop
b5d0: 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  y) {....bytes_to
b5e0: 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e  _copy = recv_len
b5f0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
b600: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
b610: 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20  pying %lu bytes 
b620: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 28 72  to the buffer (r
b630: 65 63 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c  ecv'd %lu bytes,
b640: 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79   but only %lu by
b650: 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20  tes left in our 
b660: 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67  buffer)", (unsig
b670: 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f  ned long) bytes_
b680: 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e  to_copy, (unsign
b690: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b6a0: 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
b6b0: 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  g) *respdata_len
b6c0: 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73  );....memcpy(res
b6d0: 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c  pdata, recv_buf,
b6e0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b   bytes_to_copy);
b6f0: 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62  ...respdata += b
b700: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09  ytes_to_copy;...
b710: 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d  .*respdata_len =
b720: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
b730: 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c  ..tmp_respdata_l
b740: 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63  en -= bytes_to_c
b750: 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  opy;..} else {..
b760: 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d  .if (recv_len !=
b770: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
b780: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68  DEBUG_PRINTF("Th
b790: 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20  rowing away %lu 
b7a0: 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74  bytes, nowhere t
b7b0: 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75  o put them!", (u
b7c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
b7d0: 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a  cv_len);...}..}.
b7e0: 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d  ..if (major_rc =
b7f0: 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57  = 0x61) {.../* W
b800: 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a  e need to READ *
b810: 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
b820: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
b830: 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29 3b  read required");
b840: 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63  ....if (minor_rc
b850: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d   == 0x00) {....m
b860: 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59  inor_rc = CACKEY
b870: 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a  _APDU_MTU;...}..
b880: 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72  ..pcsc_getresp_r
b890: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
b8a0: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
b8b0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
b8c0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54   GSCIS_INSTR_GET
b8d0: 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c  _RESPONSE, 0x00,
b8e0: 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20   0x00, 0, NULL, 
b8f0: 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f  minor_rc, respco
b900: 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74  de, respdata, &t
b910: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  mp_respdata_len)
b920: 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65  ;....if (pcsc_ge
b930: 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43  tresp_ret != CAC
b940: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
b950: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b960: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
b970: 72 65 61 64 20 66 61 69 6c 65 64 21 20 20 52 65  read failed!  Re
b980: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b990: 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64  re");...../* End
b9a0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b9b0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
b9c0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
b9d0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
b9e0: 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f  f (pcsc_getresp_
b9f0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
ba00: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
ba10: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ba20: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
ba30: 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
ba40: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
ba50: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERIC);...}....if
ba60: 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20   (respdata_len) 
ba70: 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c  {....*respdata_l
ba80: 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61  en += tmp_respda
ba90: 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f  ta_len;...}..../
baa0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
bab0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
bac0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
bad0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
bae0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
baf0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
bb00: 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75 66   in success (buf
bb10: 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74  fer read complet
bb20: 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43  e)");...return(C
bb30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
bb40: 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d  ;..}.../* End Sm
bb50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
bb60: 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
bb70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
bb80: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f  lot);...if (majo
bb90: 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a  r_rc == 0x90) {.
bba0: 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a  ../* Success */.
bbb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bbc0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
bbd0: 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a   in success (maj
bbe0: 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b  or_rc = 0x90)");
bbf0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
bc00: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
bc10: 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
bc20: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52 65  _PRINTF("APDU Re
bc30: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c  turned an error,
bc40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
bc50: 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72  ilure");...retur
bc60: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
bc70: 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73 74 61  GENERIC);.}..sta
bc80: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
bc90: 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  r *cackey_read_b
bca0: 65 72 74 6c 76 5f 74 61 67 28 75 6e 73 69 67 6e  ertlv_tag(unsign
bcb0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
bcc0: 20 73 69 7a 65 5f 74 20 2a 62 75 66 66 65 72 5f   size_t *buffer_
bcd0: 6c 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65 64 20  len_p, unsigned 
bce0: 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69 67 6e  char tag, unsign
bcf0: 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 66  ed char *outbuff
bd00: 65 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75 74 62  er, size_t *outb
bd10: 75 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09  uffer_len_p) {..
bd20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bd30: 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74  uffer_p;..size_t
bd40: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 2c 20   outbuffer_len, 
bd50: 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a  buffer_len;..siz
bd60: 65 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74 20 69  e_t size;..int i
bd70: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
bd80: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
bd90: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  d.");...if (buff
bda0: 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c  er_len_p == NULL
bdb0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
bdc0: 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66 65  UG_PRINTF("buffe
bdd0: 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e  r_len_p is NULL.
bde0: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
bdf0: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65  ailure.");....re
be00: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
be10: 09 69 66 20 28 6f 75 74 62 75 66 66 65 72 5f 6c  .if (outbuffer_l
be20: 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  en_p == NULL) {.
be30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
be40: 52 49 4e 54 46 28 22 6f 75 74 62 75 66 66 65 72  RINTF("outbuffer
be50: 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20  _len_p is NULL. 
be60: 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   Returning in fa
be70: 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74  ilure.");....ret
be80: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
be90: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75  buffer_len = *ou
bea0: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09  tbuffer_len_p;..
beb0: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20  outbuffer_len = 
bec0: 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  *outbuffer_len_p
bed0: 3b 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62  ;...buffer_p = b
bee0: 75 66 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66  uffer;..if (buff
bef0: 65 72 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20  er_p[0] != tag) 
bf00: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bf10: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75  _PRINTF("Tag fou
bf20: 6e 64 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65  nd was not tag e
bf30: 78 70 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20  xpected.  Tag = 
bf40: 25 30 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d  %02x, Expected =
bf50: 20 25 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e   %02x.  Returnin
bf60: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20  g in failure.", 
bf70: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62  (unsigned int) b
bf80: 75 66 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29  uffer_p[0], tag)
bf90: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
bfa0: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  );..}...buffer_p
bfb0: 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d  ++;..buffer_len-
bfc0: 2d 3b 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72  -;...if ((buffer
bfd0: 5f 70 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d  _p[0] & 0x80) ==
bfe0: 20 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20   0x80) {...size 
bff0: 3d 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75  = 0;...idx = (bu
c000: 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66  ffer_p[0] & 0x7f
c010: 29 3b 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20  );....if (idx > 
c020: 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09  buffer_len) {...
c030: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c040: 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20  INTF("Malformed 
c050: 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74  BER value -- not
c060: 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76   enough bytes av
c070: 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20  ailable to read 
c080: 6c 65 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69  length (idx = %i
c090: 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25  , buffer_len = %
c0a0: 6c 75 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69  lu)", idx, (unsi
c0b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65  gned long) buffe
c0c0: 72 5f 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75  r_len);.....retu
c0d0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09  rn(NULL);...}...
c0e0: 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b  .for (; idx > 0;
c0f0: 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66   idx--) {....buf
c100: 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66  fer_p++;....buff
c110: 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69  er_len--;.....si
c120: 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a  ze <<= 8;....siz
c130: 65 20 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d  e |= buffer_p[0]
c140: 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
c150: 09 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f  ..size = buffer_
c160: 70 5b 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65  p[0];..}...buffe
c170: 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c  r_p++;..buffer_l
c180: 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65  en--;...if (size
c190: 20 3e 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e   > outbuffer_len
c1a0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c1b0: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
c1c0: 65 20 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20  e to copy value 
c1d0: 62 75 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66  buffer to outbuf
c1e0: 66 65 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20  fer, not enough 
c1f0: 72 6f 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66  room.  Value buf
c200: 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75  fer length = %lu
c210: 2c 20 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e  , out buffer len
c220: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  gth = %lu", (uns
c230: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
c240: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
c250: 29 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29  ) outbuffer_len)
c260: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
c270: 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66  );..}...*outbuff
c280: 65 72 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b  er_len_p = size;
c290: 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72 29  ..if (outbuffer)
c2a0: 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62   {...memcpy(outb
c2b0: 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c  uffer, buffer_p,
c2c0: 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72   size);...buffer
c2d0: 5f 70 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75  _p += size;...bu
c2e0: 66 66 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65  ffer_len -= size
c2f0: 3b 0a 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e  ;....*buffer_len
c300: 5f 70 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b  _p = buffer_len;
c310: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
c320: 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54  _PRINTBUF("BER-T
c330: 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75  LV results:", ou
c340: 74 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a  tbuffer, size);.
c350: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d  .} else {...memm
c360: 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75 66 66  ove(buffer, buff
c370: 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62  er_p, size);...b
c380: 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72  uffer_p = buffer
c390: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
c3a0: 47 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d  G_PRINTBUF("BER-
c3b0: 54 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62  TLV results:", b
c3c0: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
c3d0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c3e0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
c3f0: 67 20 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53  g in success.  S
c400: 69 7a 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20  ize of contents 
c410: 66 6f 72 20 74 61 67 20 25 30 32 78 20 69 73 20  for tag %02x is 
c420: 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
c430: 69 6e 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67  int) tag, (unsig
c440: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b  ned long) size);
c450: 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65 72  ...return(buffer
c460: 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  _p);.}../*. * SY
c470: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73  NPOSIS. *     ss
c480: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
c490: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
c4a0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c4b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c4c0: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
c4d0: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
c4e0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b  ed char oid[3]);
c4f0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
c500: 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63  . *     struct c
c510: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
c520: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
c530: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
c540: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75  s to. *. *     u
c550: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
c560: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
c570: 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a  [OUT] Buffer. *.
c580: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75   *     size_t bu
c590: 66 66 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20  ffer_len. *     
c5a0: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
c5b0: 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74  tes to attempt t
c5c0: 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20  o read. *. *    
c5d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
c5e0: 69 64 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20  id[3]. *        
c5f0: 20 33 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72   3-byte OID to r
c600: 65 61 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54  ead. *. *. * RET
c610: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
c620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
c630: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
c640: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
c650: 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20  lly read, or -1 
c660: 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20  on error.. *. * 
c670: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  NOTES. *     Non
c680: 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  e. *. */.static 
c690: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67  ssize_t cackey_g
c6a0: 65 74 5f 64 61 74 61 28 73 74 72 75 63 74 20 63  et_data(struct c
c6b0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
c6c0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c6d0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
c6e0: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69  buffer_len, unsi
c6f0: 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d  gned char oid[3]
c700: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
c710: 61 72 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43  ar cmd[] = {0x5C
c720: 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78  , 0x03, 0x00, 0x
c730: 30 30 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69  00, 0x00};..unsi
c740: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c750: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  r_p;..size_t ini
c760: 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69  t_buffer_len, si
c770: 7a 65 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ze;..uint16_t re
c780: 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e  spcode;..int sen
c790: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
c7a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
c7b0: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f  lled.");...init_
c7c0: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66  buffer_len = buf
c7d0: 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32  fer_len;...cmd[2
c7e0: 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64  ] = oid[0];..cmd
c7f0: 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63  [3] = oid[1];..c
c800: 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a  md[4] = oid[2];.
c810: 0a 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69  ../* 256 to indi
c820: 63 61 74 65 20 74 68 65 20 6c 61 72 67 65 73 74  cate the largest
c830: 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d   message size --
c840: 20 6e 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68   not clear if th
c850: 69 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74  is will work wit
c860: 68 20 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a  h all messages *
c870: 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
c880: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
c890: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
c8a0: 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50  _ISO7816, NISTSP
c8b0: 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
c8c0: 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30  ET_DATA, 0x3F, 0
c8d0: 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  xFF, sizeof(cmd)
c8e0: 2c 20 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73  , cmd, 256, &res
c8f0: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26  pcode, buffer, &
c900: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69  buffer_len);...i
c910: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
c920: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
c930: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  RY) {...CACKEY_D
c940: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
c950: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
c960: 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20  , retrying read 
c970: 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74  buffer");....ret
c980: 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64  urn(cackey_get_d
c990: 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72  ata(slot, buffer
c9a0: 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65  , init_buffer_le
c9b0: 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69  n, oid));..}...i
c9c0: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
c9d0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
c9e0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c9f0: 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
ca00: 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69  _send_apdu() fai
ca10: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
ca20: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
ca30: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
ca40: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
ca50: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
ca60: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
ca70: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e  ..if (buffer_len
ca80: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
ca90: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
caa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
cab0: 61 64 20 62 79 74 65 73 20 28 62 75 66 66 65 72  ad bytes (buffer
cac0: 5f 6c 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61  _len) exceeds ma
cad0: 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
cae0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
caf0: 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62  e. (max = %li, b
cb00: 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29  uffer_len = %lu)
cb10: 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
cb20: 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
cb30: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66  igned long) buff
cb40: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  er_len);....retu
cb50: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
cb60: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  dif.#endif...if 
cb70: 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29  (buffer_len < 2)
cb80: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cb90: 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47  G_PRINTF("APDU G
cba0: 45 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64  ET DATA returned
cbb0: 20 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63   %lu bytes, whic
cbc0: 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66  h is too short f
cbd0: 6f 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73  or a BER-TLV res
cbe0: 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65  ponse", (unsigne
cbf0: 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c  d long) buffer_l
cc00: 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  en);....return(-
cc10: 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20  1);..}...size = 
cc20: 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66  buffer_len;..buf
cc30: 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72  fer_p = cackey_r
cc40: 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62  ead_bertlv_tag(b
cc50: 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c  uffer, &buffer_l
cc60: 65 6e 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20  en, 0x53, NULL, 
cc70: 26 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75  &size);...if (bu
cc80: 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  ffer_p == NULL) 
cc90: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
cca0: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 64 65 63  _PRINTF("Tag dec
ccb0: 6f 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65  oding failed, re
ccc0: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
ccd0: 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  .");....return(-
cce0: 31 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  1);..}...CACKEY_
ccf0: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
cd00: 47 45 54 20 44 41 54 41 20 72 65 73 75 6c 74 22  GET DATA result"
cd10: 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b  , buffer, size);
cd20: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
cd30: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
cd40: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
cd50: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
cd60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
cd70: 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73  ize);...return(s
cd80: 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  ize);.}../*. * S
cd90: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73  YNPOSIS. *     s
cda0: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65  size_t cackey_re
cdb0: 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74  ad_buffer(struct
cdc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
cdd0: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
cde0: 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f  r *buffer, size_
cdf0: 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65  t count, unsigne
ce00: 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73  d char t_or_v, s
ce10: 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66  ize_t initial_of
ce20: 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  fset);. *. * ARG
ce30: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
ce40: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
ce50: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
ce60: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
ce70: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
ce80: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
ce90: 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20  ar *buffer. *   
cea0: 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66        [OUT] Buff
ceb0: 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a  er. *. *     siz
cec0: 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20  e_t count. *    
ced0: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
cee0: 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20  ytes to attempt 
cef0: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20  to read. *. *   
cf00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
cf10: 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20  t_or_v. *       
cf20: 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62    Select the T-b
cf30: 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d  uffer (01) or V-
cf40: 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20 72  buffer (02) to r
cf50: 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20  ead from.  . *. 
cf60: 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69  *     size_t ini
cf70: 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20  tial_offset. *  
cf80: 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74         Specify t
cf90: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  he offset to beg
cfa0: 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d  in the read from
cfb0: 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  . *. *. * RETURN
cfc0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68   VALUE. *     Th
cfd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
cfe0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
cff0: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
d000: 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20   read, or -1 on 
d010: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54  error.. *. * NOT
d020: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
d030: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
d040: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
d050: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
d060: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d070: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d080: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
d090: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
d0a0: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
d0b0: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
d0c0: 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  et) {..unsigned 
d0d0: 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65  char *init_buffe
d0e0: 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  r;..size_t init_
d0f0: 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69  count;..size_t i
d100: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
d110: 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66  et;...size_t off
d120: 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66  set = 0, max_off
d130: 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  set, max_count;.
d140: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
d150: 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74  md[2];..uint16_t
d160: 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20   respcode;..int 
d170: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
d180: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d190: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e  "Called.");...in
d1a0: 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66  it_buffer = buff
d1b0: 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20  er;..init_count 
d1c0: 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69  = count;..init_i
d1d0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20  nitial_offset = 
d1e0: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a  initial_offset;.
d1f0: 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63  ..max_offset = c
d200: 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74  ount;..max_count
d210: 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
d220: 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76  TU;...if (t_or_v
d230: 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20   != 1 && t_or_v 
d240: 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 2) {...CACKEY
d250: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
d260: 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61  nvalid T or V pa
d270: 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
d280: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
d290: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
d2a0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63  turn(-1);..}...c
d2b0: 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a  md[0] = t_or_v;.
d2c0: 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09  ..while (1) {...
d2d0: 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61  if (offset >= ma
d2e0: 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43  x_offset) {....C
d2f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d300: 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73  TF("Buffer too s
d310: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
d320: 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29  what we got...")
d330: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
d340: 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
d350: 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b  offset - offset;
d360: 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d  ...if (count > m
d370: 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63  ax_count) {....c
d380: 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74  ount = max_count
d390: 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20  ;...}....cmd[1] 
d3a0: 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64  = count;....send
d3b0: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
d3c0: 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53  nd_apdu(slot, GS
d3d0: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
d3e0: 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53  _PLATFORM, GSCIS
d3f0: 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46  _INSTR_READ_BUFF
d400: 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66  ER, ((initial_of
d410: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e  fset + offset) >
d420: 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e  > 8) & 0xff, (in
d430: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
d440: 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20 73  ffset) & 0xff, s
d450: 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c  izeof(cmd), cmd,
d460: 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65   0x00, &respcode
d470: 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65  , buffer + offse
d480: 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69  t, &count);....i
d490: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
d4a0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
d4b0: 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  RY) {....CACKEY_
d4c0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
d4d0: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
d4e0: 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64  d, retrying read
d4f0: 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72   buffer");.....r
d500: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61  eturn(cackey_rea
d510: 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69  d_buffer(slot, i
d520: 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74  nit_buffer, init
d530: 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20  _count, t_or_v, 
d540: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
d550: 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66  set));...}....if
d560: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
d570: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
d580: 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f 64  {....if (respcod
d590: 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09  e == 0x6A86) {..
d5a0: 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74  ...if (max_count
d5b0: 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72   == 1) {......br
d5c0: 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
d5d0: 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  max_count = max_
d5e0: 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09  count / 2;......
d5f0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
d600: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d610: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
d620: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
d630: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
d640: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72  failure");.....r
d650: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
d660: 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e  ..offset += coun
d670: 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20  t;....if (count 
d680: 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09  < max_count) {..
d690: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d6a0: 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61  RINTF("Short rea
d6b0: 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c  d -- count = %i,
d6c0: 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28   cmd[1] = %i", (
d6d0: 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74  int) count, (int
d6e0: 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62  ) cmd[1]);.....b
d6f0: 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  reak;...}..}..#i
d700: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
d710: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
d720: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
d730: 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f  if (offset > _PO
d740: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
d750: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d760: 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65  PRINTF("Offset e
d770: 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76  xceeds maximum v
d780: 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  alue, returning 
d790: 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78  in failure. (max
d7a0: 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d   = %li, offset =
d7b0: 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
d7c0: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
d7d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
d7e0: 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74   offset);....ret
d7f0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
d800: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ndif.#endif...CA
d810: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d820: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
d830: 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c  success, read %l
d840: 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67  u bytes", (unsig
d850: 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74  ned long) offset
d860: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73  );...return(offs
d870: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  et);.}../*. * SY
d880: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61  NPOSIS. *     ca
d890: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
d8a0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74  select_applet(st
d8b0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
d8c0: 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
d8d0: 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65   char *aid, size
d8e0: 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a  _t aid_len);. *.
d8f0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
d900: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
d910: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
d920: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
d930: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
d940: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
d950: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a  ned char *aid. *
d960: 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72 20           Buffer 
d970: 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65  containing Apple
d980: 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20  t ID to select. 
d990: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
d9a0: 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20  aid_len. *      
d9b0: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
d9c0: 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22 20  es in the "aid" 
d9d0: 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72 61  (Applet ID) para
d9e0: 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55  meter. *. * RETU
d9f0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
da00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
da10: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
da20: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
da30: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
da40: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
da50: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
da60: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  None. *. */.stat
da70: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
da80: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
da90: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
daa0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
dab0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
dac0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
dad0: 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74   {..int send_ret
dae0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
daf0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
db00: 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
db10: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c  UG_PRINTBUF("Sel
db20: 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c  ecting applet:",
db30: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a   aid, aid_len);.
db40: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
db50: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
db60: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
db70: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
db80: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43  NSTR_SELECT, GSC
db90: 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f  IS_PARAM_SELECT_
dba0: 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69  APPLET, 0x00, ai
dbb0: 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30  d_len, aid, 0x00
dbc0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
dbd0: 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
dbe0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
dbf0: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
dc00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dc10: 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e  NTF("ADPU Sendin
dc20: 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69  g failed, retryi
dc30: 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74  ng select applet
dc40: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61  ");....return(ca
dc50: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
dc60: 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69  et(slot, aid, ai
dc70: 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66  d_len));..}...if
dc80: 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
dc90: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
dca0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
dcb0: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
dcc0: 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20  to open applet, 
dcd0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
dce0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
dcf0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
dd00: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43  GENERIC);..}...C
dd10: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
dd20: 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  TF("Successfully
dd30: 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29   selected file")
dd40: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
dd50: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
dd60: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
dd70: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
dd80: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
dd90: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
dda0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
ddb0: 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a  int16_t ef);. *.
ddc0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
ddd0: 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65      struct cacke
dde0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
ddf0: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
de00: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
de10: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31  . *. *     uint1
de20: 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20  6_t ef. *       
de30: 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65    Elemental File
de40: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a   to select. *. *
de50: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
de60: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
de70: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
de80: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
de90: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
dea0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
deb0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
dec0: 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63 74       This select
ded0: 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20  s an Elementary 
dee0: 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20  File (EF) under 
def0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65  the currently se
df00: 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65  lected. *     De
df10: 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44 46  dicated File (DF
df20: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69  ). *. *     Typi
df30: 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61  cally this is ca
df40: 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65 63  lled after selec
df50: 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74  ting the correct
df60: 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20   Applet (using. 
df70: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c  *     cackey_sel
df80: 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20  ect_applet) for 
df90: 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a  VM cards. *. */.
dfa0: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
dfb0: 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  t cackey_select_
dfc0: 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b  file(struct cack
dfd0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
dfe0: 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75  int16_t ef) {..u
dff0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69 64  nsigned char fid
e000: 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65  _buf[2];..int se
e010: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
e020: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
e030: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f  alled.");.../* O
e040: 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61  pen the elementa
e050: 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f  ry file */..fid_
e060: 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20  buf[0] = (ef >> 
e070: 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f  8) & 0xff;..fid_
e080: 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78  buf[1] = ef & 0x
e090: 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ff;...CACKEY_DEB
e0a0: 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63  UG_PRINTF("Selec
e0b0: 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78  ting file: %04lx
e0c0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
e0d0: 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72  g) ef);...send_r
e0e0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
e0f0: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
e100: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
e110: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
e120: 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c  ECT, 0x02, 0x0C,
e130: 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29   sizeof(fid_buf)
e140: 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c  , fid_buf, 0x00,
e150: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
e160: 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  L);..if (send_re
e170: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
e180: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
e190: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e1a0: 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66  Failed to open f
e1b0: 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ile, returning i
e1c0: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
e1d0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
e1e0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
e1f0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
e200: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
e210: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
e220: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
e230: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
e240: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
e250: 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64  OSIS. *     void
e260: 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76   cackey_free_tlv
e270: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  (struct cackey_t
e280: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29  lv_entity *root)
e290: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
e2a0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
e2b0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
e2c0: 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20  y *root. *      
e2d0: 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54     Root of the T
e2e0: 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74  LV list to start
e2f0: 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52   freeing. *. * R
e300: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
e310: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
e320: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
e330: 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74  function frees t
e340: 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69  he TLV linked li
e350: 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66 72  sted returned fr
e360: 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65  om. *     "cacke
e370: 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20  y_read_tlv". *. 
e380: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e390: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
e3a0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e3b0: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b  _entity *root) {
e3c0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
e3d0: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72  tlv_entity *curr
e3e0: 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72  , *next;...if (r
e3f0: 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  oot == NULL) {..
e400: 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
e410: 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20  r (curr = root; 
e420: 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78  curr; curr = nex
e430: 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75  t) {...next = cu
e440: 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77  rr->_next;....sw
e450: 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29  itch (curr->tag)
e460: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
e470: 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a  _TAG_ACR_TABLE:.
e480: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
e490: 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  G_CERTIFICATE:..
e4a0: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
e4b0: 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
e4c0: 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09  curr->value);...
e4d0: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
e4e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
e4f0: 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66  _CARDURL:.....if
e500: 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61   (curr->value_ca
e510: 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72  rdurl) {......fr
e520: 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  ee(curr->value_c
e530: 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09  ardurl);.....}..
e540: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
e550: 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a  .free(curr);..}.
e560: 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  ..return;.}../*.
e570: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
e580: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
e590: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
e5a0: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
e5b0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
e5c0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
e5d0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
e5e0: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
e5f0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
e600: 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73  ackey_read_tlv(s
e610: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
e620: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75  t *slot) {..stru
e630: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e  ct cackey_tlv_en
e640: 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74  tity *curr_entit
e650: 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c  y, *root = NULL,
e660: 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09   *last = NULL;..
e670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c  unsigned char tl
e680: 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f  en_buf[2], tval_
e690: 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c  buf[1024], *tval
e6a0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
e6b0: 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76   vlen_buf[2], vv
e6c0: 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76  al_buf[8192], *v
e6d0: 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  val;..unsigned c
e6e0: 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e  har *tmpbuf;..un
e6f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62  signed long tmpb
e700: 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20  uflen;..ssize_t 
e710: 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69  tlen, vlen;..ssi
e720: 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09  ze_t read_ret;..
e730: 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20  size_t offset_t 
e740: 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20  = 0, offset_v = 
e750: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  0;..unsigned cha
e760: 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  r tag;..size_t l
e770: 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41  ength;.#ifdef HA
e780: 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63  VE_LIBZ..int unc
e790: 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e  ompress_ret;.#en
e7a0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
e7b0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
e7c0: 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74  d.");...read_ret
e7d0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e7e0: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e  uffer(slot, tlen
e7f0: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65  _buf, sizeof(tle
e800: 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65  n_buf), 1, offse
e810: 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_t);..if (read_
e820: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c  ret != sizeof(tl
e830: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
e840: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e850: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
e860: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e870: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
e880: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65  (NULL);..}...tle
e890: 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d  n = (tlen_buf[1]
e8a0: 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75   << 8) | tlen_bu
e8b0: 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74  f[0];...read_ret
e8c0: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e8d0: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e  uffer(slot, vlen
e8e0: 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65  _buf, sizeof(vle
e8f0: 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65  n_buf), 2, offse
e900: 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f  t_v);..if (read_
e910: 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c  ret != sizeof(vl
e920: 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  en_buf)) {...CAC
e930: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e940: 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72  ("Read failed, r
e950: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e960: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
e970: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65  (NULL);..}...vle
e980: 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d  n = (vlen_buf[1]
e990: 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75   << 8) | vlen_bu
e9a0: 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  f[0];...CACKEY_D
e9b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67  EBUG_PRINTF("Tag
e9c0: 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56   Length = %lu, V
e9d0: 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c  alue Length = %l
e9e0: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
e9f0: 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67  ng) tlen, (unsig
ea00: 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b  ned long) vlen);
ea10: 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32  ...offset_t += 2
ea20: 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32  ;..offset_v += 2
ea30: 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73  ;...if (tlen > s
ea40: 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29  izeof(tval_buf))
ea50: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
ea60: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65  G_PRINTF("Tag le
ea70: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
ea80: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
ea90: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
eaa0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
eab0: 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65  .if (vlen > size
eac0: 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a  of(vval_buf)) {.
ead0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eae0: 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e  RINTF("Value len
eaf0: 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  gth is too large
eb00: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
eb10: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
eb20: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
eb30: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
eb40: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
eb50: 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c  ot, tval_buf, tl
eb60: 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29  en, 1, offset_t)
eb70: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
eb80: 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != tlen) {...CAC
eb90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
eba0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
ebb0: 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72   entire T-buffer
ebc0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ebd0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
ebe0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
ebf0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
ec00: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
ec10: 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c  ot, vval_buf, vl
ec20: 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29  en, 2, offset_v)
ec30: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
ec40: 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43  != vlen) {...CAC
ec50: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
ec60: 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64  ("Unable to read
ec70: 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72   entire V-buffer
ec80: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ec90: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
eca0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
ecb0: 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b  tval = tval_buf;
ecc0: 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75  ..vval = vval_bu
ecd0: 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20  f;..while (tlen 
ece0: 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29  > 0 && vlen > 0)
ecf0: 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c   {...tag = *tval
ed00: 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c  ;...tval++;...tl
ed10: 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76  en--;....if (*tv
ed20: 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09  al == 0xff) {...
ed30: 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b  .length = (tval[
ed40: 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b  2] << 8) | tval[
ed50: 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33  1];....tval += 3
ed60: 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a  ;....tlen -= 3;.
ed70: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65  ..} else {....le
ed80: 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09  ngth = *tval;...
ed90: 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e  .tval++;....tlen
eda0: 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  --;...}....CACKE
edb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
edc0: 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c  Tag: %s (%02x)",
edd0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
ede0: 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61  NC_TAG_TO_STR(ta
edf0: 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  g), (unsigned in
ee00: 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45  t) tag);...CACKE
ee10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
ee20: 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c  ("Value:", vval,
ee30: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72   length);....cur
ee40: 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  r_entity = NULL;
ee50: 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29 20  ...switch (tag) 
ee60: 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  {....case GSCIS_
ee70: 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09  TAG_CARDURL:....
ee80: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
ee90: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
eea0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  rr_entity));....
eeb0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
eec0: 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61  lue_cardurl = ma
eed0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
eee0: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
eef0: 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09  cardurl));......
ef00: 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69  memcpy(curr_enti
ef10: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
ef20: 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29  l->rid, vval, 5)
ef30: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ef40: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
ef50: 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c  ->apptype = vval
ef60: 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [5];.....curr_en
ef70: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
ef80: 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20  url->objectid = 
ef90: 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c  (vval[6] << 8) |
efa0: 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75   vval[7];.....cu
efb0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
efc0: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
efd0: 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29  = (vval[8] << 8)
efe0: 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09   | vval[9];.....
eff0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61  .curr_entity->ta
f000: 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72  g = tag;.....cur
f010: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
f020: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
f030: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
f040: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
f050: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f060: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f070: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
f080: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
f090: 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09  lloc(length);...
f0a0: 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66  ...memcpy(tmpbuf
f0b0: 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b  , vval, length);
f0c0: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
f0d0: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
f0e0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c  ..curr_entity->l
f0f0: 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a  ength = length;.
f100: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f110: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
f120: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f130: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
f140: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
f150: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
f160: 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63  RTIFICATE:.....c
f170: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
f180: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
f190: 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64  _entity));..#ifd
f1a0: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09  ef HAVE_LIBZ....
f1b0: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
f1c0: 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70  gth * 2;.....tmp
f1d0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70  buf = malloc(tmp
f1e0: 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e  buflen);......un
f1f0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75  compress_ret = u
f200: 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66  ncompress(tmpbuf
f210: 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76  , &tmpbuflen, vv
f220: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09  al, length);....
f230: 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f  .if (uncompress_
f240: 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09  ret != Z_OK) {..
f250: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f260: 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
f270: 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75  to decompress, u
f280: 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75  ncompress() retu
f290: 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72  rned %i -- resor
f2a0: 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63  ting to direct c
f2b0: 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73  opy", uncompress
f2c0: 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70  _ret);.......tmp
f2d0: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b  buflen = length;
f2e0: 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ......memcpy(tmp
f2f0: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
f300: 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  h);.....}......C
f310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f320: 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73  TBUF("Decompress
f330: 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c  ed to:", tmpbuf,
f340: 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c   tmpbuflen);.#el
f350: 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  se.....CACKEY_DE
f360: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73  BUG_PRINTF("Miss
f370: 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74  ing ZLIB Support
f380: 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61  , this certifica
f390: 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65  te is likely use
f3a0: 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09  less...");......
f3b0: 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67  tmpbuflen = leng
f3c0: 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  th;.....memcpy(t
f3d0: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
f3e0: 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09  gth);.#endif....
f3f0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
f400: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
f410: 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74  rr_entity->lengt
f420: 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  h = tmpbuflen;..
f430: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f440: 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a  value = tmpbuf;.
f450: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f460: 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a  >_next = NULL;..
f470: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
f480: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  se GSCIS_TAG_PKC
f490: 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  S15:.....curr_en
f4a0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
f4b0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
f4c0: 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65  y));......curr_e
f4d0: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
f4e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
f4f0: 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20  y->value_byte = 
f500: 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72  vval[0];.....cur
f510: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
f520: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
f530: 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20  ak;...}....vval 
f540: 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65  += length;...vle
f550: 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09  n -= length;....
f560: 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20  if (curr_entity 
f570: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  != NULL) {....if
f580: 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20   (root == NULL) 
f590: 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72  {.....root = cur
f5a0: 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a  r_entity;....}..
f5b0: 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e  ...if (last != N
f5c0: 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d  ULL) {.....last-
f5d0: 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e  >_next = curr_en
f5e0: 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c  tity;....}.....l
f5f0: 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74  ast = curr_entit
f600: 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  y;...}..}...retu
f610: 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(root);.}../*.
f620: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
f630: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
f640: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
f650: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
f660: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
f670: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f680: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
f690: 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79  atic void cackey
f6a0: 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72 75  _free_certs(stru
f6b0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f6c0: 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
f6d0: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e  size_t count, in
f6e0: 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a  t free_start) {.
f6f0: 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
f700: 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
f710: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
f720: 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
f730: 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64   idx < count; id
f740: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61  x++) {...if (sta
f750: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f760: 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73  ate) {....free(s
f770: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
f780: 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  icate);...}..}..
f790: 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74 29  .if (free_start)
f7a0: 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74 29   {...free(start)
f7b0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
f7c0: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
f7d0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f7e0: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70  tity *cackey_cop
f7f0: 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  y_certs(struct c
f800: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
f810: 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63  ity *dest, struc
f820: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
f830: 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73  entity *start, s
f840: 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09  ize_t count) {..
f850: 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66  size_t idx;...if
f860: 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29   (start == NULL)
f870: 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c   {...return(NULL
f880: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74  );..}...if (dest
f890: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65   == NULL) {...de
f8a0: 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  st = malloc(size
f8b0: 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e  of(*dest) * coun
f8c0: 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  t);..}...for (id
f8d0: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75  x = 0; idx < cou
f8e0: 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64  nt; idx++) {...d
f8f0: 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65  est[idx].id_type
f900: 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64   = start[idx].id
f910: 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68  _type;....switch
f920: 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74   (dest[idx].id_t
f930: 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
f940: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
f950: 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65  C:.....memcpy(de
f960: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
f970: 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69  .applet, start[i
f980: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70  dx].card.cac.app
f990: 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74  let, sizeof(dest
f9a0: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
f9b0: 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73  pplet));.....des
f9c0: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f9d0: 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78  file = start[idx
f9e0: 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b  ].card.cac.file;
f9f0: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
fa00: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
fa10: 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74  PE_PIV:.....dest
fa20: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b  [idx].card.piv.k
fa30: 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64  ey_id = start[id
fa40: 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  x].card.piv.key_
fa50: 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 64  id;.....memcpy(d
fa60: 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  est[idx].card.pi
fa70: 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b 69  v.label, start[i
fa80: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61 62  dx].card.piv.lab
fa90: 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b  el, sizeof(dest[
faa0: 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61  idx].card.piv.la
fab0: 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61 6b  bel));.....break
fac0: 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
fad0: 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
fae0: 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  LY:.....break;..
faf0: 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .}...dest[idx].c
fb00: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
fb10: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74   start[idx].cert
fb20: 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64  ificate_len;...d
fb30: 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65  est[idx].keysize
fb40: 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65   = start[idx].ke
fb50: 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69  ysize;....dest[i
fb60: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20  dx].certificate 
fb70: 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64  = malloc(dest[id
fb80: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
fb90: 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65  en);...memcpy(de
fba0: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fbb0: 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e  ate, start[idx].
fbc0: 63 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 73  certificate, des
fbd0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
fbe0: 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  te_len);..}...re
fbf0: 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f  turn(dest);.}../
fc00: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
fc10: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
fc20: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
fc30: 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
fc40: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
fc50: 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
fc60: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
fc70: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
fc80: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
fc90: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
fca0: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
fcb0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
fcc0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
fcd0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72  sc_identity *cer
fce0: 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ts, unsigned lon
fcf0: 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72  g *count) {..str
fd00: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
fd10: 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
fd20: 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  d;..struct cacke
fd30: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63  y_tlv_entity *cc
fd40: 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72  c_tlv, *ccc_curr
fd50: 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70  , *app_tlv, *app
fd60: 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64  _curr;..unsigned
fd70: 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20   char ccc_aid[] 
fd80: 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43  = {GSCIS_AID_CCC
fd90: 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b  }, piv_aid[] = {
fda0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50  NISTSP800_73_3_P
fdb0: 49 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e  IV_AID};..unsign
fdc0: 65 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64  ed char *piv_oid
fdd0: 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74  , piv_oid_pivaut
fde0: 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30  h[] = {NISTSP800
fdf0: 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54  _73_3_OID_PIVAUT
fe00: 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e  H}, piv_oid_sign
fe10: 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53  ature[] = {NISTS
fe20: 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49  P800_73_3_OID_SI
fe30: 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69  GNATURE}, piv_oi
fe40: 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49  d_keymgt[] = {NI
fe50: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44  STSP800_73_3_OID
fe60: 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67  _KEYMGT};..unsig
fe70: 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69  ned char curr_ai
fe80: 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20  d[7];..unsigned 
fe90: 63 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32  char buffer[8192
fea0: 5d 2c 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 75  ], *buffer_p;..u
feb0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75 74  nsigned long out
fec0: 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72 20 2a  idx = 0;..char *
fed0: 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61 63 6b  piv_label;..cack
fee0: 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74 69  ey_ret transacti
fef0: 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f 74  on_ret;..ssize_t
ff00: 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65   read_ret;..size
ff10: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09  _t buffer_len;..
ff20: 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61  int certs_resiza
ff30: 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  ble;..int send_r
ff40: 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a  et, select_ret;.
ff50: 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69  .int piv_key, pi
ff60: 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b  v = 0;..int idx;
ff70: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ff80: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
ff90: 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d  );...if (count =
ffa0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
ffb0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ffc0: 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  "count is NULL, 
ffd0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
ffe0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
fff0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66  n(NULL);..}...if
10000 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29   (certs != NULL)
10010 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20   {...if (*count 
10020 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  == 0) {....CACKE
10030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10040 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65 74  Requested we ret
10050 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73  urn 0 objects, s
10060 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a  hort-circuit");.
10070 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73  ....return(certs
10080 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
10090 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65  !slot->slot_rese
100a0 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d  t) {...if (slot-
100b0 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
100c0 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d  ....if (certs ==
100d0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72   NULL) {.....cer
100e0 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ts = malloc(size
100f0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f  of(*certs) * slo
10100 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
10110 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75  count);.....*cou
10120 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt = slot->cache
10130 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a  d_certs_count;..
10140 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
10150 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f  if (*count > slo
10160 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
10170 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63  count) {......*c
10180 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63  ount = slot->cac
10190 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b  hed_certs_count;
101a0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
101b0 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74  cackey_copy_cert
101c0 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  s(certs, slot->c
101d0 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f  ached_certs, *co
101e0 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  unt);.....return
101f0 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a  (certs);...}..}.
10200 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68  ..if (slot->cach
10210 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61  ed_certs) {...ca
10220 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
10230 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
10240 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  ts, slot->cached
10250 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29  _certs_count, 1)
10260 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65  ;....slot->cache
10270 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  d_certs = NULL;.
10280 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20  .}.../* Begin a 
10290 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73 61  SmartCard transa
102a0 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61  ction */..transa
102b0 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b  ction_ret = cack
102c0 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  ey_begin_transac
102d0 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20  tion(slot);..if 
102e0 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74  (transaction_ret
102f0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
10300 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
10310 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
10320 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e  nable begin tran
10330 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69  saction, returni
10340 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
10350 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
10360 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73  ;..}...if (certs
10370 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65   == NULL) {...ce
10380 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
10390 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29  eof(*certs) * 5)
103a0 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a  ;...*count = 5;.
103b0 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  ..certs_resizabl
103c0 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b  e = 1;..} else {
103d0 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
103e0 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20  le = 0;..}.../* 
103f0 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20 41  Select the CCC A
10400 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72  pplet */..send_r
10410 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
10420 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20  ct_applet(slot, 
10430 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  ccc_aid, sizeof(
10440 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28  ccc_aid));..if (
10450 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
10460 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
10470 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70  ../* Try PIV app
10480 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65  lication */...se
10490 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
104a0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
104b0 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a  ot, piv_aid, siz
104c0 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09  eof(piv_aid));..
104d0 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
104e0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
104f0 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  K) {....CACKEY_D
10500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20  EBUG_PRINTF("We 
10510 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64 20  have a PIV card 
10520 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65  -- not using the
10530 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72   CCC, pulling pr
10540 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22  e-selected keys"
10550 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a  );.....piv = 1;.
10560 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
10570 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10580 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c  F("Unable to sel
10590 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20  ect CCC Applet, 
105a0 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
105b0 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54  lure");...../* T
105c0 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61  erminate SmartCa
105d0 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
105e0 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  /....cackey_end_
105f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
10600 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55  );.....return(NU
10610 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  LL);...}..}...if
10620 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28   (piv) {...for (
10630 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33  idx = 0; idx < 3
10640 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77  ; idx++) {....sw
10650 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09  itch (idx) {....
10660 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69  .case 0:......pi
10670 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
10680 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69  pivauth;......pi
10690 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30  v_key = NISTSP80
106a0 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55  0_78_3_KEY_PIVAU
106b0 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62  TH;......piv_lab
106c0 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63 61  el = "Authentica
106d0 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65 61  tion";......brea
106e0 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09  k;.....case 1:..
106f0 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69  ....piv_oid = pi
10700 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b  v_oid_signature;
10710 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
10720 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
10730 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09  EY_SIGNATURE;...
10740 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
10750 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09 09  Signature";.....
10760 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
10770 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   2:......piv_oid
10780 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67   = piv_oid_keymg
10790 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20  t;......piv_key 
107a0 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  = NISTSP800_78_3
107b0 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09  _KEY_KEYMGT;....
107c0 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22 4b  ..piv_label = "K
107d0 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b 0a  ey Management";.
107e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
107f0 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20  .....read_ret = 
10800 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28  cackey_get_data(
10810 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69  slot, buffer, si
10820 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69  zeof(buffer), pi
10830 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28  v_oid);.....if (
10840 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
10850 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
10860 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20  ..}.....curr_id 
10870 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
10880 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  ;....outidx++;..
10890 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73  ...curr_id->keys
108a0 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72  ize = -1;....cur
108b0 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
108c0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
108d0 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  IV;....curr_id->
108e0 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20  card.piv.key_id 
108f0 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d 65  = piv_key;....me
10900 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 61  mcpy(curr_id->ca
10910 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70 69  rd.piv.label, pi
10920 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e 28  v_label, strlen(
10930 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29 3b  piv_label) + 1);
10940 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
10950 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
10960 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72  read_ret;....cur
10970 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
10980 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
10990 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
109a0 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65 72  len);.....buffer
109b0 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62 75  _len = sizeof(bu
109c0 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65 72  ffer);....buffer
109d0 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
109e0 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66 66  _bertlv_tag(buff
109f0 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 2c  er, &buffer_len,
10a00 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d 3e   0x70, curr_id->
10a10 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63 75  certificate, &cu
10a20 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10a30 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66 20  te_len);.....if 
10a40 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c  (buffer_p == NUL
10a50 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
10a60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
10a70 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ading certificat
10a80 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20 72  e from BER-TLV r
10a90 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c 20  esponse failed, 
10aa0 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69 22  skipping key %i"
10ab0 2c 20 69 64 78 29 3b 0a 09 09 09 09 66 72 65 65  , idx);.....free
10ac0 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  (curr_id->certif
10ad0 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 6f 75 74  icate);......out
10ae0 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e 74  idx--;......cont
10af0 69 6e 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  inue;....}...}..
10b00 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65  } else {.../* Re
10b10 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65  ad all the apple
10b20 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27  ts from the CCC'
10b30 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74  s TLV */...ccc_t
10b40 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  lv = cackey_read
10b50 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f  _tlv(slot);..../
10b60 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55  * Look for CARDU
10b70 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70  RLs that cooresp
10b80 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65  ond to PKI apple
10b90 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63  ts */...for (ccc
10ba0 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b  _curr = ccc_tlv;
10bb0 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63   ccc_curr; ccc_c
10bc0 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e  urr = ccc_curr->
10bd0 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b  _next) {....CACK
10be0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10bf0 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e  "Found tag: %s .
10c00 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  .. ", CACKEY_DEB
10c10 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
10c20 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67  TR(ccc_curr->tag
10c30 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f  ));.....if (ccc_
10c40 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
10c50 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20  IS_TAG_CARDURL) 
10c60 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
10c70 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
10c80 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65   skipping it (we
10c90 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
10ca0 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09   CARDURLs)");...
10cb0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10cc0 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63  }.....if ((ccc_c
10cd0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10ce0 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41  rl->apptype & CA
10cf0 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
10d00 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f  ) != CACKEY_TLV_
10d10 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43  APP_PKI) {.....C
10d20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10d30 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69  TF("  ... skippi
10d40 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63  ng it (we only c
10d50 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70  are about PKI ap
10d60 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c  plets, this appl
10d70 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f  et supports: %s/
10d80 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44  %02x)", CACKEY_D
10d90 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50  EBUG_FUNC_APPTYP
10da0 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72  E_TO_STR(ccc_cur
10db0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10dc0 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73  ->apptype), (uns
10dd0 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63  igned int) ccc_c
10de0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10df0 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09  rl->apptype);...
10e00 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10e10 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  }.....CACKEY_DEB
10e20 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44  UG_PRINTBUF("RID
10e30 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  :", ccc_curr->va
10e40 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
10e50 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
10e60 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10e70 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b  ->rid));....CACK
10e80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10e90 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c  "AppID = %s/%04l
10ea0 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
10eb0 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
10ec0 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
10ed0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69  ue_cardurl->appi
10ee0 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
10ef0 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
10f00 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10f10 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  id);....CACKEY_D
10f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a  EBUG_PRINTF("Obj
10f30 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78  ectID = %s/%04lx
10f40 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
10f50 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
10f60 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  R(ccc_curr->valu
10f70 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
10f80 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  tid), (unsigned 
10f90 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e  long) ccc_curr->
10fa0 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f  value_cardurl->o
10fb0 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65  bjectid);.....me
10fc0 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63  mcpy(curr_aid, c
10fd0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
10fe0 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a  ardurl->rid, siz
10ff0 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  eof(ccc_curr->va
11000 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
11010 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ));....curr_aid[
11020 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
11030 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72   - 2] = (ccc_cur
11040 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11050 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20  ->appid >> 8) & 
11060 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69  0xff;....curr_ai
11070 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69  d[sizeof(curr_ai
11080 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75  d) - 1] = ccc_cu
11090 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
110a0 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b  l->appid & 0xff;
110b0 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66  ...../* Select f
110c0 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20  ound applet ... 
110d0 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74  */....select_ret
110e0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
110f0 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75  _applet(slot, cu
11100 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63  rr_aid, sizeof(c
11110 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66  urr_aid));....if
11120 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
11130 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
11140 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
11150 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
11160 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70  led to select ap
11170 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70  plet, skipping p
11180 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
11190 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
111a0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
111b0 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f  ..../* ... and o
111c0 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a  bject (file) */.
111d0 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20  ...select_ret = 
111e0 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
111f0 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72  le(slot, ccc_cur
11200 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
11210 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09  ->objectid);....
11220 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21  if (select_ret !
11230 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
11240 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
11250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11260 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20  ailed to select 
11270 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70  file, skipping p
11280 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69  rocessing of thi
11290 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  s object");.....
112a0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
112b0 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..../* Process t
112c0 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c  his file's TLV l
112d0 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69  ooking for certi
112e0 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70  ficates */....ap
112f0 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72  p_tlv = cackey_r
11300 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09  ead_tlv(slot);..
11310 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72  ....for (app_cur
11320 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70  r = app_tlv; app
11330 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20  _curr; app_curr 
11340 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78  = app_curr->_nex
11350 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  t) {.....CACKEY_
11360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
11370 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41  und tag: %s", CA
11380 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
11390 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63  TAG_TO_STR(app_c
113a0 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09  urr->tag));.....
113b0 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61  if (app_curr->ta
113c0 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
113d0 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
113e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
113f0 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b  PRINTF("  ... sk
11400 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e  ipping it (we on
11410 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43 45  ly care about CE
11420 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a  RTIFICATEs)");..
11430 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
11440 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69  ...}......curr_i
11450 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64  d = &certs[outid
11460 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b  x];.....outidx++
11470 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e  ;......curr_id->
11480 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59  id_type = CACKEY
11490 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09 09  _ID_TYPE_CAC;...
114a0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
114b0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
114c0 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
114d0 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72  eof(curr_id->car
114e0 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
114f0 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
11500 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63 63  d.cac.file = ccc
11510 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
11520 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b 0a  durl->objectid;.
11530 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
11540 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09 09  size = -1;......
11550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11560 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75 72  NTF("Filling cur
11570 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11580 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20  pplet (%p) with 
11590 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72  %lu bytes:", cur
115a0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
115b0 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65 64  pplet, (unsigned
115c0 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63 75   long) sizeof(cu
115d0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
115e0 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43 41  applet));.....CA
115f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11600 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72 72  BUF("VAL:", curr
11610 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
11620 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75 72  plet, sizeof(cur
11630 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
11640 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63 75  pplet));......cu
11650 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
11660 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75 72  te_len = app_cur
11670 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09 09  r->length;......
11680 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11690 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
116a0 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
116b0 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d  te_len);.....mem
116c0 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72  cpy(curr_id->cer
116d0 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63 75  tificate, app_cu
116e0 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72 5f  rr->value, curr_
116f0 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
11700 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  len);......if (o
11710 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
11720 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72 74   {......if (cert
11730 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09  s_resizable) {..
11740 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20 32  .....*count *= 2
11750 3b 0a 09 09 09 09 09 09 63 65 72 74 73 20 3d 20  ;.......certs = 
11760 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73  realloc(certs, s
11770 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20  izeof(*certs) * 
11780 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09 09  (*count));......
11790 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 62  } else {.......b
117a0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  reak;......}....
117b0 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  .}....}.....cack
117c0 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70 5f  ey_free_tlv(app_
117d0 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f 75  tlv);.....if (ou
117e0 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29 20  tidx >= *count) 
117f0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
11800 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  }...}....cackey_
11810 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c 76  free_tlv(ccc_tlv
11820 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20 3d  );..}...*count =
11830 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28 63   outidx;...if (c
11840 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20  erts_resizable) 
11850 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c  {...certs = real
11860 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f  loc(certs, sizeo
11870 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f  f(*certs) * (*co
11880 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  unt));..}...slot
11890 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ->cached_certs =
118a0 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72   cackey_copy_cer
118b0 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c 20  ts(NULL, certs, 
118c0 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d 3e  *count);..slot->
118d0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
118e0 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09 2f  nt = *count;.../
118f0 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72  * Terminate Smar
11900 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tCard Transactio
11910 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
11920 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11930 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65 72  t);...return(cer
11940 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  ts);.}../*. * SY
11950 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e  NPOSIS. *     ..
11960 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  .. *. * ARGUMENT
11970 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
11980 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
11990 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
119a0 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e   NOTES. *     ..
119b0 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
119c0 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 73  ssize_t cackey_s
119d0 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75 63  igndecrypt(struc
119e0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
119f0 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
11a00 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
11a10 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
11a20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f  char *buf, size_
11a30 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67 6e  t buflen, unsign
11a40 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66 2c  ed char *outbuf,
11a50 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c 65   size_t outbufle
11a60 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74 2c  n, int padInput,
11a70 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75 74   int unpadOutput
11a80 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  ) {..cackey_pcsc
11a90 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70 65  _id_type id_type
11aa0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
11ab0 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61   dyn_auth_templa
11ac0 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65  te[10];..unsigne
11ad0 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c 20  d char *tmpbuf, 
11ae0 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *tmpbuf_s, *outb
11af0 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70 3b  uf_s, *outbuf_p;
11b00 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
11b10 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70  bytes_to_send, p
11b20 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67  1, class;..unsig
11b30 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74 79  ned char blockty
11b40 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  pe;..cackey_ret 
11b50 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31  send_ret;..uint1
11b60 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 73  6_t respcode;..s
11b70 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d 20  size_t retval = 
11b80 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a  0, unpadoffset;.
11b90 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65  .size_t tmpbufle
11ba0 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75  n, padlen, tmpou
11bb0 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66 5f  tbuflen, outbuf_
11bc0 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74  len;..int free_t
11bd0 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20  mpbuf = 0;..int 
11be0 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  le;...CACKEY_DEB
11bf0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
11c00 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
11c10 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11c20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11c30 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
11c40 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
11c50 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
11c60 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
11c70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11c80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11c90 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
11ca0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11cb0 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
11cc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11cd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11ce0 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
11cf0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
11d00 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
11d10 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
11d20 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11d30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11d40 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
11d50 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
11d60 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
11d70 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
11d80 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
11d90 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
11da0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11db0 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
11dc0 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
11dd0 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
11de0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79  (-1);..}...id_ty
11df0 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  pe = identity->p
11e00 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64  csc_identity->id
11e10 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74  _type;..if (id_t
11e20 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44  ype == CACKEY_ID
11e30 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29  _TYPE_CERT_ONLY)
11e40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11e50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11e60 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
11e70 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41 43  _identity is CAC
11e80 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
11e90 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e  _ONLY, which can
11ea0 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  not be used for 
11eb0 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a  sign/decrypt");.
11ec0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11ed0 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74  }...switch (id_t
11ee0 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41  ype) {...case CA
11ef0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
11f00 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
11f10 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09  ID_TYPE_CAC:....
11f20 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74  break;...default
11f30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  :....CACKEY_DEBU
11f40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11f50 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
11f60 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74  _identity is not
11f70 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c   a supported val
11f80 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25  ue. Type is: 0x%
11f90 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c  lx (PIV = 0x%lx,
11fa0 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20   CAC = 0x%lx)", 
11fb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
11fc0 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e  id_type, (unsign
11fd0 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f  ed long) CACKEY_
11fe0 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e  ID_TYPE_PIV, (un
11ff0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43  signed long) CAC
12000 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29  KEY_ID_TYPE_CAC)
12010 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
12020 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
12030 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79  ine identity Key
12040 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64   size */..if (id
12050 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12060 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c  ntity->keysize <
12070 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79   0) {...identity
12080 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ->pcsc_identity-
12090 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f  >keysize = x509_
120a0 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74  to_keysize(ident
120b0 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
120c0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
120d0 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
120e0 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
120f0 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  icate_len);..}..
12100 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20  ./* Pad message 
12110 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09  to key size */..
12120 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a  if (padInput) {.
12130 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
12140 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12150 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09  eysize > 0) {...
12160 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69  .if (buflen != i
12170 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12180 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29  entity->keysize)
12190 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65   {.....if (bufle
121a0 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  n > (identity->p
121b0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
121c0 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09  ysize + 3)) {...
121d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
121e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
121f0 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  Message is too l
12200 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63  arge to sign/dec
12210 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65  rypt");.......re
12220 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a  turn(-1);.....}.
12230 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
12240 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
12250 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a  identity->keysiz
12260 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20  e;.....tmpbuf = 
12270 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e  malloc(tmpbuflen
12280 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  );.....free_tmpb
12290 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64  uf = 1;......pad
122a0 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  len = tmpbuflen 
122b0 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09  - buflen - 3;...
122c0 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31  .../* RSA PKCS#1
122d0 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35   EMSA-PKCS1-v1_5
122e0 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09   Padding */.....
122f0 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30  tmpbuf[0] = 0x00
12300 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20  ;.....tmpbuf[1] 
12310 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73  = 0x01;.....mems
12320 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30  et(&tmpbuf[2], 0
12330 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09  xFF, padlen);...
12340 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20  ..tmpbuf[padlen 
12350 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09  + 2]= 0x00;.....
12360 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70  memcpy(&tmpbuf[p
12370 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c  adlen + 3], buf,
12380 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43   buflen);......C
12390 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
123a0 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22  TBUF("Unpadded:"
123b0 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a  , buf, buflen);.
123c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
123d0 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
123e0 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  d:", tmpbuf, tmp
123f0 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  buflen);....} el
12400 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20  se {.....tmpbuf 
12410 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75  = buf;.....tmpbu
12420 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09  flen = buflen;..
12430 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d  ...free_tmpbuf =
12440 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d   0;.....padlen =
12450 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
12460 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
12470 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
12480 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
12490 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67  key size, hoping
124a0 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20   the message is 
124b0 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21  properly padded!
124c0 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d  ");.....tmpbuf =
124d0 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c   buf;....tmpbufl
124e0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
124f0 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
12500 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a  ....padlen = 0;.
12510 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
12520 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
12530 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
12540 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75  en;...free_tmpbu
12550 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20  f = 0;...padlen 
12560 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  = 0;..}.../* Beg
12570 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  in transaction *
12580 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
12590 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
125a0 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63  );.../* Select c
125b0 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f  orrect applet */
125c0 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
125d0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
125e0 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
125f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
12600 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e  PRINTF("Selectin
12610 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61  g applet found a
12620 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74  t %p ...", ident
12630 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12640 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70  ty->card.cac.app
12650 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  let);....cackey_
12660 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
12670 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
12680 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
12690 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
126a0 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70  zeof(identity->p
126b0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
126c0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
126d0 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63  ...../* Select c
126e0 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09  orrect file */..
126f0 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  ..cackey_select_
12700 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74  file(slot, ident
12710 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
12720 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c  ty->card.cac.fil
12730 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  e);....break;...
12740 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12750 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f  YPE_PIV:....dyn_
12760 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d  auth_template[0]
12770 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f   = 0x7C;....dyn_
12780 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d  auth_template[1]
12790 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
127a0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d  auth_template[2]
127b0 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b   = ((tmpbuflen +
127c0 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e   6) & 0xff00) >>
127d0 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f   8;....dyn_auth_
127e0 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74  template[3] = (t
127f0 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20  mpbuflen + 6) & 
12800 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61  0x00ff;....dyn_a
12810 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20  uth_template[4] 
12820 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
12830 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20  uth_template[5] 
12840 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61  = 0x00;....dyn_a
12850 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20  uth_template[6] 
12860 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61  = 0x81;....dyn_a
12870 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20  uth_template[7] 
12880 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
12890 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20  uth_template[8] 
128a0 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30  = (tmpbuflen & 0
128b0 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
128c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
128d0 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e  e[9] = tmpbuflen
128e0 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 73   & 0x00ff;.....s
128f0 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
12900 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
12910 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30   0x10, NISTSP800
12920 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41  _73_3_INSTR_GENA
12930 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  UTH, NISTSP800_7
12940 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38  8_3_ALGO_RSA2048
12950 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
12960 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e  _identity->card.
12970 70 69 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a 65  piv.key_id, size
12980 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  of(dyn_auth_temp
12990 6c 61 74 65 29 2c 20 64 79 6e 5f 61 75 74 68 5f  late), dyn_auth_
129a0 74 65 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c 20  template, 0x00, 
129b0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
129c0 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
129d0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
129e0 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09  PE_CERT_ONLY:...
129f0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70  .break;..}...tmp
12a00 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a  buf_s = tmpbuf;.
12a10 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62  .outbuf_s = outb
12a20 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62  uf;..while (tmpb
12a30 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75  uflen) {...tmpou
12a40 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66  tbuflen = outbuf
12a50 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62  len;....if (tmpb
12a60 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41  uflen > CACKEY_A
12a70 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79  PDU_MTU) {....by
12a80 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41  tes_to_send = CA
12a90 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09  CKEY_APDU_MTU;..
12aa0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74  .} else {....byt
12ab0 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70  es_to_send = tmp
12ac0 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73  buflen;...}....s
12ad0 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59  end_ret = CACKEY
12ae0 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b  _PCSC_E_GENERIC;
12af0 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  ...switch (id_ty
12b00 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41  pe) {....case CA
12b10 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
12b20 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66  :.....if (tmpbuf
12b30 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
12b40 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31  U_MTU) {......p1
12b50 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65   = 0x80;......le
12b60 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65   = 0x00;.....} e
12b70 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20  lse {......p1 = 
12b80 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20  0x00;......le = 
12b90 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  0x00;.....}.....
12ba0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
12bb0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
12bc0 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
12bd0 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
12be0 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e  GSCIS_INSTR_SIGN
12bf0 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30  DECRYPT, p1, 0x0
12c00 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  0, bytes_to_send
12c10 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72  , tmpbuf, le, &r
12c20 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c  espcode, outbuf,
12c30 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b   &tmpoutbuflen);
12c40 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
12c50 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
12c60 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28  PE_PIV:.....if (
12c70 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b  tmpbuflen > CACK
12c80 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09  EY_APDU_MTU) {..
12c90 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30  ....class = 0x10
12ca0 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30  ;......le = 0x00
12cb0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
12cc0 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49  ....class = GSCI
12cd0 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b  S_CLASS_ISO7816;
12ce0 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a  ......le = 256;.
12cf0 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f  ....}......send_
12d00 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
12d10 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61  d_apdu(slot, cla
12d20 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ss, NISTSP800_73
12d30 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
12d40 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  , NISTSP800_78_3
12d50 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69  _ALGO_RSA2048, i
12d60 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
12d70 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76  entity->card.piv
12d80 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74  .key_id, bytes_t
12d90 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
12da0 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
12db0 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
12dc0 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b  flen);.....break
12dd0 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  ;....case CACKEY
12de0 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e  _ID_TYPE_CERT_ON
12df0 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  LY:.....break;..
12e00 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
12e10 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
12e20 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
12e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12e40 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46  ("ADPU Sending F
12e50 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69  ailed -- returni
12e60 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a  ng in error.");.
12e70 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70  ....if (free_tmp
12e80 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74  buf) {.....if (t
12e90 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09  mpbuf_s) {......
12ea0 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a  free(tmpbuf_s);.
12eb0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f  ....}....}...../
12ec0 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  * End transactio
12ed0 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
12ee0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
12ef0 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65  lot);.....if (re
12f00 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32  spcode == 0x6982
12f10 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12f20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63  EBUG_PRINTF("Sec
12f30 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74  urity status not
12f40 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52 65   satisified.  Re
12f50 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49  turning NEEDLOGI
12f60 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  N");......cackey
12f70 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
12f80 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74  (slot);......ret
12f90 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
12fa0 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09  E_NEEDLOGIN);...
12fb0 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64 5f  .}.....if (send_
12fc0 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
12fd0 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
12fe0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
12ff0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b  EBUG_PRINTF("Tok
13000 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74 75  en absent.  Retu
13010 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e  rning TOKENABSEN
13020 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  T");......cackey
13030 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13040 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74  (slot);......ret
13050 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
13060 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
13070 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
13080 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62  -1);...}....tmpb
13090 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73  uf += bytes_to_s
130a0 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e  end;...tmpbuflen
130b0 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e   -= bytes_to_sen
130c0 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20  d;....outbuf += 
130d0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09  tmpoutbuflen;...
130e0 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70  outbuflen -= tmp
130f0 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74  outbuflen;...ret
13100 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66  val += tmpoutbuf
13110 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72  len;..}...if (fr
13120 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 69  ee_tmpbuf) {...i
13130 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09  f (tmpbuf_s) {..
13140 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29  ..free(tmpbuf_s)
13150 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75  ;...}..}...outbu
13160 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09  f = outbuf_s;...
13170 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
13180 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
13190 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
131a0 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41 43  ot);..#ifdef CAC
131b0 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
131c0 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
131d0 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74 62  ZE_MAX..if (outb
131e0 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53  uflen > _POSIX_S
131f0 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
13200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13210 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78 63  F("Outbuflen exc
13220 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
13230 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
13240 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
13250 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20   %li, outbuflen 
13260 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
13270 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
13280 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
13290 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09  ) outbuflen);...
132a0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
132b0 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
132c0 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65 6d  ../* We must rem
132d0 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61 67  ove the "7C" tag
132e0 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20 73   to get to the s
132f0 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77 69  ignature */..swi
13300 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a  tch (id_type) {.
13310 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
13320 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75  _TYPE_PIV:....ou
13330 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61  tbuf_len = retva
13340 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d  l;....outbuf_p =
13350 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72   cackey_read_ber
13360 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20  tlv_tag(outbuf, 
13370 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37  &outbuf_len, 0x7
13380 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75  C, NULL,  &outbu
13390 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f  f_len);....if (o
133a0 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29  utbuf_p == NULL)
133b0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
133c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
133d0 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f  onse from PIV fo
133e0 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45  r GENERATE AUTHE
133f0 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f  NTICATION was no
13400 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65  t a 0x7C tag, re
13410 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
13420 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  re");......retur
13430 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  n(-1);....}.....
13440 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f  retval = outbuf_
13450 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f  len;.....outbuf_
13460 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09  len = retval;...
13470 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63 6b  .outbuf_p = cack
13480 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74  ey_read_bertlv_t
13490 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74 62  ag(outbuf, &outb
134a0 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55  uf_len, 0x82, NU
134b0 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e  LL,  &outbuf_len
134c0 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75 66  );....if (outbuf
134d0 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  _p == NULL) {...
134e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
134f0 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20  RINTF("Response 
13500 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45 4e  from PIV for GEN
13510 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43 41  ERATE AUTHENTICA
13520 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20 30  TION was not a 0
13530 78 38 32 20 77 69 74 68 20 74 68 65 6e 20 30 78  x82 with then 0x
13540 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69 6e  7C tag, returnin
13550 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
13560 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13570 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c  ....}.....retval
13580 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a   = outbuf_len;..
13590 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
135a0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
135b0 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b  CAC:...case CACK
135c0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
135d0 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
135e0 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65  .}.../* Unpad re
135f0 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61  ply */..if (unpa
13600 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20  dOutput) {...if 
13610 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09  (retval < 3) {..
13620 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13630 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20  RINTF("Reply is 
13640 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72  too small, we ar
13650 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e  e not able to un
13660 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62  pad -- passing b
13670 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  ack and hoping f
13680 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a  or the best!");.
13690 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
136a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
136b0 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
136c0 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
136d0 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
136e0 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  val);....return(
136f0 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09  retval);...}....
13700 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d  if (outbuf[0] !=
13710 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b   0x00) {....CACK
13720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13730 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "Unrecognized pa
13740 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20  dding scheme -- 
13750 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
13760 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
13770 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
13780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13790 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
137a0 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
137b0 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
137c0 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
137d0 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
137e0 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79  ;...}....blockty
137f0 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a  pe = outbuf[1];.
13800 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20  ..unpadoffset = 
13810 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c  0;....switch (bl
13820 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61  ocktype) {....ca
13830 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20  se 0x00:...../* 
13840 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31  Padding Scheme 1
13850 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  , the first non-
13860 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65  zero byte is the
13870 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a   start of data *
13880 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
13890 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
138a0 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
138b0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
138c0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
138d0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
138e0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  != 0x00) {......
138f0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09  .break;......}..
13900 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
13910 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09  ...case 0x01:...
13920 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
13930 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73  eme 2, pad bytes
13940 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77   are 0xFF follow
13950 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09  ed by 0x00 */...
13960 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
13970 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
13980 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
13990 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
139a0 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
139b0 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
139c0 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20  xFF) {.......if 
139d0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
139e0 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
139f0 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
13a00 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72  et++;.........br
13a10 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  eak;.......} els
13a20 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  e {........CACKE
13a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13a40 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
13a50 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
13a60 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
13a70 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
13a80 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78  en 0x00 found 0x
13a90 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
13aa0 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
13ab0 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
13ac0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13ad0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
13ae0 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
13af0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13b00 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
13b10 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
13b20 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13b30 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
13b40 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30  een 0xFF found 0
13b50 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
13b60 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
13b70 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
13b80 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13b90 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
13ba0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
13bb0 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x02:...../* Pad
13bc0 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70  ding Scheme 3, p
13bd0 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e  ad bytes are non
13be0 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f  -zero first zero
13bf0 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74   byte found is t
13c00 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74  he seperator byt
13c10 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  e */.....for (un
13c20 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
13c30 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
13c40 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
13c50 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
13c60 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
13c70 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
13c80 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
13c90 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
13ca0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
13cb0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
13cc0 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  if (unpadoffset 
13cd0 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43  > retval) {....C
13ce0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13cf0 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74  TF("Offset great
13d00 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69  er than reply si
13d10 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28  ze, aborting.  (
13d20 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c  unpadoffset = %l
13d30 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29  u, retval = %lu)
13d40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13d50 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20  g) unpadoffset, 
13d60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13d70 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
13d80 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
13d90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13da0 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
13db0 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
13dc0 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75  ;....retval -= u
13dd0 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65  npadoffset;...me
13de0 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75  mmove(outbuf, ou
13df0 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73  tbuf + unpadoffs
13e00 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  et, retval);....
13e10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13e20 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
13e30 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
13e40 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  l);..}....CACKEY
13e50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13e60 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
13e70 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
13e80 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
13e90 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  g) retval);...re
13ea0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
13eb0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
13ec0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
13ed0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
13ee0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
13ef0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
13f00 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
13f10 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
13f20 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
13f30 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
13f40 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
13f50 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
13f60 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
13f70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
13f80 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
13f90 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
13fa0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
13fb0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
13fc0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09  sc_identities;..
13fd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 61  unsigned char ca
13fe0 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46  c_pin[8] = {0xFF
13ff0 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
14000 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
14010 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e  0xFF, 0xFF};..un
14020 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
14030 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74  certs;..uint16_t
14040 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a   response_code;.
14050 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69  .int tries_remai
14060 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  ning;..int send_
14070 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65  ret;..int key_re
14080 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a  ference = 0x00;.
14090 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74 68  ../* Indicate th
140a0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  at we do not kno
140b0 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79  w about how many
140c0 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61 69   tries are remai
140d0 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72 69  ning */..if (tri
140e0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20  es_remaining_p) 
140f0 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  {...*tries_remai
14100 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a  ning_p = -1;..}.
14110 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c  ../* Apparently,
14120 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a 45   CAC PINs are *E
14130 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73 20  XACTLY* 8 bytes 
14140 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74 68  long -- pad with
14150 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68 6f   0xFF if too sho
14160 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c  rt */..if (pin_l
14170 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d  en >= 8) {...mem
14180 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
14190 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  , 8);..} else {.
141a0 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e  ..memcpy(cac_pin
141b0 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b  , pin, pin_len);
141c0 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74 20  ..}.../* Reject 
141d0 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20 74  PINs which are t
141e0 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20  oo short */..if 
141f0 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b 0a  (pin_len < 5) {.
14200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14210 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e 67  RINTF("Rejecting
14220 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74 6f   PIN which is to
14230 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68 20  o short (length 
14240 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20 61  = %lu, must be a
14250 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e 5f  tleast 5)", pin_
14260 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
14270 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41  CACKEY_PCSC_E_BA
14280 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50  DPIN);..}.../* P
14290 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  IV authenticatio
142a0 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72 65  n uses a "key_re
142b0 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38 30  ference" of 0x80
142c0 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74 69   */..pcsc_identi
142d0 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
142e0 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
142f0 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
14300 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73  ;..if (num_certs
14310 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64 65   > 0 && pcsc_ide
14320 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
14330 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63 73   {...switch (pcs
14340 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d 2e  c_identities[0].
14350 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
14360 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
14370 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b 45  E_PIV:.....CACKE
14380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14390 57 65 20 72 65 63 65 6e 74 6c 79 20 68 61 64 20  We recently had 
143a0 61 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20 77  a PIV card, so w
143b0 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  e will attempt t
143c0 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20 75  o authenticate u
143d0 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70 70  sing the PIV App
143e0 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65 66  lication key ref
143f0 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09 6b  erence");......k
14400 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
14410 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  x80;.....break;.
14420 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
14430 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
14440 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72  /* Issue PIN Ver
14450 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ify */..send_ret
14460 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
14470 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
14480 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
14490 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
144a0 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66  Y, 0x00, key_ref
144b0 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63  erence, sizeof(c
144c0 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e  ac_pin), cac_pin
144d0 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
144e0 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
144f0 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f  LL);...if (send_
14500 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
14510 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66 20  SC_S_OK) {...if 
14520 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  ((response_code 
14530 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78 36  & 0x63C0) == 0x6
14540 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73 5f  3C0) {....tries_
14550 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65 73  remaining = (res
14560 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 46  ponse_code & 0xF
14570 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
14580 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
14590 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69  Verification fai
145a0 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72 65  led, %i tries re
145b0 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73 5f  maining", tries_
145c0 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09 09  remaining);.....
145d0 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
145e0 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74 72  ing_p) {.....*tr
145f0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20  ies_remaining_p 
14600 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  = tries_remainin
14610 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  g;....}.....retu
14620 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14630 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09  _BADPIN);...}...
14640 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  .if (response_co
14650 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b 0a  de == 0x6983) {.
14660 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14670 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
14680 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
14690 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b 65   device is locke
146a0 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  d");.....return(
146b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f  CACKEY_PCSC_E_LO
146c0 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72 65  CKED);...}....re
146d0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
146e0 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
146f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14700 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
14710 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 65  ication succeede
14720 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  d");...return(CA
14730 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
14740 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
14750 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
14760 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
14770 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
14780 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
14790 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
147a0 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
147b0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
147c0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74 6f  ey_ret cackey_to
147d0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72 75  ken_present(stru
147e0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
147f0 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
14800 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
14810 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65 61  _ret;..DWORD rea
14820 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74 61  der_len = 0, sta
14830 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f 6c  te = 0, protocol
14840 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09   = 0, atr_len;..
14850 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54 52  BYTE atr[MAX_ATR
14860 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74  _SIZE];..LONG st
14870 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64 5f  atus_ret, scard_
14880 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41  reconn_ret;...CA
14890 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
148a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
148b0 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e  if (slot->intern
148c0 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  al) {...CACKEY_D
148d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
148e0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
148f0 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20 74  sent (internal t
14900 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74 75  oken)");....retu
14910 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
14920 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
14930 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
14940 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
14950 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
14960 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
14970 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
14980 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
14990 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
149a0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
149b0 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
149c0 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
149d0 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72  n absent");....r
149e0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
149f0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
14a00 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
14a10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
14a20 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73 28  ing SCardStatus(
14a30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63  ) to determine c
14a40 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a 09  ard status");...
14a50 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66  atr_len = sizeof
14a60 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72  (atr);..status_r
14a70 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
14a80 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
14a90 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
14aa0 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
14ab0 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
14ac0 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74  r_len);...if (st
14ad0 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  atus_ret == SCAR
14ae0 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  D_E_INVALID_HAND
14af0 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LE) {...CACKEY_D
14b00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
14b10 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72  rdStatus() retur
14b20 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ned SCARD_E_INVA
14b30 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b  LID_HANDLE, mark
14b40 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ing is not alrea
14b50 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64  dy connected and
14b60 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b   trying again");
14b70 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
14b80 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
14b90 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ....pcsc_connect
14ba0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f  _ret = cackey_co
14bb0 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29  nnect_card(slot)
14bc0 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  ;...if (pcsc_con
14bd0 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
14be0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
14bf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14c00 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
14c10 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
14c20 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
14c30 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
14c40 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
14c50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
14c60 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  T);...}....CACKE
14c70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14c80 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74 61  Calling SCardSta
14c90 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 0a  tus() again");..
14ca0 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
14cb0 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74 75  of(atr);...statu
14cc0 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
14cd0 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
14ce0 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
14cf0 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
14d00 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
14d10 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  &atr_len);..}...
14d20 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
14d30 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
14d40 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 61  S) {...cackey_ma
14d50 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
14d60 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61 74  ot);....if (stat
14d70 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  us_ret == SCARD_
14d80 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
14d90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14da0 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
14db0 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
14dc0 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
14dd0 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
14de0 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
14df0 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
14e00 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
14e10 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
14e20 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  T1, &protocol);.
14e30 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65 63  ...if (scard_rec
14e40 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
14e50 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
14e60 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74  ../* Update prot
14e70 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74  ocol */.....slot
14e80 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
14e90 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52  tocol;....../* R
14ea0 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61 6e  e-establish tran
14eb0 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20 77  saction, if it w
14ec0 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09  as present */...
14ed0 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
14ee0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
14ef0 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  0) {......slot->
14f00 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
14f10 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e  h--;......slot->
14f20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
14f30 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09  _hw_lock = 1;...
14f40 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  ...cackey_begin_
14f50 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
14f60 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
14f70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14f80 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73 73  F("Reset success
14f90 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67 22  ful, requerying"
14fa0 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72 65  );.....status_re
14fb0 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
14fc0 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
14fd0 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
14fe0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
14ff0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
15000 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28 73  _len);.....if (s
15010 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
15020 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
15030 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15040 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c 20  G_PRINTF("Still 
15050 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20  unable to query 
15060 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74  card status, ret
15070 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
15080 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75  ent.  SCardStatu
15090 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45  s() = %s", CACKE
150a0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
150b0 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61  RDERR_TO_STR(sta
150c0 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  tus_ret));......
150d0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
150e0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
150f0 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  T);.....}....} e
15100 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
15110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
15120 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e 65  nable to reconne
15130 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75  ct to card, retu
15140 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
15150 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e 6e  nt.  SCardReconn
15160 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41 43  ect() = %s", CAC
15170 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
15180 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
15190 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 29  card_reconn_ret)
151a0 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
151b0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
151c0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
151d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
151e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
151f0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75 65  F("Unable to que
15200 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
15210 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
15220 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
15230 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
15240 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
15250 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
15260 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
15270 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15280 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15290 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66  NT);...}..}...if
152a0 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52 44   ((state & SCARD
152b0 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41 52  _ABSENT) == SCAR
152c0 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43 41  D_ABSENT) {...CA
152d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
152e0 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65 6e  F("Card is absen
152f0 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  t, returning tok
15300 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
15310 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
15320 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
15330 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
15340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15350 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72 65  urning token pre
15360 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75 72  sent.");...retur
15370 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
15380 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a 7d  TOKENPRESENT);.}
15390 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
153a0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
153b0 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
153c0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
153d0 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
153e0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
153f0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15400 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f  */.static ssize_
15410 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
15420 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28  entity_to_label(
15430 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
15440 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  sc_identity *ide
15450 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64 20  ntity, unsigned 
15460 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66 2c  char *label_buf,
15470 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
15480 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a  abel_buf_len) {.
15490 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
154a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
154b0 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73 6e  .void *label_asn
154c0 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69 66  1;..void *certif
154d0 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30 39  icate;..int x509
154e0 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65 72  _read_ret;...cer
154f0 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74  tificate = ident
15500 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
15510 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c  ;..certificate_l
15520 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63  en = identity->c
15530 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
15540 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
15550 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 72  e_len < 0) {...r
15560 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
15570 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
15580 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
15590 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
155a0 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28 76  tificate_len, (v
155b0 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f 61  oid **) &label_a
155c0 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  sn1);..if (x509_
155d0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
155e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
155f0 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
15600 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
15610 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
15620 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
15630 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
15640 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
15650 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28 78  n, "CN");..if (x
15660 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20  509_read_ret <= 
15670 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61 64  0) {...x509_read
15680 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74  _ret = x509_dn_t
15690 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61  o_string(label_a
156a0 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  sn1, x509_read_r
156b0 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62  et, (char *) lab
156c0 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75  el_buf, label_bu
156d0 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09  f_len, NULL);...
156e0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
156f0 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72 65  et <= 0) {....re
15700 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
15710 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f  ..#ifdef CACKEY_
15720 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65  PARANOID.#  ifde
15730 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  f _POSIX_SSIZE_M
15740 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61  AX..if (x509_rea
15750 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53  d_ret > _POSIX_S
15760 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
15770 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15780 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65 74  F("x509_read_ret
15790 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
157a0 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
157b0 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
157c0 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f 72  ax = %li, x509_r
157d0 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22 2c  ead_ret = %lu)",
157e0 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
157f0 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
15800 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f 72  ned long) x509_r
15810 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ead_ret);....ret
15820 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
15830 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72 65  ndif.#endif...re
15840 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f 72  turn(x509_read_r
15850 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  et);.}../* Retur
15860 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
15870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
15880 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
15890 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29 20  e(void **mutex) 
158a0 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  {..pthread_mutex
158b0 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65  _t *pthread_mute
158c0 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f  x;..int pthread_
158d0 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63  retval;..CK_RV c
158e0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09  ustom_retval;...
158f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15900 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
15910 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72  ..if ((cackey_ar
15920 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f  gs.flags & CKF_O
15930 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d  S_LOCKING_OK) ==
15940 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
15950 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f  OK) {...pthread_
15960 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28 73  mutex = malloc(s
15970 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f 6d  izeof(*pthread_m
15980 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21 70  utex));...if (!p
15990 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b 0a  thread_mutex) {.
159a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
159b0 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
159c0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
159d0 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  y.");.....return
159e0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74 68  (-1);...}....pth
159f0 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74  read_retval = pt
15a00 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74  hread_mutex_init
15a10 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c 20  (pthread_mutex, 
15a20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74 68  NULL);...if (pth
15a30 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
15a40 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15a50 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
15a60 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 29  ead_mutex_init()
15a70 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
15a80 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
15a90 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
15aa0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
15ab0 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61 64  *mutex = pthread
15ac0 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65 20  _mutex;..} else 
15ad0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
15ae0 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 29  rgs.CreateMutex)
15af0 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74   {....custom_ret
15b00 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67  val = cackey_arg
15b10 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d 75  s.CreateMutex(mu
15b20 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75  tex);.....if (cu
15b30 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43  stom_retval != C
15b40 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  KR_OK) {.....CAC
15b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15b60 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  ("cackey_args.Cr
15b70 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74 75  eateMutex() retu
15b80 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
15b90 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
15ba0 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
15bb0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
15bc0 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
15bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15be0 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
15bf0 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
15c00 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
15c10 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
15c20 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
15c30 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  t cackey_mutex_l
15c40 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78 29  ock(void *mutex)
15c50 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
15c60 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
15c70 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
15c80 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
15c90 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
15ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15cb0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
15cc0 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
15cd0 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
15ce0 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
15cf0 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
15d00 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
15d10 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a  _mutex = mutex;.
15d20 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61  ...pthread_retva
15d30 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  l = pthread_mute
15d40 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d  x_lock(pthread_m
15d50 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68  utex);...if (pth
15d60 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30  read_retval != 0
15d70 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
15d80 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72  BUG_PRINTF("pthr
15d90 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 29  ead_mutex_lock()
15da0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
15db0 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
15dc0 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
15dd0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
15de0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
15df0 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74  key_args.LockMut
15e00 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
15e10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
15e20 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d  args.LockMutex(m
15e30 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
15e40 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
15e50 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
15e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15e70 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  F("cackey_args.L
15e80 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
15e90 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
15ea0 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
15eb0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
15ec0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
15ed0 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
15ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15ef0 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
15f00 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
15f10 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn(0);.}../* Re
15f20 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
15f30 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
15f40 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
15f50 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
15f60 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
15f70 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
15f80 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
15f90 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
15fa0 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
15fb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15fc0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15fd0 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
15fe0 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
15ff0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
16000 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
16010 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
16020 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
16030 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
16040 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
16050 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65 61  ex_unlock(pthrea
16060 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
16070 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
16080 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
16090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
160a0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c  thread_mutex_unl
160b0 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
160c0 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
160d0 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
160e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
160f0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
16100 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e   (cackey_args.Un
16110 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  lockMutex) {....
16120 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
16130 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
16140 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a  ckMutex(mutex);.
16150 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72  ....if (custom_r
16160 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29  etval != CKR_OK)
16170 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
16180 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b  BUG_PRINTF("cack
16190 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
161a0 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
161b0 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
161c0 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
161d0 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
161e0 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
161f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
16200 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
16210 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
16220 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
16230 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b 5f  );.}..static CK_
16240 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63 61  ATTRIBUTE_PTR ca
16250 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
16260 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c  tes(CK_OBJECT_CL
16270 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ASS objectclass,
16280 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
16290 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
162a0 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
162b0 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 6e   long identity_n
162c0 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  um, CK_ULONG_PTR
162d0 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74   pulCount) {..st
162e0 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b  atic CK_BBOOL ck
162f0 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61 74  _true = 1;..stat
16300 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66  ic CK_BBOOL ck_f
16310 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74 69  alse = 0;..stati
16320 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74 72  c CK_TRUST ck_tr
16330 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53 54  usted = CK_TRUST
16340 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09 43  ED_DELEGATOR;..C
16350 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72 73  K_ULONG numattrs
16360 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f 75   = 0, retval_cou
16370 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54  nt;..CK_ATTRIBUT
16380 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74 72  E_TYPE curr_attr
16390 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52 49  _type;..CK_ATTRI
163a0 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c 20  BUTE curr_attr, 
163b0 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49  *retval;..CK_VOI
163c0 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
163d0 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
163e0 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f 43  en;..CK_OBJECT_C
163f0 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f 63  LASS ck_object_c
16400 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49 46  lass;..CK_CERTIF
16410 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63 65  ICATE_TYPE ck_ce
16420 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a  rtificate_type;.
16430 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b 5f  .CK_KEY_TYPE ck_
16440 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55 54  key_type;..CK_UT
16450 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66 5b  F8CHAR ucTmpBuf[
16460 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e 74  1024];..SHA1Cont
16470 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09 4d  ext sha1_ctx;..M
16480 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b 0a  D5_CTX md5_ctx;.
16490 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68 61  .uint8_t sha1_ha
164a0 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65 5d  sh[SHA1HashSize]
164b0 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f 68  ;..uint8_t md5_h
164c0 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65 5d  ash[MD5HashSize]
164d0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
164e0 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
164f0 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69 63  ssize_t certific
16500 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78 35  ate_len = -1, x5
16510 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  09_read_ret;..in
16520 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a 0a  t pValue_free;..
16530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16540 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f 62  INTF("Called (ob
16550 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75 2c  jectClass = %lu,
16560 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d 20   identity_num = 
16570 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
16580 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63 6c  d long) objectcl
16590 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75  ass, identity_nu
165a0 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  m);...*pulCount 
165b0 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65 63  = 0;...if (objec
165c0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
165d0 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
165e0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
165f0 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f 62  PUBLIC_KEY && ob
16600 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16610 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
16620 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
16630 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
16640 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
16650 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16660 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
16670 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
16680 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b 0a  object class");.
16690 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
166a0 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65 72  ..}.../* Get Cer
166b0 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74 69  t */..if (identi
166c0 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ty == NULL) {...
166d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
166e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
166f0 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
16700 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69 79   invalid identiy
16710 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09 09   provided");....
16720 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
16730 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d  ...certificate =
16740 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
16750 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69  ficate;..certifi
16760 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74  cate_len = ident
16770 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
16780 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74  _len;...if (cert
16790 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d  ificate_len == -
167a0 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74 65  1 || certificate
167b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
167c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
167d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
167e0 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74  bjects (NULL), t
167f0 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f 65  his identity doe
16800 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58 2e  s not have an X.
16810 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
16820 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16830 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74 20  it and will not 
16840 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75 72  work");....retur
16850 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
16860 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65 72   Verify that cer
16870 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e 2e  tificate is ASN.
16880 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39 20  1 encoded X.509 
16890 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
168a0 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72 69  if (x509_to_seri
168b0 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
168c0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
168d0 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09 09   NULL) < 0) {...
168e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
168f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30  NTF("Returning 0
16900 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c   objects (NULL),
16910 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74 69   the X.509 certi
16920 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
16930 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65 6e  d with this iden
16940 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c 69  tity is not vali
16950 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
16960 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  ULL);..}...retva
16970 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09 72  l_count = 64;..r
16980 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72  etval = malloc(r
16990 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
169a0 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
169b0 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72  ..for (curr_attr
169c0 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72 5f  _type = 0; curr_
169d0 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63 65  attr_type < 0xce
169e0 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74 74  5363bf; curr_att
169f0 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69 66  r_type++) {...if
16a00 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
16a10 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09 09   == 0x800) {....
16a20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d  curr_attr_type =
16a30 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09 7d   0xce536300;...}
16a40 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65 20  ....pValue_free 
16a50 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d 20  = 0;...pValue = 
16a60 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c  NULL;...ulValueL
16a70 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
16a80 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  1;....switch (cu
16a90 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b 0a  rr_attr_type) {.
16aa0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41 53  ...case CKA_CLAS
16ab0 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  S:.....CACKEY_DE
16ac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16ad0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16ae0 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25 30   CKA_CLASS (0x%0
16af0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16b00 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16b10 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16b20 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73  .ck_object_class
16b30 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b 0a   = objectclass;.
16b40 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
16b50 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a  k_object_class;.
16b60 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
16b70 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65 63   sizeof(ck_objec
16b80 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09 43  t_class);......C
16b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16ba0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
16bb0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
16bc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16bd0 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  ) *((CK_OBJECT_C
16be0 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29 2c  LASS *) pValue),
16bf0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16c00 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16c10 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16c20 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 4f  ;....case CKA_TO
16c30 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  KEN:.....CACKEY_
16c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16c50 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
16c60 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30 78  te CKA_TOKEN (0x
16c70 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
16c80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16c90 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16ca0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
16cb0 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  true;.....ulValu
16cc0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
16cd0 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43  _true);......CAC
16ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16cf0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
16d00 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
16d10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16d20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
16d30 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
16d40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16d50 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
16d60 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
16d70 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
16d80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16d90 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16da0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16db0 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c 78  PRIVATE (0x%08lx
16dc0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
16dd0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
16de0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
16df0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
16e00 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
16e10 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
16e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16e30 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
16e40 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
16e50 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65   we are not a Ne
16e60 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16e70 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
16e80 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70  ak;.....}......p
16e90 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
16ea0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
16eb0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
16ec0 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
16ed0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16ee0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
16ef0 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
16f00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
16f10 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
16f20 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
16f30 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
16f40 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
16f50 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
16f60 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 09  KA_TRUSTED:.....
16f70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16f80 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
16f90 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
16fa0 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29 20  USTED (0x%08lx) 
16fb0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
16fc0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
16fd0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
16fe0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
16ff0 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
17000 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
17010 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17020 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17030 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17040 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
17050 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17060 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17070 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  ..}......pValue 
17080 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
17090 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
170a0 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09  eof(ck_true);...
170b0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
170c0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
170d0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
170e0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
170f0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
17100 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
17110 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
17120 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
17130 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
17140 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46  ..case CKA_MODIF
17150 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  IABLE:.....CACKE
17160 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17170 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17180 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  bute CKA_MODIFIA
17190 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BLE (0x%08lx) ..
171a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
171b0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
171c0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
171d0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
171e0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
171f0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
17200 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17210 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17220 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
17230 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
17240 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
17250 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
17260 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
17270 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
17280 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
17290 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c 41  ;....case CKA_LA
172a0 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BEL:.....CACKEY_
172b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
172c0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
172d0 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30 78  te CKA_LABEL (0x
172e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
172f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17300 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17310 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
17320 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  >id_type == CACK
17330 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29 20  EY_ID_TYPE_PIV) 
17340 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
17350 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
17360 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09 75  iv.label;......u
17370 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72 6c  lValueLen = strl
17380 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  en(pValue);.....
17390 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75 6c  } else {......ul
173a0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69  ValueLen = snpri
173b0 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54  ntf((char *) ucT
173c0 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63  mpBuf, sizeof(uc
173d0 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69  TmpBuf), "Identi
173e0 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67  ty #%lu", (unsig
173f0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
17400 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70 56  ty_num);......pV
17410 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b  alue = ucTmpBuf;
17420 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61 6c  .......if (ulVal
17430 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28  ueLen >= sizeof(
17440 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09 09  ucTmpBuf)) {....
17450 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17460 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  0;.......pValue 
17470 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a 09  = NULL;......}..
17480 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
174a0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
174b0 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
174c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
174d0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
174e0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
174f0 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
17500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17510 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
17520 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
17530 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
17540 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17550 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17560 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
17570 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
17580 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
17590 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
175a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
175b0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
175c0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
175d0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
175e0 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
175f0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
17600 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54  ....case CKO_NET
17610 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09  SCAPE_TRUST:....
17620 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17630 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17640 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
17650 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
17660 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17670 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17680 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
17690 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
176a0 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74  :.......if (cert
176b0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
176c0 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f  ) {........x509_
176d0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
176e0 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66  to_pubkey(certif
176f0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
17700 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
17710 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30  ;........if (x50
17720 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
17730 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75  { .........pValu
17740 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  e = NULL;.......
17750 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
17760 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
17770 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
17780 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a  .....}.......}..
17790 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
177a0 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
177b0 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
177c0 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
177d0 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
177e0 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
177f0 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
17800 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
17810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17820 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17830 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
17840 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
17850 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
17860 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
17870 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
17880 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
17890 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
178a0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
178b0 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
178c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
178d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
178e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
178f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17900 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
17910 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
17920 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
17930 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
17940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17950 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
17960 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
17970 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
17980 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
17990 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
179a0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
179b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
179c0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
179d0 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
179e0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
179f0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
17a00 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
17a10 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
17a20 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
17a30 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
17a40 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
17a50 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
17a60 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
17a70 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17a80 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
17a90 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
17aa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17ab0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17ac0 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
17ad0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
17ae0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
17af0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
17b00 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
17b10 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
17b20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17b30 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17b40 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
17b50 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
17b60 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
17b70 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
17b80 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
17b90 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
17ba0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
17bb0 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
17bc0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
17bd0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
17be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17bf0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17c00 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17c10 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
17c20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
17c30 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17c40 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17c50 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17c60 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
17c70 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
17c80 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
17c90 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
17ca0 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
17cb0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
17cc0 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
17cd0 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
17ce0 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
17cf0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
17d00 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
17d10 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
17d20 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
17d30 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
17d40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17d50 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
17d60 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
17d70 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
17d80 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
17d90 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
17da0 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
17db0 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
17dc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17dd0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17de0 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
17df0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17e00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17e10 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17e20 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
17e30 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
17e40 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
17e50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e60 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
17e70 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
17e80 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
17e90 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a   certificate");.
17ea0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17eb0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
17ec0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
17ed0 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
17ee0 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
17ef0 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
17f00 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
17f10 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
17f20 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
17f30 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
17f40 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
17f50 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
17f60 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
17f70 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
17f80 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
17f90 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17fa0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17fb0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
17fc0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
17fd0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17fe0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17ff0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18000 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
18010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18020 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18030 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
18040 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18050 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18060 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18070 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
18080 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
18090 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
180a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
180b0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
180c0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
180d0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
180e0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
180f0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
18100 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d  .....}......ucTm
18110 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e  pBuf[0] = ((iden
18120 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e  tity_num + 1) >>
18130 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09   8) & 0xff;.....
18140 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28  ucTmpBuf[1] =  (
18150 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
18160 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70  ) & 0xff;......p
18170 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75  Value = &ucTmpBu
18180 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  f;.....ulValueLe
18190 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b  n = 2;......CACK
181a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
181b0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
181c0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
181d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
181e0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
181f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18200 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
18210 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  E_TYPE:.....CACK
18220 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18230 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18240 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46  ibute CKA_CERTIF
18250 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30  ICATE_TYPE (0x%0
18260 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18270 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18280 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18290 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
182a0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
182b0 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
182c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
182d0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
182e0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
182f0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
18300 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
18310 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18320 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
18330 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72   support one cer
18340 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f  tificate type */
18350 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63  .....ck_certific
18360 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58  ate_type = CKC_X
18370 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _509;......pValu
18380 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63  e = &ck_certific
18390 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  ate_type;.....ul
183a0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
183b0 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  f(ck_certificate
183c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
183d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
183e0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
183f0 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29   CKC_X_509 (%lu)
18400 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
18410 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
18420 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
18430 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
18440 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
18450 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
18460 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
18470 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
18480 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
18490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
184a0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
184b0 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ute CKA_KEY_TYPE
184c0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
184d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
184e0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
184f0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18500 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
18510 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
18520 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
18530 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
18540 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18550 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
18560 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
18570 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
18580 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  ot a key.");....
18590 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
185a0 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
185b0 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20  support one key 
185c0 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b  type */.....ck_k
185d0 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53  ey_type = CKK_RS
185e0 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  A;......pValue =
185f0 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09   &ck_key_type;..
18600 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
18610 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79  sizeof(ck_key_ty
18620 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
18630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18640 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
18650 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f  K_RSA (%lu) (%p/
18660 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
18670 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
18680 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
18690 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
186a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
186b0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
186c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
186d0 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
186e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
186f0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18700 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
18710 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IGN (0x%08lx) ..
18720 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
18730 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
18740 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
18750 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
18760 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
18770 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
18780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18790 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
187a0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
187b0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
187c0 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
187d0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
187e0 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
187f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
18800 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
18810 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
18820 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
18830 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18840 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
18850 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
18860 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
18870 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
18880 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
18890 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
188a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
188b0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
188c0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
188d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
188e0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
188f0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
18900 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18910 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
18920 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
18930 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
18940 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
18950 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18960 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18970 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
18980 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
18990 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
189a0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
189b0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
189c0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
189d0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
189e0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
189f0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18a00 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18a10 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18a20 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
18a30 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
18a40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
18a50 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65  ...../* We curre
18a60 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ntly only suppor
18a70 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70  t "Sign with App
18a80 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56  endix" */.....pV
18a90 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
18aa0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
18ab0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
18ac0 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
18ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18ae0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
18af0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
18b00 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
18b10 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
18b20 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
18b30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
18b40 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
18b50 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
18b60 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
18b70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18b80 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18b90 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
18ba0 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
18bb0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18bc0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18bd0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18be0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18bf0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
18c00 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18c10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18c20 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18c30 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18c40 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
18c50 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
18c60 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18c70 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
18c80 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
18c90 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
18ca0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
18cb0 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
18cc0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18cd0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
18ce0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18cf0 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
18d00 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
18d10 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
18d20 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18d30 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
18d40 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
18d50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18d60 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18d70 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
18d80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18d90 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
18da0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
18db0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18dc0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18dd0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18de0 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
18df0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18e00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18e10 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18e20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
18e30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18e40 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18e50 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18e60 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18e70 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18e80 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18e90 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18ea0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18eb0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18ec0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18ed0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18ee0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18ef0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18f00 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18f10 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
18f20 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
18f30 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
18f40 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18f50 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
18f60 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
18f70 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
18f80 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
18f90 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18fa0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
18fb0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
18fc0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18fd0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18fe0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18ff0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
19000 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
19010 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
19020 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
19030 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
19040 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
19050 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
19060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19070 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19080 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
19090 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
190a0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
190b0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
190c0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
190d0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
190e0 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
190f0 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
19100 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19110 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
19120 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
19130 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
19140 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
19150 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
19160 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
19170 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
19180 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
19190 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
191a0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
191b0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
191c0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
191d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
191e0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
191f0 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
19200 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
19210 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
19220 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19230 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
19240 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
19250 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
19260 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
19270 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
19280 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19290 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
192a0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
192b0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
192c0 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  US:.....CACKEY_D
192d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
192e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
192f0 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30  e CKA_MODULUS (0
19300 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19310 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19320 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
19330 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
19340 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
19350 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
19360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19370 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
19380 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19390 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
193a0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
193b0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
193c0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
193d0 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
193e0 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
193f0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
19400 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75  = x509_to_modulu
19410 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  s(certificate, c
19420 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
19430 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
19440 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
19450 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
19460 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
19470 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
19480 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
19490 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
194a0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
194b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
194c0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
194d0 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
194e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
194f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19500 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19510 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49  ..case CKA_PUBLI
19520 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09  C_EXPONENT:.....
19530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19540 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
19550 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55  attribute CKA_PU
19560 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30  BLIC_EXPONENT (0
19570 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
19580 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
19590 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
195a0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
195b0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
195c0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
195d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
195e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
195f0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
19600 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
19610 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
19620 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
19630 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
19640 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
19650 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
19660 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
19670 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
19680 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
19690 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
196a0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
196b0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
196c0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
196d0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
196e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
196f0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
19700 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
19710 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
19720 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19730 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
19740 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
19750 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19760 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19770 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19780 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
19790 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  T_DIGITAL_SIGNAT
197a0 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  URE:....case CKA
197b0 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
197c0 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20  IATION:....case 
197d0 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e  CKA_TRUST_KEY_EN
197e0 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
197f0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41  ase CKA_TRUST_DA
19800 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  TA_ENCIPHERMENT:
19810 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
19820 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
19830 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
19840 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47  UST_KEY_CERT_SIG
19850 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
19860 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09  RUST_CRL_SIGN:..
19870 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
19880 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
19890 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
198a0 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
198b0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
198c0 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
198d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
198e0 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
198f0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19900 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
19910 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
19920 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78  KA_TRUST_... (0x
19930 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19940 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19950 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19960 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
19970 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56  trusted;.....ulV
19980 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
19990 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09  (ck_trusted);...
199a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
199b0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
199c0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
199d0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
199e0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53  long) *((CK_TRUS
199f0 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  T *) pValue), pV
19a00 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
19a10 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
19a20 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
19a30 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
19a40 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43  SHA1_HASH:.....C
19a50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19a60 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19a70 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
19a80 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25  T_SHA1_HASH (0x%
19a90 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
19aa0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
19ab0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
19ac0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
19ad0 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
19ae0 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
19af0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19b00 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
19b10 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
19b20 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
19b30 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
19b40 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
19b50 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
19b60 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68  ...SHA1Reset(&sh
19b70 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41  a1_ctx);.....SHA
19b80 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78  1Input(&sha1_ctx
19b90 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
19ba0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
19bb0 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28  .....SHA1Result(
19bc0 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f  &sha1_ctx, sha1_
19bd0 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c  hash);......pVal
19be0 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a  ue = sha1_hash;.
19bf0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
19c00 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73   sizeof(sha1_has
19c10 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
19c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19c30 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
19c40 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
19c50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19c60 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19c70 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
19c80 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
19c90 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19ca0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19cb0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19cc0 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
19cd0 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
19ce0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19cf0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
19d00 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
19d10 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
19d20 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
19d30 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19d40 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19d50 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19d60 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19d70 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
19d80 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
19d90 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
19da0 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74  ..}......MD5Init
19db0 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09  (&md5_ctx);.....
19dc0 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63  MD5Update(&md5_c
19dd0 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
19de0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19df0 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28  );.....MD5Final(
19e00 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63  md5_hash, &md5_c
19e10 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  tx);......pValue
19e20 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09   = md5_hash;....
19e30 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
19e40 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a  zeof(md5_hash);.
19e50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
19e60 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
19e70 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
19e80 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
19e90 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
19ea0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
19eb0 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
19ec0 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
19ed0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19ee0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
19ef0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
19f00 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47  ...if (((CK_LONG
19f10 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d  ) ulValueLen) !=
19f20 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29   ((CK_LONG) -1))
19f30 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75   {..../* Push cu
19f40 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65  rr_attr onto the
19f50 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72   stack */....cur
19f60 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75  r_attr.type = cu
19f70 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09  rr_attr_type;...
19f80 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  .curr_attr.ulVal
19f90 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
19fa0 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  en;.....curr_att
19fb0 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  r.pValue = mallo
19fc0 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  c(curr_attr.ulVa
19fd0 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  lueLen);....memc
19fe0 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61  py(curr_attr.pVa
19ff0 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72  lue, pValue, cur
1a000 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
1a010 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c  n);.....if (pVal
1a020 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75  ue_free && pValu
1a030 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56  e) {.....free(pV
1a040 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  alue);....}.....
1a050 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20  if (numattrs >= 
1a060 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a  retval_count) {.
1a070 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ....retval = rea
1a080 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
1a090 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
1a0a0 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09  of(*retval));...
1a0b0 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72  .}.....memcpy(&r
1a0c0 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c  etval[numattrs],
1a0d0 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a   &curr_attr, siz
1a0e0 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b  eof(curr_attr));
1a0f0 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a  ....numattrs++;.
1a100 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  ..}..}...if (num
1a110 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09  attrs != 0) {...
1a120 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e  retval_count = n
1a130 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61  umattrs;...retva
1a140 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
1a150 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
1a160 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
1a170 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  l));..} else {..
1a180 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a  .free(retval);..
1a190 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b  ..retval = NULL;
1a1a0 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
1a1b0 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41  = numattrs;...CA
1a1c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a1d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  F("Returning %lu
1a1e0 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c   objects (%p).",
1a1f0 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64   numattrs, (void
1a200 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72   *) retval);...r
1a210 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
1a220 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
1a230 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
1a240 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
1a250 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1a260 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
1a270 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
1a280 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
1a290 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
1a2a0 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
1a2b0 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
1a2c0 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
1a2d0 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
1a2e0 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
1a2f0 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
1a300 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
1a310 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
1a320 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
1a330 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
1a340 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
1a350 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1a360 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
1a370 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
1a380 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
1a390 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1a3a0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
1a3b0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
1a3c0 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
1a3d0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a3e0 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
1a3f0 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
1a400 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1a410 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
1a420 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
1a430 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1a440 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
1a450 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a460 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
1a470 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1a480 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
1a490 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
1a4a0 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
1a4b0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1a4c0 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
1a4d0 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
1a4e0 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
1a4f0 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
1a500 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65  d long cackey_re
1a510 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1a520 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1a530 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1a540 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
1a550 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ong num_dod_cert
1a560 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  s) {..unsigned l
1a570 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64  ong cert_idx, id
1a580 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28  _idx = 0;...if (
1a590 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
1a5a0 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e  LL) {...return(n
1a5b0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33  um_dod_certs * 3
1a5c0 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72  );..}...for (cer
1a5d0 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
1a5e0 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65  idx < num_dod_ce
1a5f0 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
1a600 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b   {...identities[
1a610 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1a620 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
1a630 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1a640 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
1a650 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
1a660 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46  butes(CKO_CERTIF
1a670 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65  ICATE, &extra_ce
1a680 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
1a690 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
1a6a0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1a6b0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1a6c0 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
1a6d0 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
1a6e0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1a6f0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
1a700 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
1a710 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1a720 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
1a730 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42  tributes(CKO_PUB
1a740 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f  LIC_KEY, &extra_
1a750 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
1a760 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
1a770 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
1a780 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a790 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
1a7a0 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
1a7b0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1a7c0 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
1a7d0 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
1a7e0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a7f0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1a800 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e  attributes(CKO_N
1a810 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26  ETSCAPE_TRUST, &
1a820 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
1a830 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
1a840 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
1a850 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1a860 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
1a870 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  ...id_idx++;..}.
1a880 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29  ..return(id_idx)
1a890 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
1a8a0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1a8b0 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
1a8c0 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
1a8d0 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
1a8e0 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  lot, unsigned lo
1a8f0 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b  ng *ids_found) {
1a900 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1a910 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
1a920 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
1a930 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
1a940 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
1a950 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
1a960 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
1a970 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
1a980 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
1a990 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d  g num_certs, num
1a9a0 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74  _dod_certs, cert
1a9b0 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  _idx;..int inclu
1a9c0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1a9d0 20 30 2c 20 69 6e 63 6c 75 64 65 5f 64 6f 64 5f   0, include_dod_
1a9e0 63 65 72 74 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  certs;...CACKEY_
1a9f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1aa00 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69  lled.");...if (i
1aa10 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c  ds_found == NULL
1aa20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1aa30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1aa40 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20  .  ids_found is 
1aa50 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
1aa60 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66  n(NULL);..}..#if
1aa70 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f  def CACKEY_CARD_
1aa80 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54  SLOT_INCLUDE_EXT
1aa90 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64  RA_CERTS..includ
1aaa0 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
1aab0 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  1;.#endif...if (
1aac0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1aad0 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
1aae0 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
1aaf0 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
1ab00 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  a_certs = 1;..}.
1ab10 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
1ab20 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54  CKEY_NO_DOD_CERT
1ab30 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
1ab40 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1ab50 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1ab60 20 3d 20 30 3b 0a 09 7d 0a 0a 23 69 66 64 65 66   = 0;..}..#ifdef
1ab70 20 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41   CACKEY_NO_EXTRA
1ab80 5f 43 45 52 54 53 0a 09 69 66 20 28 67 65 74 65  _CERTS..if (gete
1ab90 6e 76 28 22 43 41 43 4b 45 59 5f 45 58 54 52 41  nv("CACKEY_EXTRA
1aba0 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
1abb0 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f  ) {...include_do
1abc0 64 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 20  d_certs = 1;..} 
1abd0 65 6c 73 65 20 7b 0a 09 09 69 6e 63 6c 75 64 65  else {...include
1abe0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1abf0 09 7d 0a 23 65 6c 73 65 0a 09 69 66 20 28 67 65  .}.#else..if (ge
1ac00 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1ac10 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1ac20 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1ac30 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30  de_dod_certs = 0
1ac40 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 6e  ;..} else {...in
1ac50 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20  clude_dod_certs 
1ac60 3d 20 31 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  = 1;..}.#endif..
1ac70 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 64 6f 64  .if (include_dod
1ac80 5f 63 65 72 74 73 29 20 7b 0a 09 09 6e 75 6d 5f  _certs) {...num_
1ac90 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65  dod_certs = size
1aca0 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20  of(extra_certs) 
1acb0 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  / sizeof(extra_c
1acc0 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 20 65 6c 73  erts[0]);..} els
1acd0 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  e {...num_dod_ce
1ace0 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  rts = 0;..}...if
1acf0 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c   (slot->internal
1ad00 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20  ) {...num_ids = 
1ad10 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1ad20 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
1ad30 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1ad40 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20  ....if (num_ids 
1ad50 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74  != 0) {....ident
1ad60 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1ad70 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1ad80 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1ad90 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
1ada0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
1adb0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f  entities, num_do
1adc0 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c  d_certs);...} el
1add0 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  se {....identiti
1ade0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  es = NULL;...}..
1adf0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
1ae00 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
1ae10 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
1ae20 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  }...pcsc_identit
1ae30 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1ae40 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
1ae50 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
1ae60 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
1ae70 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
1ae80 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75  .../* Convert nu
1ae90 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f  mber of Certs to
1aea0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
1aeb0 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20  ts */...num_ids 
1aec0 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  = (CKO_PRIVATE_K
1aed0 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49  EY - CKO_CERTIFI
1aee0 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f  CATE + 1) * num_
1aef0 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e  certs;....if (in
1af00 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1af10 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20  s) {....num_ids 
1af20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  += cackey_read_d
1af30 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
1af40 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1af50 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74  s);...}....ident
1af60 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1af70 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1af80 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1af90 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69  ../* Add certifi
1afa0 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65  cates, public ke
1afb0 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20  ys, and private 
1afc0 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d  keys from the sm
1afd0 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f  artcard */...id_
1afe0 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28  idx = 0;...for (
1aff0 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1b000 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72  rt_idx < num_cer
1b010 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1b020 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69  {....for (curr_i
1b030 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52  d_type = CKO_CER
1b040 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69  TIFICATE; curr_i
1b050 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52  d_type <= CKO_PR
1b060 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f  IVATE_KEY; curr_
1b070 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09  id_type++) {....
1b080 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1b090 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1b0a0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1b0b0 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74  ibutes(curr_id_t
1b0c0 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74  ype, &pcsc_ident
1b0d0 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c  ities[cert_idx],
1b0e0 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1b0f0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1b100 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1b110 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1b120 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1b130 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
1b140 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
1b150 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1b160 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
1b170 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1b180 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1b190 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
1b1a0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1b1b0 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
1b1c0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1b1d0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
1b1e0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1b1f0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1b200 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
1b210 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
1b220 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1b230 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1b240 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
1b250 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1b260 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1b270 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1b280 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
1b290 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1b2a0 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
1b2b0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1b2c0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1b2d0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69  _len);......id_i
1b2e0 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
1b2f0 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1b300 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1b310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b320 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55  NTF("Including U
1b330 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1b340 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72  tificates on har
1b350 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09  dware slot");...
1b360 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1b370 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1b380 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78  ntities + id_idx
1b390 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1b3a0 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1b3b0 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
1b3c0 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
1b3d0 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69  certs, 1);....*i
1b3e0 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69  ds_found = num_i
1b3f0 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64  ds;....return(id
1b400 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a  entities);..}...
1b410 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b  .*ids_found = 0;
1b420 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1b430 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1b440 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
1b450 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  nitialize)(CK_VO
1b460 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73  ID_PTR pInitArgs
1b470 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41  ) {..CK_C_INITIA
1b480 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52  LIZE_ARGS CK_PTR
1b490 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74   args;..uint32_t
1b4a0 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c   idx, highest_sl
1b4b0 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69  ot;..int mutex_i
1b4c0 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  nit_ret;...CACKE
1b4d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b4e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1b4f0 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  (cackey_initiali
1b500 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1b510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b520 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e  ror.  Already in
1b530 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1b540 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1b550 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49  TOKI_ALREADY_INI
1b560 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1b570 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d  if (pInitArgs !=
1b580 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20   NULL) {...args 
1b590 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d  = pInitArgs;...m
1b5a0 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72  emcpy(&cackey_ar
1b5b0 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66  gs, args, sizeof
1b5c0 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a  (cackey_args));.
1b5d0 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
1b5e0 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ateMutex == NULL
1b5f0 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
1b600 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  yMutex == NULL |
1b610 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
1b620 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
1b630 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  s->UnlockMutex =
1b640 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
1b650 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
1b660 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1b670 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
1b680 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1b690 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  ->LockMutex != N
1b6a0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
1b6b0 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
1b6c0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
1b6d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b6e0 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f  or. Some, but no
1b6f0 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20  t All threading 
1b700 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69  primitives provi
1b710 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ded.");......ret
1b720 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1b730 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d  S_BAD);....}...}
1b740 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63  ..} else {...cac
1b750 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
1b760 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1b770 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72  ackey_args.Destr
1b780 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  oyMutex = NULL;.
1b790 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ..cackey_args.Lo
1b7a0 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1b7b0 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ..cackey_args.Un
1b7c0 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  lockMutex = NULL
1b7d0 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1b7e0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
1b7f0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1b800 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1b810 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1b820 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1b830 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1b840 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  +) {...cackey_se
1b850 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1b860 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  ve = 0;..}...for
1b870 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1b880 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1b890 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1b8a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1b8b0 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
1b8c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1b8d0 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61  active = 0;...ca
1b8e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1b8f0 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
1b900 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
1b910 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
1b920 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
1b930 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1b940 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  x].transaction_n
1b950 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
1b960 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1b970 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  idx].slot_reset 
1b980 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1b990 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66  ots[idx].token_f
1b9a0 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b  lags = 0;...cack
1b9b0 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
1b9c0 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  bel = NULL;...ca
1b9d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1b9e0 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d  internal = 0;..}
1b9f0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1ba00 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1ba10 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1ba20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1ba30 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e  _PRINTF("Asked n
1ba40 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f  ot to include Do
1ba50 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29  D certificates")
1ba60 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69  ;..} else {...hi
1ba70 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69  ghest_slot = (si
1ba80 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1ba90 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1baa0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20  ey_slots[0])) - 
1bab0 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1bac0 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
1bad0 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69  ding DoD certs i
1bae0 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e  n slot %lu", (un
1baf0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67  signed long) hig
1bb00 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63  hest_slot);....c
1bb10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1bb20 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65  est_slot].active
1bb30 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1bb40 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1bb50 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b  t].internal = 1;
1bb60 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1bb70 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61  highest_slot].la
1bb80 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  bel = (unsigned 
1bb90 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65  char *) "US Gove
1bba0 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1bbb0 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  tes";...cackey_s
1bbc0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1bbd0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1bbe0 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63   "CACKey";...cac
1bbf0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1bc00 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  t_slot].token_fl
1bc10 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61  ags = 0;..}...ca
1bc20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1bc30 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63   = 1;...if (!cac
1bc40 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1bc50 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74  ) {...mutex_init
1bc60 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75  _ret = cackey_mu
1bc70 74 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b  tex_create(&cack
1bc80 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1bc90 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
1bca0 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  et != 0) {....CA
1bcb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bcc0 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78  F("Error.  Mutex
1bcd0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1bce0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72  failed.");.....r
1bcf0 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c  eturn(CKR_CANT_L
1bd00 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  OCK);...}....cac
1bd10 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1bd20 20 3d 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65   = 1;..}.../* De
1bd30 66 69 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74  fine a command t
1bd40 6f 20 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f  o prompt user fo
1bd50 72 20 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65  r a PIN */.#ifde
1bd60 66 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d  f CACKEY_PIN_COM
1bd70 4d 41 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61  MAND_DEFAULT..ca
1bd80 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1bd90 20 3d 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f   = CACKEY_PIN_CO
1bda0 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53  MMAND_DEFAULT_XS
1bdb0 54 52 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f  TR(CACKEY_PIN_CO
1bdc0 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 29 3b 0a  MMAND_DEFAULT);.
1bdd0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 43 41  #endif.#ifdef CA
1bde0 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44  CKEY_PIN_COMMAND
1bdf0 5f 58 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09  _XONLY_DEFAULT..
1be00 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
1be10 6e 64 5f 78 6f 6e 6c 79 20 3d 20 43 41 43 4b 45  nd_xonly = CACKE
1be20 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45  Y_PIN_COMMAND_DE
1be30 46 41 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45  FAULT_XSTR(CACKE
1be40 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f  Y_PIN_COMMAND_XO
1be50 4e 4c 59 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65  NLY_DEFAULT);.#e
1be60 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e  ndif...if (geten
1be70 76 28 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20  v("DISPLAY") != 
1be80 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79  NULL) {...cackey
1be90 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 63  _pin_command = c
1bea0 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
1beb0 64 5f 78 6f 6e 6c 79 3b 0a 09 7d 0a 0a 09 69 66  d_xonly;..}...if
1bec0 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59   (getenv("CACKEY
1bed0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1bee0 4c 59 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20  LY") != NULL && 
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 67 65 74 65 6e 76 28 22 43 41 43 4b  d = getenv("CACK
1bf30 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1bf40 4f 4e 4c 59 22 29 3b 0a 09 7d 0a 0a 09 69 66 20  ONLY");..}...if 
1bf50 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1bf60 50 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d  PIN_COMMAND") !=
1bf70 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
1bf80 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20  y_pin_command = 
1bf90 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1bfa0 49 4e 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a 09 7d  IN_COMMAND");..}
1bfb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1bfc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1bfd0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1bfe0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1bff0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1c000 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1c010 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69  (CK_RV, C_Finali
1c020 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
1c030 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69  pReserved) {..ui
1c040 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
1c050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c060 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1c070 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
1c080 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1c090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c0a0 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
1c0b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1c0c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c0d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c0e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c0f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c110 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c120 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c130 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c140 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c150 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c160 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1c170 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1c180 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1c190 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1c1a0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1c1b0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
1c1c0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1c1d0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43  active) {....C_C
1c1e0 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
1c1f0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
1c200 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
1c210 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20  ct_all();...for 
1c220 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1c230 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1c240 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1c250 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1c260 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1c270 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1c280 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
1c290 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
1c2a0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1c2b0 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
1c2c0 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
1c2d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c2e0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
1c2f0 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
1c300 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1c310 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  hed_certs) {....
1c320 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1c330 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  s(cackey_slots[i
1c340 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1c350 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  , cackey_slots[i
1c360 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1c370 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09  _count, 1);.....
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 20 3d  ].cached_certs =
1c3a0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1c3b0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1c3c0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b  onnect();...cack
1c3d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1c3e0 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1c3f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1c400 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1c410 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1c420 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1c430 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1c440 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1c450 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
1c460 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1c470 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1c480 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1c490 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1c4a0 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1c4b0 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
1c4c0 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1c4d0 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
1c4e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c4f0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1c500 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1c510 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c520 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c530 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1c540 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c550 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1c560 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1c570 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1c580 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c590 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1c5a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1c5b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c5c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1c5d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1c5e0 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1c5f0 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
1c600 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1c610 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1c620 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1c630 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1c640 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1c650 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1c660 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1c670 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1c680 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1c690 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1c6a0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1c6b0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1c6c0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1c6d0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1c6e0 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
1c6f0 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
1c700 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
1c710 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1c720 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
1c730 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1c740 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1c750 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
1c760 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1c770 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1c780 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1c790 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
1c7a0 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
1c7b0 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
1c7c0 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
1c7d0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1c7e0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
1c7f0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1c800 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1c810 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
1c820 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1c830 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1c840 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1c850 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c860 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1c870 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1c880 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1c890 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1c8a0 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
1c8b0 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
1c8c0 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
1c8d0 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
1c8e0 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
1c8f0 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1c900 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1c910 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
1c920 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
1c930 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
1c940 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
1c950 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
1c960 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69  unt) {..static i
1c970 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  nt first_call = 
1c980 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
1c990 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f  tval;..int pcsc_
1c9a0 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b  connect_ret;..CK
1c9b0 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c  _ULONG count, sl
1c9c0 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75  ot_count = 0, cu
1c9d0 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78  rrslot, slot_idx
1c9e0 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
1c9f0 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
1ca00 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
1ca10 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20  aders_e;..DWORD 
1ca20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1ca30 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69  ;..LONG scard_li
1ca40 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09  streaders_ret;..
1ca50 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64  size_t curr_read
1ca60 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f  er_len;..int slo
1ca70 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45  t_reset;...CACKE
1ca80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ca90 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1caa0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
1cab0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1cac0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cad0 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  r. pulCount is N
1cae0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1caf0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1cb00 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1cb10 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1cb20 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1cb30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1cb40 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1cb50 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1cb60 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1cb70 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1cb80 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1cb90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1cba0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1cbb0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1cbc0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1cbd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1cbe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1cbf0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1cc00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1cc10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1cc20 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72  );..}.../* Clear
1cc30 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a   list of slots *
1cc40 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  /..slot_reset = 
1cc50 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  0;..if (pSlotLis
1cc60 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74  t) {...if (first
1cc70 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73  _call) {....firs
1cc80 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09  t_call = 0;.....
1cc90 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
1cca0 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79  ..}..../* If any
1ccb0 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61   of the slots ha
1ccc0 76 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68  ve been reset th
1ccd0 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66  en purge all inf
1cce0 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65  ormation and che
1ccf0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f  ck again */...fo
1cd00 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1cd10 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1cd20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1cd30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1cd40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1cd50 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69  rrslot++) {....i
1cd60 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1cd70 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1cd80 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
1cd90 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
1cda0 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1cdb0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1cdc0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1cdd0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
1cde0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1cdf0 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  lot].slot_reset)
1ce00 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65   {.....slot_rese
1ce10 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61  t = 1;......brea
1ce20 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  k;....}...}....i
1ce30 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
1ce40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1ce50 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
1ce60 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
1ce70 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a  ation.");...../*
1ce80 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65   Only update the
1ce90 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69   list of slots i
1cea0 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c  f we are actuall
1ceb0 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74  y being supply t
1cec0 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  he slot informat
1ced0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
1cee0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1cef0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72  t_all();.....for
1cf00 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
1cf10 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1cf20 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1cf30 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1cf40 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1cf50 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69  rslot++) {.....i
1cf60 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1cf70 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1cf80 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69  al) {......conti
1cf90 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
1cfa0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1cfb0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1cfc0 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66  reader) {......f
1cfd0 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
1cfe0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1cff0 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63  reader);.......c
1d000 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d010 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1d020 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  r = NULL;.....}.
1d030 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d040 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d050 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72  label) {......fr
1d060 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1d070 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
1d080 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1d090 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1d0a0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
1d0b0 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
1d0c0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1d0d0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a  ctive = 0;....}.
1d0e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09  ..} else {......
1d0f0 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
1d100 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61  mine list of rea
1d110 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f  ders */..pcsc_co
1d120 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
1d130 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
1d140 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
1d150 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
1d160 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
1d170 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d180 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
1d190 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
1d1a0 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
1d1b0 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
1d1c0 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
1d1d0 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
1d1e0 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
1d1f0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1d200 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1d210 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1d220 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1d230 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1d240 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09  readers_len);...
1d250 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1d260 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1d270 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1d280 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1d290 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d2a0 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  r. SCardListRead
1d2b0 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  ers() returned S
1d2c0 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
1d2d0 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e  R, assuming Conn
1d2e0 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1d2f0 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e  went away. Recon
1d300 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  necting.");.....
1d310 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1d320 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
1d330 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1d340 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ();.....CACKEY_D
1d350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
1d360 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61  ing SCardListRea
1d370 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  ders() again");.
1d380 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1d390 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1d3a0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1d3b0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1d3c0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1d3d0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1d3e0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
1d3f0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1d400 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1d410 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
1d420 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
1d430 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1d440 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
1d450 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1d460 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
1d470 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
1d480 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1d490 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1d4a0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1d4b0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1d4c0 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
1d4d0 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
1d4e0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
1d4f0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1d500 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1d510 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
1d520 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
1d530 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
1d540 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1d550 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20  ;....../* Start 
1d560 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
1d570 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
1d580 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
1d590 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
1d5a0 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
1d5b0 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
1d5c0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
1d5d0 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75  594911 */.....cu
1d5e0 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09  rrslot = 1;.....
1d5f0 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1d600 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
1d610 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
1d620 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1d630 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76  ./* Find next av
1d640 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a  ailable slot */.
1d650 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72  .....for (; curr
1d660 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1d670 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1d680 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d690 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1d6a0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20  t++) {.......if 
1d6b0 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1d6c0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1d6d0 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
1d6e0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1d6f0 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
1d700 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
1d710 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1d720 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
1d730 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
1d740 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
1d750 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
1d760 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1d770 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
1d780 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
1d790 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1d7a0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1d7b0 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
1d7c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d7d0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d7e0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1d7f0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1d800 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d810 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
1d820 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
1d830 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
1d840 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1d850 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1d860 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d870 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70  d reader: %s", p
1d880 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1d890 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
1d8a0 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
1d8b0 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
1d8c0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73  ctually being as
1d8d0 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73  ked supply the s
1d8e0 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
1d8f0 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f  */......if (pSlo
1d900 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69  tList) {.......i
1d910 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
1d920 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1d930 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1d940 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
1d950 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1d960 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1d970 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  l = 0;........ca
1d980 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d990 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1d9a0 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
1d9b0 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09  eaders);........
1d9c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d9d0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64  rslot].pcsc_card
1d9e0 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
1d9f0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1da00 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
1da10 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
1da20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
1da30 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1da40 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t].transaction_n
1da50 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
1da60 0a 09 09 09 09 09 09 09 69 66 20 28 63 61 63 6b  ........if (cack
1da70 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1da80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 09 09  = NULL) {.......
1da90 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1daa0 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  urrslot].token_f
1dab0 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
1dac0 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09  _REQUIRED;......
1dad0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1dae0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1daf0 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f  currslot].token_
1db00 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 09 09 09  flags = 0;......
1db10 09 09 7d 0a 09 09 09 09 09 09 09 63 61 63 6b 65  ..}........cacke
1db20 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1db30 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1db40 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d  ........cackey_m
1db50 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
1db60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1db70 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d  rslot]);.......}
1db80 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
1db90 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69  ...../* Artifici
1dba0 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68  ally increase th
1dbb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  e number of acti
1dbc0 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74  ve slots by what
1dbd0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74   will become act
1dbe0 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73 6c 6f  ive */.......slo
1dbf0 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09  t_count++;......
1dc00 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b  }......currslot+
1dc10 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65  +;.......pcsc_re
1dc20 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65  aders += curr_re
1dc30 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09  ader_len + 1;...
1dc40 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28 63 75  ..}......for (cu
1dc50 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1dc60 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1dc70 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1dc80 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1dc90 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1dca0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
1dcb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1dcc0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1dcd0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1dce0 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1dcf0 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c  d active slot %l
1dd00 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1dd10 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a  ng) currslot);..
1dd20 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
1dd30 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ++;......}.....}
1dd40 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
1dd50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dd60 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c  INTF("Second cal
1dd70 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65  l to SCardListRe
1dd80 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65  aders failed, re
1dd90 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41  turn %s/%li", CA
1dda0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
1ddb0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
1ddc0 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1ddd0 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  s_ret), (long) s
1dde0 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1ddf0 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  _ret);....}.....
1de00 66 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72  free(pcsc_reader
1de10 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  s_s);...} else {
1de20 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1de30 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63  _PRINTF("First c
1de40 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
1de50 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
1de60 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
1de70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
1de80 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
1de90 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
1dea0 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
1deb0 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
1dec0 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a  rs_ret);...}..}.
1ded0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1dee0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1def0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1df00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1df10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1df20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1df30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1df40 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1df50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1df60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1df70 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74  ;..}...if (pSlot
1df80 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  List == NULL) {.
1df90 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
1dfa0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43  ot_count;....CAC
1dfb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dfc0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1dfd0 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20  OK (%i).  Found 
1dfe0 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74  %lu readers, but
1dff0 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73   not storing IDs
1e000 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e   (pSlotList == N
1e010 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28  ULL)", CKR_OK, (
1e020 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1e030 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72  lot_count);....r
1e040 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
1e050 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c  }...count = *pul
1e060 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e  Count;..if (coun
1e070 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20  t < slot_count) 
1e080 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e0a0 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
1e0b0 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
1e0c0 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72  we have %lu entr
1e0d0 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c  ies.", count, sl
1e0e0 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41  ot_count);....CA
1e0f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e100 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1e110 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
1e120 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  L");....return(C
1e130 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1e140 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65  ALL);...}...mute
1e150 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1e160 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1e170 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1e180 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1e190 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1e1a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e1b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1e1c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1e1d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1e1e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ERROR);..}...slo
1e1f0 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20  t_idx = 0;..for 
1e200 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28  (currslot = 0; (
1e210 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1e220 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1e230 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1e240 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75  _slots[0]))); cu
1e250 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66  rrslot++) {...if
1e260 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   (!cackey_slots[
1e270 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65  currslot].active
1e280 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1e290 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74  ...}....if (slot
1e2a0 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b  _idx >= count) {
1e2b0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1e2c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e2d0 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25  User allocated %
1e2e0 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20  lu entries, but 
1e2f0 77 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f  we just tried to
1e300 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c   write to the %l
1e310 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72  u index -- ignor
1e320 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  ing", count, slo
1e330 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74  t_idx);.....cont
1e340 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c  inue;...}....pSl
1e350 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d  otList[slot_idx]
1e360 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73   = currslot;...s
1e370 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09  lot_idx++;..}...
1e380 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1e390 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e3a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e3b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1e3c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1e3d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e3e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
1e3f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1e400 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e410 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1e420 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d  .}...*pulCount =
1e430 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43   slot_count;...C
1e440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e450 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1e460 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
1e470 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c  d %lu readers.",
1e480 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e   CKR_OK, (unsign
1e490 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f  ed long) slot_co
1e4a0 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  unt);...return(C
1e4b0 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50  KR_OK);...tokenP
1e4c0 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72  resent = tokenPr
1e4d0 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73  esent; /* Supres
1e4e0 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
1e4f0 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
1e500 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1e510 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1e520 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  lotInfo)(CK_SLOT
1e530 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53  _ID slotID, CK_S
1e540 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  LOT_INFO_PTR pIn
1e550 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
1e560 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65  _UTF8CHAR slotDe
1e570 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
1e580 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e  ACKey Slot";..in
1e590 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1e5a0 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f  .int bytes_to_co
1e5b0 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  py;...CACKEY_DEB
1e5c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1e5d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1e5e0 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1e5f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e600 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1e610 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1e620 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1e630 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1e640 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1e650 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1e660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e670 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1e680 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1e690 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1e6a0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1e6b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1e6c0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1e6d0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1e6e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1e6f0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1e700 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1e710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e720 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1e730 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1e740 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1e750 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1e760 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1e770 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1e780 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1e790 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e7a0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1e7b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e7c0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1e7d0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1e7e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1e7f0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1e800 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e810 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e820 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e830 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1e840 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1e850 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1e860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e870 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1e880 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1e890 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1e8a0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1e8b0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1e8c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1e8d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1e8e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1e8f0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1e900 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ..}...pInfo->fla
1e910 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54  gs = CKF_HW_SLOT
1e920 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1e930 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e  slots[slotID].in
1e940 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66  ternal) {...pInf
1e950 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1e960 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45  REMOVABLE_DEVICE
1e970 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1e980 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28  y_token_present(
1e990 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1e9a0 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59  otID]) == CACKEY
1e9b0 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
1e9c0 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d  SENT) {...pInfo-
1e9d0 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f  >flags |= CKF_TO
1e9e0 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a  KEN_PRESENT;..}.
1e9f0 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20  ..bytes_to_copy 
1ea00 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f  = strlen(cackey_
1ea10 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63  slots[slotID].pc
1ea20 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20  sc_reader);..if 
1ea30 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d  (sizeof(pInfo->m
1ea40 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c  anufacturerID) <
1ea50 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20   bytes_to_copy) 
1ea60 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  {...bytes_to_cop
1ea70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  y = sizeof(pInfo
1ea80 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1ea90 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49  );..}..memcpy(pI
1eaa0 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1eab0 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  rID, cackey_slot
1eac0 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
1ead0 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f  eader, bytes_to_
1eae0 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  copy);...mutex_r
1eaf0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1eb00 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1eb10 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1eb20 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1eb30 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1eb40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eb50 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1eb60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1eb70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1eb80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65  _ERROR);..}...me
1eb90 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  mset(pInfo->slot
1eba0 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27  Description, ' '
1ebb0 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1ebc0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
1ebd0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1ebe0 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1ebf0 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  n, slotDescripti
1ec00 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44  on, sizeof(slotD
1ec10 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29  escription) - 1)
1ec20 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1ec30 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1ec40 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1ec50 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1ec60 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  rID));...pInfo->
1ec70 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1ec80 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1ec90 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1eca0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1ecb0 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
1ecc0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1ecd0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1ece0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1ecf0 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1ed00 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1ed10 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
1ed20 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
1ed30 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41  nor = 0x00;...CA
1ed40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ed50 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ed60 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ed70 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ed80 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1ed90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1eda0 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  V, C_GetTokenInf
1edb0 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
1edc0 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49  otID, CK_TOKEN_I
1edd0 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1ede0 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1edf0 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65  CHAR manufacture
1ee00 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f  rID[] = "U.S. Go
1ee10 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74  vernment";..stat
1ee20 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64  ic CK_UTF8CHAR d
1ee30 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20  efaultLabel[] = 
1ee40 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b  "Unknown Token";
1ee50 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1ee60 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22  CHAR model[] = "
1ee70 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72  CAC Token";..str
1ee80 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
1ee90 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
1eea0 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69  dentities;..unsi
1eeb0 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65  gned long num_ce
1eec0 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61  rts;..ssize_t la
1eed0 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75  bel_ret;..int mu
1eee0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1eef0 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62   use_default_lab
1ef00 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  el;...CACKEY_DEB
1ef10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ef20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1ef30 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1ef40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ef50 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1ef60 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1ef70 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1ef80 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1ef90 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1efa0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1efb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1efc0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1efd0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1efe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1eff0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f000 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1f010 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1f020 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1f030 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1f040 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1f050 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1f060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f070 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1f080 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1f090 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1f0a0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1f0b0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1f0c0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1f0d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1f0e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1f0f0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1f100 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f110 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1f120 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1f130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f140 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1f150 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1f160 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1f170 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1f180 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1f190 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1f1a0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1f1b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f1c0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1f1d0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1f1e0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1f1f0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1f200 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1f210 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1f220 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1f230 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1f240 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1f250 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1f260 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1f270 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f280 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
1f290 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
1f2a0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
1f2b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f  DEBUG_PRINTF("No
1f2c0 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e   token is presen
1f2d0 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c  t in slotID = %l
1f2e0 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  u", slotID);....
1f2f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1f300 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1f310 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1f320 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45  KR_TOKEN_NOT_PRE
1f330 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  SENT);..}...mute
1f340 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1f350 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f360 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f370 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f380 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f3a0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1f3b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f3c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f3d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f3e0 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f  ./* Determine to
1f3f0 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63  ken label from c
1f400 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09  ertificates */..
1f410 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61  memset(pInfo->la
1f420 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  bel, ' ', sizeof
1f430 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1f440 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1f450 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63  bel = 1;...if (c
1f460 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f470 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c  ID].label == NUL
1f480 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e  L) {...pcsc_iden
1f490 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
1f4a0 72 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b  read_certs(&cack
1f4b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f4c0 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
1f4d0 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ts);...if (pcsc_
1f4e0 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
1f4f0 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d  LL) {....if (num
1f500 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09  _certs > 0) {...
1f510 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61  ..label_ret = ca
1f520 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
1f530 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63  ty_to_label(pcsc
1f540 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e  _identities, pIn
1f550 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
1f560 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1f570 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f  ;.....if (label_
1f580 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09  ret > 0) {......
1f590 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1f5a0 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63  l = 0;.......cac
1f5b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1f5c0 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63  ].label = malloc
1f5d0 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c  (sizeof(pInfo->l
1f5e0 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65  abel));.......me
1f5f0 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74  mcpy(cackey_slot
1f600 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1f610 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73   pInfo->label, s
1f620 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1f630 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  el));.....}....}
1f640 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  .....cackey_free
1f650 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e  _certs(pcsc_iden
1f660 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74  tities, num_cert
1f670 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c  s, 1);...}..} el
1f680 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49  se {...memcpy(pI
1f690 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b  nfo->label, cack
1f6a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f6b0 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  .label, sizeof(p
1f6c0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a  Info->label));..
1f6d0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1f6e0 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66  bel = 0;..}...if
1f6f0 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61   (use_default_la
1f700 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28  bel) {...memcpy(
1f710 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65  pInfo->label, de
1f720 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65  faultLabel, size
1f730 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29  of(defaultLabel)
1f740 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73   - 1);..}...mems
1f750 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
1f760 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
1f770 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1f780 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
1f790 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1f7a0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
1f7b0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
1f7c0 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
1f7d0 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  rID) - 1);...mem
1f7e0 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  set(pInfo->model
1f7f0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1f800 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d  nfo->model));..m
1f810 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emcpy(pInfo->mod
1f820 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f  el, model, sizeo
1f830 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a  f(model) - 1);..
1f840 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73  .memset(pInfo->s
1f850 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27  erialNumber, ' '
1f860 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1f870 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a  serialNumber));.
1f880 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1f890 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69  utcTime, ' ', si
1f8a0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54  zeof(pInfo->utcT
1f8b0 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  ime));...pInfo->
1f8c0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1f8d0 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  major = (cackey_
1f8e0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1f8f0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1f900 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73  fo->hardwareVers
1f910 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1f920 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1f930 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1f940 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65  .pInfo->firmware
1f950 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1f960 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69  0x00;..pInfo->fi
1f970 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69  rmwareVersion.mi
1f980 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49  nor = 0x00;...pI
1f990 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
1f9a0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
1f9b0 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f   | CKF_USER_PIN_
1f9c0 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b  INITIALIZED | CK
1f9d0 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49  F_TOKEN_INITIALI
1f9e0 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f  ZED | cackey_slo
1f9f0 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
1fa00 5f 66 6c 61 67 73 3b 0a 0a 09 69 66 20 28 63 61  _flags;...if (ca
1fa10 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1fa20 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 49   != NULL) {...pI
1fa30 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
1fa40 46 5f 50 52 4f 54 45 43 54 45 44 5f 41 55 54 48  F_PROTECTED_AUTH
1fa50 45 4e 54 49 43 41 54 49 4f 4e 5f 50 41 54 48 3b  ENTICATION_PATH;
1fa60 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ..}...pInfo->ulM
1fa70 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  axSessionCount =
1fa80 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1fa90 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1faa0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1fab0 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49  ns[0])) - 1;..pI
1fac0 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f  nfo->ulSessionCo
1fad0 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
1fae0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1faf0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52  ;..pInfo->ulMaxR
1fb00 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
1fb10 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53  0;..pInfo->ulRwS
1fb20 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
1fb30 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1fb40 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1fb50 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20  ->ulMaxPinLen = 
1fb60 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  128;..pInfo->ulM
1fb70 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70  inPinLen = 0;..p
1fb80 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62  Info->ulTotalPub
1fb90 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
1fba0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1fbb0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1fbc0 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f  ulFreePublicMemo
1fbd0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
1fbe0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1fbf0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
1fc00 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
1fc10 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1fc20 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1fc30 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74  fo->ulFreePrivat
1fc40 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
1fc50 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1fc60 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  TION;...CACKEY_D
1fc70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fc80 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1fc90 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1fca0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1fcb0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1fcc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
1fcd0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29  aitForSlotEvent)
1fce0 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c  (CK_FLAGS flags,
1fcf0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
1fd00 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44  pSlotID, CK_VOID
1fd10 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1fd20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1fd30 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1fd40 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1fd50 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1fd60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fd70 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1fd80 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1fd90 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1fda0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1fdb0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1fdc0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1fdd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fde0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fdf0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1fe00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fe10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1fe20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1fe30 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44  .}.../* XXX: TOD
1fe40 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69  O: Implement thi
1fe50 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  s... */..CACKEY_
1fe60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1fe70 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1fe80 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1fe90 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1fea0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1feb0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1fec0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1fed0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1fee0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1fef0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
1ff00 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b  echanismList)(CK
1ff10 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1ff20 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
1ff30 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  PE_PTR pMechanis
1ff40 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  mList, CK_ULONG_
1ff50 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
1ff60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ff70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ff80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1ff90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1ffa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ffb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1ffc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1ffd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1ffe0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fff0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
20000 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
20010 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20030 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69  ror.  pulCount i
20040 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
20050 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
20060 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
20070 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74   (pMechanismList
20080 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
20090 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09  ulCount = 1;....
200a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
200b0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
200c0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
200d0 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
200e0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
200f0 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29   (*pulCount < 1)
20100 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20110 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20120 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61    Buffer too sma
20130 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ll.");....return
20140 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
20150 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65  SMALL);..}...pMe
20160 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d  chanismList[0] =
20170 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09   CKM_RSA_PKCS;..
20180 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a  *pulCount = 1;..
20190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
201a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
201b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
201c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
201d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
201e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
201f0 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
20200 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  nismInfo)(CK_SLO
20210 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
20220 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74  MECHANISM_TYPE t
20230 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ype, CK_MECHANIS
20240 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  M_INFO_PTR pInfo
20250 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
20260 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
20270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20280 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
20290 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
202a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
202b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
202c0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
202d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
202e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
202f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20300 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
20310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20320 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
20330 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
20340 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
20350 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
20360 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
20370 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
20380 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
20390 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
203a0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
203b0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
203c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
203d0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
203e0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
203f0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
20400 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
20410 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
20420 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
20430 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
20440 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20450 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
20460 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20470 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20480 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
204a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
204b0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
204c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
204d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
204e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
204f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
20500 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
20510 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20520 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
20530 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
20540 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
20550 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
20560 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
20570 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20580 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20590 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
205a0 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
205b0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
205c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
205d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
205e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
205f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
20600 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20620 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
20630 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
20640 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20650 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
20660 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09  itch (type) {...
20670 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
20680 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
20690 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
206a0 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
206b0 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
206c0 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
206d0 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
206e0 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
206f0 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
20700 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
20710 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43  .break;..}...CAC
20720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20730 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20740 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
20750 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20760 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  OK);.}../* We do
20770 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
20780 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
20790 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
207a0 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65  K_RV, C_InitToke
207b0 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
207c0 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41  otID, CK_UTF8CHA
207d0 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
207e0 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43  LONG ulPinLen, C
207f0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
20800 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59  Label) {..CACKEY
20810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20820 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20830 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20840 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20860 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20870 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20880 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20890 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
208a0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
208b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
208c0 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
208d0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
208e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
208f0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
20900 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20910 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
20920 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
20930 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
20940 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
20950 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20960 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
20970 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
20980 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20990 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
209a0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
209b0 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43  ulPinLen) {..CAC
209c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
209d0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
209e0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
209f0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20a00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20a10 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20a20 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20a30 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20a40 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20a50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
20a60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
20a80 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
20a90 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
20aa0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
20ab0 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
20ac0 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
20ad0 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
20ae0 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
20af0 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
20b00 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
20b10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
20b20 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f  etPIN)(CK_SESSIO
20b30 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20b40 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
20b50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55  TR pOldPin, CK_U
20b60 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e  LONG ulOldPinLen
20b70 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
20b80 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c  R pNewPin, CK_UL
20b90 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29  ONG ulNewPinLen)
20ba0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
20bb0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20bc0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20bd0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20be0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20bf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20c00 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20c10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20c20 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20c30 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20c40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20c50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20c60 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20c70 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20c80 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
20c90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20ca0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
20cb0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20cc0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
20cd0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20ce0 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e  V, C_OpenSession
20cf0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
20d00 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c  tID, CK_FLAGS fl
20d10 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52  ags, CK_VOID_PTR
20d20 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43   pApplication, C
20d30 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c  K_NOTIFY notify,
20d40 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44   CK_SESSION_HAND
20d50 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e  LE_PTR phSession
20d60 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
20d70 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  ng idx;..int mut
20d80 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
20d90 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20  found_session = 
20da0 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
20db0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20dc0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67  .");...if ((flag
20dd0 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53  s & CKF_SERIAL_S
20de0 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53  ESSION) != CKF_S
20df0 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b  ERIAL_SESSION) {
20e00 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
20e10 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e  SSION_PARALLEL_N
20e20 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09  OT_SUPPORTED);..
20e30 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20e40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
20e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20e60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
20e70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
20e80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20e90 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
20ea0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20eb0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
20ec0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
20ed0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
20ee0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
20ef0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
20f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
20f20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
20f30 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
20f40 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
20f50 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
20f60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
20f70 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
20f80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20f90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
20fa0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20fb0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20fc0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20fd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20fe0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20ff0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21000 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21010 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21020 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
21030 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
21040 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
21050 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21060 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
21070 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
21080 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
21090 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
210a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
210b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
210c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
210d0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
210e0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
210f0 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72  ID);..}.../* Ver
21100 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61 72  ify that the car
21110 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e  d is actually in
21120 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f   the slot. */../
21130 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20  * XXX: Check to 
21140 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
21150 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31  s in the PKCS#11
21160 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a   specification *
21170 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  /..if (cackey_to
21180 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
21190 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
211a0 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
211b0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
211c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
211d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
211e0 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73  .  Card not pres
211f0 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
21200 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
21210 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ED");....cackey_
21220 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21230 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21240 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49  .return(CKR_DEVI
21250 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a  CE_REMOVED);..}.
21260 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20  ..for (idx = 1; 
21270 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
21280 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
21290 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
212a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
212b0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  x++) {...if (!ca
212c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
212d0 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
212e0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20  found_session = 
212f0 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f  1;.....*phSessio
21300 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63  n = idx;.....cac
21310 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21320 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
21330 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21340 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73  [idx].slotID = s
21350 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79  lotID;....cackey
21360 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
21370 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
21380 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09  BLIC_SESSION;...
21390 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
213a0 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c  [idx].flags = fl
213b0 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ags;....cackey_s
213c0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44  essions[idx].ulD
213d0 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a  eviceError = 0;.
213e0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
213f0 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61  ns[idx].pApplica
21400 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74  tion = pApplicat
21410 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ion;....cackey_s
21420 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74  essions[idx].Not
21430 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09  ify = notify;...
21440 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
21450 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
21460 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
21470 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21480 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
21490 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  nt = 0;.....cack
214a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
214b0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
214c0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
214d0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67  essions[idx].sig
214e0 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
214f0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
21500 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61  s[idx].decrypt_a
21510 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
21520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
21530 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
21540 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65   cackey_read_ide
21550 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f  ntities(&cackey_
21560 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26  slots[slotID], &
21570 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21580 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  idx].identities_
21590 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65  count);......bre
215a0 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  ak;...}..}...mut
215b0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
215c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
215d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
215e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
215f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21600 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21610 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
21620 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21630 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21640 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21650 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73  ..if (!found_ses
21660 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  sion) {...CACKEY
21670 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21680 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53  eturning CKR_SES
21690 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22  SION_COUNT (%i)"
216a0 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  , CKR_SESSION_CO
216b0 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  UNT);....return(
216c0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
216d0 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
216e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
216f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
21700 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
21710 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
21720 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
21730 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21740 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b  CloseSession)(CK
21750 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21760 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74  hSession) {..int
21770 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
21780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21790 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
217a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
217b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
217c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
217d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
217e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
217f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21800 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21810 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
21820 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
21830 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
21840 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21850 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
21860 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21870 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21890 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
218a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
218b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
218c0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
218d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
218e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
218f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
21900 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21910 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21920 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
21930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21940 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
21950 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21960 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21970 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21980 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21990 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
219a0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
219b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
219c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
219d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
219e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
219f0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
21a00 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
21a10 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
21a20 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21a30 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
21a40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21a50 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63  active = 0;..cac
21a60 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
21a70 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
21a80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
21a90 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
21aa0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21ab0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
21ac0 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  ount);...mutex_r
21ad0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21ae0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21af0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21b00 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21b10 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21b20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21b30 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21b40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21b50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21b60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
21b70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21b80 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21b90 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
21ba0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
21bb0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
21bc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21bd0 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73  V, C_CloseAllSes
21be0 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49  sions)(CK_SLOT_I
21bf0 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e  D slotID) {..uin
21c00 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20  t32_t idx;..int 
21c10 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
21c20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21c30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21c40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21c50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21c60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21c70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21c80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21c90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21ca0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21cb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21cc0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
21cd0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
21ce0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
21cf0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21d00 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
21d10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21d20 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
21d30 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
21d40 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
21d50 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
21d60 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
21d70 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21d80 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21d90 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21da0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
21db0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21dc0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21dd0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
21de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21df0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
21e00 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21e10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21e20 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21e30 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
21e40 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
21e50 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
21e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21e70 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
21e80 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
21e90 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
21ea0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
21eb0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
21ec0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21ed0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21ee0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21ef0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
21f00 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
21f10 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
21f20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21f30 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
21f40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
21f50 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
21f60 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
21f70 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ns[idx].active) 
21f80 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  {....if (cackey_
21f90 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c  sessions[idx].sl
21fa0 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20  otID != slotID) 
21fb0 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
21fc0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
21fd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21fe0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
21ff0 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28  .C_CloseSession(
22000 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  idx);....cackey_
22010 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
22020 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a  y_biglock);...}.
22030 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22040 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22050 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22060 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22070 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22080 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22090 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
220a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
220b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
220c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
220d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
220e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
220f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22100 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
22110 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22120 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22130 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22140 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29  _GetSessionInfo)
22150 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
22160 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
22170 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52  SESSION_INFO_PTR
22180 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
22190 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
221a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
221b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
221c0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
221d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
221e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
221f0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
22200 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
22210 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
22220 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
22230 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22240 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22250 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22260 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22270 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22280 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22290 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
222a0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
222b0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
222c0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
222d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
222e0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
222f0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
22300 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22310 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22320 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
22330 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
22340 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22350 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22360 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22370 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22380 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
22390 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
223a0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
223b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
223c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
223d0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
223e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
223f0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22400 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
22410 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22420 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
22430 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
22440 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22450 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
22460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22470 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
22480 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
22490 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
224a0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
224b0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  ALID);..}...pInf
224c0 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  o->slotID = cack
224d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
224e0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70  sion].slotID;..p
224f0 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61  Info->state = ca
22500 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22510 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09  ession].state;..
22520 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63  pInfo->flags = c
22530 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22540 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a  Session].flags;.
22550 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65  .pInfo->ulDevice
22560 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73  Error = cackey_s
22570 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22580 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  ].ulDeviceError;
22590 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
225a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
225b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
225c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
225d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
225e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
225f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22600 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
22610 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22620 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22630 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
22640 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22650 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
22660 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
22670 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
22680 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22690 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
226a0 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
226b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
226c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
226d0 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
226e0 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
226f0 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61  ONG_PTR pulOpera
22700 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a  tionStateLen) {.
22710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22720 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22730 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
22740 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
22750 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22760 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22770 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22780 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22790 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
227a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
227b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
227c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
227d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
227e0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
227f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22800 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
22810 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
22820 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22830 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22840 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22850 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
22860 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
22870 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22880 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
22890 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
228a0 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69  _ULONG ulOperati
228b0 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f  onStateLen, CK_O
228c0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e  BJECT_HANDLE hEn
228d0 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f  cryptionKey, CK_
228e0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41  OBJECT_HANDLE hA
228f0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79  uthenticationKey
22900 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22910 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22920 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22930 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22940 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22950 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22960 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22970 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22980 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22990 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
229a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
229b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
229c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
229d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
229e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
229f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22a00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22a10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22a20 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22a30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22a40 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f  RV, C_Login)(CK_
22a50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22a60 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
22a70 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
22a80 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
22a90 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
22aa0 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53  lPinLen) {..CK_S
22ab0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
22ac0 46 49 4c 45 20 2a 70 69 6e 66 64 3b 0a 09 63 68  FILE *pinfd;..ch
22ad0 61 72 20 2a 70 69 6e 63 6d 64 2c 20 70 69 6e 62  ar *pincmd, pinb
22ae0 75 66 5b 36 34 5d 2c 20 2a 66 67 65 74 73 5f 72  uf[64], *fgets_r
22af0 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
22b00 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65  etval;..int trie
22b10 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
22b20 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 09 69 6e  t login_ret;..in
22b30 74 20 70 63 6c 6f 73 65 5f 72 65 74 3b 0a 0a 09  t pclose_ret;...
22b40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22b50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22b60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22b70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22b80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22b90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22ba0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22bb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22bc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22bd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
22be0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
22bf0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
22c00 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22c10 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22c20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22c30 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
22c40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22c60 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
22c70 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
22c80 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
22c90 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
22ca0 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
22cb0 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
22cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22cd0 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
22ce0 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
22cf0 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
22d00 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
22d10 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
22d20 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
22d30 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
22d40 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
22d50 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22d60 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
22d70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
22d80 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
22d90 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
22da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22db0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
22dc0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22dd0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22de0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
22df0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
22e00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
22e10 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
22e20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
22e30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
22e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22e50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
22e60 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
22e70 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
22e80 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
22e90 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
22ea0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
22eb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
22ec0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
22ed0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
22ee0 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
22ef0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
22f00 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
22f10 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
22f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
22f40 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
22f50 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
22f60 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
22f70 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
22f80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22f90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22fa0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
22fb0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
22fc0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
22fd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22fe0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
22ff0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23000 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
23010 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
23020 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23030 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23040 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23050 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23060 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23070 7d 0a 0a 09 70 69 6e 63 6d 64 20 3d 20 63 61 63  }...pincmd = cac
23080 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 3b  key_pin_command;
23090 0a 09 69 66 20 28 70 69 6e 63 6d 64 20 21 3d 20  ..if (pincmd != 
230a0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
230b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
230c0 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e  ACKEY_PIN_COMMAN
230d0 44 20 3d 20 25 73 22 2c 20 70 69 6e 63 6d 64 29  D = %s", pincmd)
230e0 3b 0a 0a 09 09 69 66 20 28 70 50 69 6e 20 21 3d  ;....if (pPin !=
230f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b   NULL) {....CACK
23100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23110 22 50 72 6f 74 65 63 74 65 64 20 61 75 74 68 65  "Protected authe
23120 6e 74 69 63 61 74 69 6f 6e 20 70 61 74 68 20 69  ntication path i
23130 6e 20 65 66 66 65 63 74 20 61 6e 64 20 50 49 4e  n effect and PIN
23140 20 70 72 6f 76 69 64 65 64 20 21 3f 22 29 3b 0a   provided !?");.
23150 09 09 7d 0a 0a 09 09 70 69 6e 66 64 20 3d 20 70  ..}....pinfd = p
23160 6f 70 65 6e 28 70 69 6e 63 6d 64 2c 20 22 72 22  open(pincmd, "r"
23170 29 3b 0a 09 09 69 66 20 28 70 69 6e 66 64 20 3d  );...if (pinfd =
23180 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
23190 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
231a0 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 55 6e  ("Error.  %s: Un
231b0 61 62 6c 65 20 74 6f 20 72 75 6e 22 2c 20 70 69  able to run", pi
231c0 6e 63 6d 64 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ncmd);.....cacke
231d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
231e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
231f0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23200 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23210 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
23220 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74  RECT (%i)", (int
23230 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  ) CKR_PIN_INCORR
23240 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ECT);.....return
23250 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
23260 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 66 67 65 74  CT);...}....fget
23270 73 5f 72 65 74 20 3d 20 66 67 65 74 73 28 70 69  s_ret = fgets(pi
23280 6e 62 75 66 2c 20 73 69 7a 65 6f 66 28 70 69 6e  nbuf, sizeof(pin
23290 62 75 66 29 2c 20 70 69 6e 66 64 29 3b 0a 09 09  buf), pinfd);...
232a0 69 66 20 28 66 67 65 74 73 5f 72 65 74 20 3d 3d  if (fgets_ret ==
232b0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 70 69 6e 62   NULL) {....pinb
232c0 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 09 09  uf[0] = '\0';...
232d0 7d 0a 0a 09 09 70 63 6c 6f 73 65 5f 72 65 74 20  }....pclose_ret 
232e0 3d 20 70 63 6c 6f 73 65 28 70 69 6e 66 64 29 3b  = pclose(pinfd);
232f0 0a 09 09 69 66 20 28 70 63 6c 6f 73 65 5f 72 65  ...if (pclose_re
23300 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  t != 0) {....CAC
23310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23320 28 22 45 72 72 6f 72 2e 20 20 25 73 3a 20 65 78  ("Error.  %s: ex
23330 69 74 65 64 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ited with non-ze
23340 72 6f 20 73 74 61 74 75 73 20 6f 66 20 25 69 22  ro status of %i"
23350 2c 20 70 69 6e 63 6d 64 2c 20 70 63 6c 6f 73 65  , pincmd, pclose
23360 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  _ret);.....cacke
23370 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23380 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23390 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
233a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
233b0 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
233c0 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74  RECT (%i)", (int
233d0 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  ) CKR_PIN_INCORR
233e0 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ECT);.....return
233f0 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
23400 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  CT);...}....if (
23410 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 3c  strlen(pinbuf) <
23420 20 31 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   1) {....CACKEY_
23430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23440 72 6f 72 2e 20 20 25 73 3a 20 72 65 74 75 72 6e  ror.  %s: return
23450 65 64 20 6e 6f 20 64 61 74 61 22 2c 20 70 69 6e  ed no data", pin
23460 63 6d 64 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  cmd);.....cackey
23470 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23480 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23490 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
234a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
234b0 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  g CKR_PIN_INCORR
234c0 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74 29  ECT (%i)", (int)
234d0 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45   CKR_PIN_INCORRE
234e0 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  CT);.....return(
234f0 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43  CKR_PIN_INCORREC
23500 54 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 70  T);...}....if (p
23510 69 6e 62 75 66 5b 73 74 72 6c 65 6e 28 70 69 6e  inbuf[strlen(pin
23520 62 75 66 29 20 2d 20 31 5d 20 3d 3d 20 27 5c 6e  buf) - 1] == '\n
23530 27 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 73  ') {....pinbuf[s
23540 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20 2d 20  trlen(pinbuf) - 
23550 31 5d 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a  1] = '\0';...}..
23560 09 09 70 50 69 6e 20 3d 20 28 43 4b 5f 55 54 46  ..pPin = (CK_UTF
23570 38 43 48 41 52 5f 50 54 52 29 20 70 69 6e 62 75  8CHAR_PTR) pinbu
23580 66 3b 0a 09 09 75 6c 50 69 6e 4c 65 6e 20 3d 20  f;...ulPinLen = 
23590 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 3b 0a  strlen(pinbuf);.
235a0 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d  .}...login_ret =
235b0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63   cackey_login(&c
235c0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
235d0 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e  ID], pPin, ulPin
235e0 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61  Len, &tries_rema
235f0 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67  ining);..if (log
23600 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  in_ret != CACKEY
23610 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
23620 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23630 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23640 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69  ck);....if (logi
23650 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f  n_ret == CACKEY_
23660 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b  PCSC_E_LOCKED) {
23670 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23680 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23690 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64   Token is locked
236a0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
236b0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f  slots[slotID].to
236c0 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46  ken_flags |= CKF
236d0 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44  _USER_PIN_LOCKED
236e0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
236f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23700 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43  ning CKR_PIN_LOC
23710 4b 45 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29  KED (%i)", (int)
23720 20 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29   CKR_PIN_LOCKED)
23730 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
23740 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  _PIN_LOCKED);...
23750 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e  } else if (login
23760 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
23770 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a  CSC_E_BADPIN) {.
23780 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23790 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
237a0 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a  Invalid PIN.");.
237b0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
237c0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
237d0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
237e0 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a  _PIN_COUNT_LOW;.
237f0 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65  ....if (tries_re
23800 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a  maining == 1) {.
23810 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
23820 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
23830 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
23840 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a  _PIN_FINAL_TRY;.
23850 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f  ...}.....CACKEY_
23860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23870 74 75 72 6e 69 6e 67 20 43 4b 52 5f 50 49 4e 5f  turning CKR_PIN_
23880 49 4e 43 4f 52 52 45 43 54 20 28 25 69 29 22 2c  INCORRECT (%i)",
23890 20 28 69 6e 74 29 20 43 4b 52 5f 50 49 4e 5f 49   (int) CKR_PIN_I
238a0 4e 43 4f 52 52 45 43 54 29 3b 0a 0a 09 09 09 72  NCORRECT);.....r
238b0 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
238c0 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
238d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
238e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
238f0 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
23900 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
23910 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
23920 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
23930 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23940 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
23950 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23960 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
23970 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
23980 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
23990 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
239a0 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
239b0 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
239c0 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
239d0 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
239e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
239f0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
23a00 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d  R_FUNCTIONS;...m
23a10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23a20 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
23a30 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23a40 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
23a50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
23a60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23a70 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
23a80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
23a90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23aa0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23ab0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23ac0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23ad0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
23ae0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
23af0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
23b00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23b10 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
23b20 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
23b30 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
23b40 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
23b50 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
23b60 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
23b70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
23b80 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
23b90 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
23ba0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
23bb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23bc0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
23bd0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23be0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23bf0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23c00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
23c10 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
23c20 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
23c30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
23c40 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
23c50 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
23c60 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23c70 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23c80 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
23c90 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
23ca0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
23cb0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
23cc0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
23cd0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
23ce0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
23cf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23d00 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23d10 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23d20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23d30 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
23d40 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23d50 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23d60 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
23d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23d80 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
23d90 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23da0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23db0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23dc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23dd0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
23de0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
23df0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
23e00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
23e10 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
23e20 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
23e30 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23e40 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
23e50 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
23e60 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
23e70 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
23e80 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23e90 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
23ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23eb0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23ec0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23ed0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23ee0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23ef0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
23f00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23f10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23f20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
23f30 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
23f40 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23f50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23f60 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
23f70 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
23f80 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
23f90 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
23fa0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
23fb0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23fc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
23fd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23fe0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23ff0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24000 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
24010 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
24020 5f 53 45 53 53 49 4f 4e 3b 0a 0a 09 69 66 20 28  _SESSION;...if (
24030 63 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61  cackey_pin_comma
24040 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
24050 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
24060 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
24070 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
24080 55 49 52 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b  UIRED;..} else {
24090 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
240a0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
240b0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ags = 0;..}...mu
240c0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
240d0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
240e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
240f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24100 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24110 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24120 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
24130 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24140 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24150 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24160 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24170 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24180 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
24190 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
241a0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
241b0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
241c0 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65  (CK_RV, C_Create
241d0 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49  Object)(CK_SESSI
241e0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
241f0 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
24200 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
24210 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
24220 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
24230 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29  LE_PTR phObject)
24240 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24250 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24260 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24270 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24280 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24290 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
242a0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
242b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
242c0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
242d0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
242e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
242f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24300 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24310 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
24320 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
24330 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24340 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
24350 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24360 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
24370 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24380 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29  V, C_CopyObject)
24390 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
243a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
243b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f  OBJECT_HANDLE hO
243c0 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42  bject, CK_ATTRIB
243d0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
243e0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
243f0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
24400 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f  ANDLE_PTR phNewO
24410 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
24420 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
24430 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
24440 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
24450 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
24460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24470 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
24480 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
24490 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
244a0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
244b0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
244c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
244d0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
244e0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
244f0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
24500 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24510 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
24520 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24530 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
24540 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
24550 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72  N(CK_RV, C_Destr
24560 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  oyObject)(CK_SES
24570 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24580 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
24590 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20  HANDLE hObject) 
245a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
245b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
245c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
245d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
245e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
245f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24600 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24610 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24620 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24630 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24650 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24660 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
24670 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
24680 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
24690 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
246a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
246b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
246c0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
246d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
246e0 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a  , C_GetObjectSiz
246f0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
24700 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
24710 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
24720 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e  hObject, CK_ULON
24730 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b  G_PTR pulSize) {
24740 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24750 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24760 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24770 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24790 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
247a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
247b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
247c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
247d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
247e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
247f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24800 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
24810 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
24820 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24830 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
24840 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
24850 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
24860 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
24870 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
24880 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
24890 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
248a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
248b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
248c0 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
248d0 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
248e0 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
248f0 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f   ulCount) {..CK_
24900 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
24910 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61  attr;..struct ca
24920 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69  ckey_identity *i
24930 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e  dentity;..unsign
24940 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79  ed long identity
24950 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20  _idx, attr_idx, 
24960 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e  sess_attr_idx, n
24970 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74  um_ids;..int mut
24980 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ex_retval;..CK_R
24990 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  V retval = CKR_O
249a0 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  K;..CK_VOID_PTR 
249b0 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e  pValue;..CK_ULON
249c0 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  G ulValueLen;...
249d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
249e0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
249f0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
24a00 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
24a10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24a20 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
24a30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
24a40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
24a50 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
24a60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
24a70 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
24a80 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
24a90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
24aa0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
24ab0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24ac0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
24ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24ae0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
24af0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
24b00 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
24b10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
24b20 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
24b30 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29  f (hObject == 0)
24b40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24b50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24b60 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
24b70 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
24b80 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
24b90 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
24ba0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
24bb0 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20   (ulCount == 0) 
24bc0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
24bd0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
24be0 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
24bf0 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
24c00 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
24c10 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  ly */...CACKEY_D
24c20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24c30 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
24c40 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
24c50 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
24c60 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
24c70 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
24c80 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
24c90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24ca0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54  INTF("Error.  pT
24cb0 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e  emplate is NULL.
24cc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24cd0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
24ce0 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f  ;..}...identity_
24cf0 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20  idx = hObject - 
24d00 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  1;...mutex_retva
24d10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
24d20 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
24d30 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
24d40 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
24d50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24d60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24d70 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
24d80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24d90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24da0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
24db0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24dc0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
24dd0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24de0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24df0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
24e00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24e10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
24e20 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
24e30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24e40 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24e50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69  LID);..}...num_i
24e60 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ds = cackey_sess
24e70 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
24e80 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
24e90 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f  ...if (identity_
24ea0 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20  idx >= num_ids) 
24eb0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
24ec0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
24ed0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
24ee0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24ef0 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20  "Error.  Object 
24f00 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
24f10 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69  nge.  identity_i
24f20 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64  dx = %lu, num_id
24f30 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69  s = %lu.", (unsi
24f40 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
24f50 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e  ity_idx, (unsign
24f60 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73  ed long) num_ids
24f70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24f80 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49  _OBJECT_HANDLE_I
24f90 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64  NVALID);..}...id
24fa0 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79  entity = &cackey
24fb0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24fc0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69  on].identities[i
24fd0 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09  dentity_idx];...
24fe0 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
24ff0 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c  0; attr_idx < ul
25000 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b  Count; attr_idx+
25010 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72  +) {...curr_attr
25020 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74   = &pTemplate[at
25030 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c  tr_idx];....pVal
25040 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
25050 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
25060 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45  NG) -1;....CACKE
25070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25080 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  Looking for attr
25090 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69  ibute 0x%08lx (i
250a0 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e  dentity:%lu) ...
250b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
250c0 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
250d0 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  pe, (unsigned lo
250e0 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
250f0 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f  );....for (sess_
25100 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
25110 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64  ss_attr_idx < id
25120 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
25130 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
25140 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
25150 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74  if (identity->at
25160 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
25170 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20  tr_idx].type == 
25180 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29  curr_attr->type)
25190 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
251a0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
251b0 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75   found it, pValu
251c0 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c  e = %p, ulValueL
251d0 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74  en = %lu", ident
251e0 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
251f0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
25200 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d  Value, identity-
25210 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
25220 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
25230 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09  ueLen);.........
25240 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69  .pValue = identi
25250 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
25260 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
25270 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alue;.....ulValu
25280 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  eLen = identity-
25290 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
252a0 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c  _attr_idx].ulVal
252b0 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a  ueLen;....}...}.
252c0 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
252d0 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c  ->pValue && pVal
252e0 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72  ue) {....if (cur
252f0 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c  r_attr->ulValueL
25300 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  en >= ulValueLen
25310 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  ) {.....memcpy(c
25320 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
25330 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75  , pValue, ulValu
25340 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  eLen);....} else
25350 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65   {.....ulValueLe
25360 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
25370 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  ;......retval = 
25380 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
25390 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  MALL;....}...}..
253a0 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  ..curr_attr->ulV
253b0 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75  alueLen = ulValu
253c0 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  eLen;..}...mutex
253d0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
253e0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
253f0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
25400 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
25410 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
25420 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25430 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
25440 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
25450 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
25460 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
25470 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
25480 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
25490 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41  _INVALID) {...CA
254a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
254b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
254c0 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
254d0 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28  INVALID (%i)", (
254e0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
254f0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
25500 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
25510 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41  OO_SMALL) {...CA
25520 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25530 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
25540 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
25550 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  L (%i)", (int) r
25560 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
25570 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
25580 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
25590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
255a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
255b0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74  (%i)", (int) ret
255c0 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  val);..} else {.
255d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
255e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
255f0 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
25600 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  al);..}...return
25610 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
25620 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25630 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72  CK_RV, C_SetAttr
25640 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
25650 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25660 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
25670 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
25680 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
25690 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
256a0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
256b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
256c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
256d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
256e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
256f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25700 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
25710 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
25720 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25730 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
25740 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
25750 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25760 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
25770 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
25780 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
25790 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
257a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
257b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
257c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
257d0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
257e0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
257f0 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  , C_FindObjectsI
25800 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
25810 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
25820 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
25830 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
25840 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
25850 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
25860 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  tID;..CK_ULONG i
25870 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
25880 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
25890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
258a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
258b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
258c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
258d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
258e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
258f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
25900 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
25910 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25920 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
25930 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
25940 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
25950 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
25960 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
25970 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
25980 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25990 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
259a0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
259b0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
259c0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
259d0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
259e0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
259f0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
25a00 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
25a10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
25a20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
25a30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25a40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25a50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
25a60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
25a70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
25a80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
25a90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25aa0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
25ab0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
25ac0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25ad0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
25ae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25af0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
25b00 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
25b10 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25b20 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
25b30 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
25b40 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
25b50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25b60 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
25b70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25b80 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25b90 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
25ba0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25bb0 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61  r.  Search alrea
25bc0 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  dy active.");...
25bd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
25be0 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b  ERATION_ACTIVE);
25bf0 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
25c00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25c10 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
25c20 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
25c30 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
25c40 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
25c50 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
25c60 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
25c70 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25c80 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25c90 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
25ca0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
25cb0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
25cc0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
25cd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
25ce0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
25cf0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
25d00 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
25d10 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
25d20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25d30 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
25d40 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
25d50 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
25d60 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
25d70 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
25d80 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25d90 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25da0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
25db0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
25dc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
25dd0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
25de0 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
25df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25e00 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68  INTF("The slot h
25e10 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69  as been reset si
25e20 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b  nce we last look
25e30 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65  ed for identitie
25e40 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22  s -- rescanning"
25e50 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  );....if (cackey
25e60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25e70 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21  on].identities !
25e80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63  = NULL) {....cac
25e90 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
25ea0 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
25eb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
25ec0 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
25ed0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25ee0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
25ef0 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ount);.....cacke
25f00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25f10 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
25f20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65  = NULL;....cacke
25f30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25f40 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
25f50 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a  count = 0;...}..
25f60 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
25f70 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
25f80 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66   != NULL) {....f
25f90 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
25fa0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b  [slotID].label);
25fb0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
25fc0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
25fd0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61   NULL;...}....ca
25fe0 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
25ff0 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
26000 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63  ts[slotID]);...c
26010 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
26020 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d  ID].slot_reset =
26030 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63   0;..}...if (cac
26040 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26050 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
26060 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
26070 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26080 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
26090 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
260a0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61  d_identities(&ca
260b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
260c0 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73  D], &cackey_sess
260d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
260e0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
260f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70  ;..}...if (pTemp
26100 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  late != NULL) {.
26110 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d  ..if (ulCount !=
26120 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f   0) {....cackey_
26130 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26140 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
26150 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b  count = ulCount;
26160 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
26170 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26180 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c  arch_query = mal
26190 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69  loc(ulCount * si
261a0 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
261b0 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61  );.....memcpy(ca
261c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
261d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
261e0 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c  uery, pTemplate,
261f0 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f   ulCount * sizeo
26200 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a  f(*pTemplate));.
26210 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
26220 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20   idx < ulCount; 
26230 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
26240 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e  (pTemplate[idx].
26250 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29  ulValueLen == 0)
26260 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73   {......cackey_s
26270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26280 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
26290 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c  dx].pValue = NUL
262a0 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  L;.......continu
262b0 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61  e;.....}......ca
262c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
262d0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
262e0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
262f0 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c   = malloc(pTempl
26300 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
26310 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63  Len);......if (c
26320 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26330 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26340 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
26350 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
26360 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26370 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26380 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
26390 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
263a0 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d  dx].pValue, pTem
263b0 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
263c0 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09  ueLen);.....}...
263d0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
263e0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
263f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26400 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20  h_query_count = 
26410 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  0;....cackey_ses
26420 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26430 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
26440 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ULL;...}..} else
26450 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
26460 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
26470 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26480 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26490 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
264a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
264b0 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73    Search query s
264c0 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
264d0 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20  , but number of 
264e0 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20  query terms not 
264f0 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22  specified as 0."
26500 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
26510 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
26520 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
26530 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26540 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
26550 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63  count = 0;...cac
26560 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26570 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
26580 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  ery = NULL;..}..
26590 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
265a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
265b0 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63  h_active = 1;..c
265c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
265d0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
265e0 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d  curr_id = 0;...m
265f0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
26600 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26610 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26620 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
26630 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
26640 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26650 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
26660 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26680 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26690 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
266a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
266b0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
266c0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
266d0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73  rn(CKR_OK);.}..s
266e0 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
266f0 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f  _pkcs11_compare_
26700 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54  attributes(CK_AT
26710 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41  TRIBUTE *a, CK_A
26720 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09  TTRIBUTE *b) {..
26730 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
26740 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62  mallbuf, *largeb
26750 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c  uf;..size_t smal
26760 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62  lbuf_len, largeb
26770 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d  uf_len;...if (a-
26780 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65  >type != b->type
26790 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ) {...return(0);
267a0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
267b0 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e  UG_PRINTF("    .
267c0 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e  .. found matchin
267d0 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09  g type ...");...
267e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
267f0 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f  NTBUF("    ... o
26800 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70  ur value:", a->p
26810 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75  Value, a->ulValu
26820 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e  eLen);...if (b->
26830 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
26840 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26850 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20  _PRINTF("       
26860 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61  ... found wildca
26870 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72  rd match");....r
26880 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69  eturn(1);..}...i
26890 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (a->pValue == 
268a0 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
268b0 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62  (0);..}.. .if (b
268c0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
268d0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26  a->ulValueLen &&
268e0 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75   memcmp(a->pValu
268f0 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d  e, b->pValue, b-
26900 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20  >ulValueLen) == 
26910 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
26920 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
26930 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61     ... found exa
26940 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72  ct match");....r
26950 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73  eturn(1);..}...s
26960 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20  witch (a->type) 
26970 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  {...case CKA_MOD
26980 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e  ULUS:....if (a->
26990 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d  ulValueLen == b-
269a0 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09  >ulValueLen) {..
269b0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
269c0 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
269d0 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75  eLen > b->ulValu
269e0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c  eLen) {.....smal
269f0 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65  lbuf = b->pValue
26a00 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c  ;.....smallbuf_l
26a10 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c  en = b->ulValueL
26a20 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75  en;......largebu
26a30 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09  f = a->pValue;..
26a40 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20  ...largebuf_len 
26a50 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b  = a->ulValueLen;
26a60 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
26a70 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70  .smallbuf = a->p
26a80 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c  Value;.....small
26a90 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56  buf_len = a->ulV
26aa0 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61  alueLen;......la
26ab0 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c  rgebuf = b->pVal
26ac0 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66  ue;.....largebuf
26ad0 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75  _len = b->ulValu
26ae0 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  eLen;....}.....f
26af0 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c  or (; largebuf_l
26b00 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
26b10 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c  en; largebuf++,l
26b20 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b  argebuf_len--) {
26b30 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75  .....if (largebu
26b40 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09  f[0] != 0) {....
26b50 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
26b60 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67  ..}.....if (larg
26b70 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
26b80 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09  lbuf_len) {.....
26b90 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
26ba0 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65  if (memcmp(large
26bb0 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73  buf, smallbuf, s
26bc0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20  mallbuf_len) == 
26bd0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
26be0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
26bf0 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61       ... found a
26c00 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68  pproximate match
26c10 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
26c20 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  1);....}.....bre
26c30 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ak;..}...return(
26c40 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  0);.}..CK_DEFINE
26c50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26c60 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28   C_FindObjects)(
26c70 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26c80 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
26c90 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
26ca0 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c   phObject, CK_UL
26cb0 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43  ONG ulMaxObjectC
26cc0 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ount, CK_ULONG_P
26cd0 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  TR pulObjectCoun
26ce0 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  t) {..struct cac
26cf0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75  key_identity *cu
26d00 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49  rr_id;..CK_ATTRI
26d10 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b  BUTE *curr_attr;
26d20 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f  ..CK_ULONG curr_
26d30 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74  id_idx, curr_out
26d40 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74  _id_idx, curr_at
26d50 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74  tr_idx, sess_att
26d60 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  r_idx;..CK_ULONG
26d70 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
26d80 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
26d90 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  nt;..int mutex_r
26da0 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43 41  etval;.#ifdef CA
26db0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
26dc0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74 72  H_SPEEDTEST..str
26dd0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61 72  uct timeval star
26de0 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f  t, end;..uint64_
26df0 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64  t start_int, end
26e00 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _int;.#endif...C
26e10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26e20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26e30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26e40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26e50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26e60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26e70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26e80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26e90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26ea0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
26eb0 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  (pulObjectCount 
26ec0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
26ed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ee0 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a  ("Error.  pulObj
26ef0 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  ectCount is NULL
26f00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26f10 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
26f20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
26f30 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  ject == NULL && 
26f40 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
26f50 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
26f60 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20  ort circuit, if 
26f70 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72  zero objects wer
26f80 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75  e specified retu
26f90 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d  rn zero items im
26fa0 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a  mediately */...*
26fb0 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
26fc0 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   0;....CACKEY_DE
26fd0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26fe0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
26ff0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
27000 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
27010 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
27020 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63  .}...if (phObjec
27030 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
27040 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27050 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62  TF("Error.  phOb
27060 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ject is NULL.");
27070 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
27080 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
27090 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a  }...if (ulMaxObj
270a0 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  ectCount == 0) {
270b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
270c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
270d0 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
270e0 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66  f objects specif
270f0 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a  ied as zero.");.
27100 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
27110 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
27120 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
27130 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
27140 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
27150 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
27160 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
27170 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
27180 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27190 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
271a0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
271b0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
271c0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
271d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
271e0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
271f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27200 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27210 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27220 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27230 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27240 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
27250 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
27260 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27270 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
27280 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
27290 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
272a0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
272b0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
272c0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
272d0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
272e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
272f0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
27300 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
27310 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
27320 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
27330 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
27340 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27350 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
27360 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
27370 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
27380 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27390 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
273a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
273b0 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69   Search not acti
273c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
273d0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
273e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
273f0 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
27400 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
27410 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74  H_SPEEDTEST..get
27420 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72 74  timeofday(&start
27430 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
27440 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  ..curr_out_id_id
27450 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
27460 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65  r_id_idx = cacke
27470 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27480 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
27490 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  _id; curr_id_idx
274a0 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
274b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
274c0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26  ntities_count &&
274d0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
274e0 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b  t; curr_id_idx++
274f0 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20  ) {...curr_id = 
27500 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
27510 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
27520 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64  ities[curr_id_id
27530 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  x];....CACKEY_DE
27540 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63  BUG_PRINTF("Proc
27550 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  essing identity:
27560 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
27570 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64  long) curr_id_id
27580 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63  x);....matched_c
27590 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72  ount = 0;....for
275a0 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20   (curr_attr_idx 
275b0 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  = 0; curr_attr_i
275c0 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
275d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
275e0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
275f0 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  t; curr_attr_idx
27600 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61  ++) {....prev_ma
27610 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61  tched_count = ma
27620 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09  tched_count;....
27630 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61  .curr_attr = &ca
27640 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27650 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
27660 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69  uery[curr_attr_i
27670 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  dx];.....CACKEY_
27680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
27690 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74  Checking for att
276a0 72 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38  ribute %s (0x%08
276b0 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a  lx) in identity:
276c0 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44  %i...", CACKEY_D
276d0 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
276e0 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f  UTE_TO_STR(curr_
276f0 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e  attr->type), (un
27700 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
27710 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69  r_attr->type, (i
27720 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
27730 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27740 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20  G_PRINTBUF("    
27750 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  Value looking fo
27760 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e  r:", curr_attr->
27770 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74  pValue, curr_att
27780 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  r->ulValueLen);.
27790 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74  ....for (sess_at
277a0 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73  tr_idx = 0; sess
277b0 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72  _attr_idx < curr
277c0 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f  _id->attributes_
277d0 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72  count; sess_attr
277e0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66  _idx++) {.....if
277f0 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f   (cackey_pkcs11_
27800 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74  compare_attribut
27810 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74  es(&curr_id->att
27820 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
27830 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74  r_idx], curr_att
27840 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68  r)) {......match
27850 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09  ed_count++;.....
27860 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09  ..break;.....}..
27870 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68  ..}...../* If th
27880 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c  e attribute coul
27890 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64  d not be matched
278a0 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  , do not try to 
278b0 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c  match additional
278c0 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09   attributes */..
278d0 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68  ..if (prev_match
278e0 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63  ed_count == matc
278f0 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  hed_count) {....
27900 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
27910 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f  ....if (matched_
27920 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f  count == cackey_
27930 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27940 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
27950 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b  count) {....CACK
27960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27970 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74  "  ... All %i at
27980 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
27990 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69   for found, addi
279a0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74  ng identity:%i t
279b0 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22  o returned list"
279c0 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73  , (int) cackey_s
279d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
279e0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
279f0 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72  ount, (int) curr
27a00 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68  _id_idx);.....ph
27a10 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f  Object[curr_out_
27a20 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69  id_idx] = curr_i
27a30 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75  d_idx + 1;.....u
27a40 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d  lMaxObjectCount-
27a50 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f  -;.....curr_out_
27a60 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c  id_idx++;...} el
27a70 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
27a80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
27a90 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f  .. Not all %i (o
27aa0 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74  nly found %i) at
27ab0 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64  tributes checked
27ac0 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20   for found, not 
27ad0 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a  adding identity:
27ae0 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  %i", (int) cacke
27af0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27b00 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
27b10 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d  y_count, (int) m
27b20 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69  atched_count, (i
27b30 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29  nt) curr_id_idx)
27b40 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79  ;...}..}..cackey
27b50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27b60 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
27b70 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78  id = curr_id_idx
27b80 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  ;..*pulObjectCou
27b90 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64  nt = curr_out_id
27ba0 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43 41  _idx;..#ifdef CA
27bb0 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43  CKEY_DEBUG_SEARC
27bc0 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74  H_SPEEDTEST..get
27bd0 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c 20  timeofday(&end, 
27be0 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e  NULL);..start_in
27bf0 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73 65  t = (start.tv_se
27c00 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 73  c * 1000000) + s
27c10 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65  tart.tv_usec;..e
27c20 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76  nd_int = (end.tv
27c30 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
27c40 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09  + end.tv_usec;..
27c50 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
27c60 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75  "Search took %lu
27c70 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22   microseconds\n"
27c80 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
27c90 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61  ) (end_int - sta
27ca0 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66  rt_int));.#endif
27cb0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27cc0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
27cd0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27ce0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
27cf0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
27d00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27d10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27d20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
27d30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27d40 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27d50 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27d60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27d70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
27d80 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20  i), num objects 
27d90 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20  = %lu", CKR_OK, 
27da0 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29  *pulObjectCount)
27db0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
27dc0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
27dd0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
27de0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69   C_FindObjectsFi
27df0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
27e00 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
27e10 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78   {..CK_ULONG idx
27e20 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
27e30 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
27e40 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
27e50 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
27e60 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
27e70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27e80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27e90 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27ea0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27eb0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
27ec0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
27ed0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
27ee0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
27ef0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
27f00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
27f10 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
27f20 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
27f30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27f40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
27f50 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
27f60 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
27f70 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
27f80 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
27f90 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
27fa0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27fb0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
27fc0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27fd0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27fe0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27ff0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28000 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
28010 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28020 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28030 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
28040 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28050 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
28060 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28070 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28080 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
28090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
280a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
280b0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
280c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
280d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
280e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
280f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28100 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
28110 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
28120 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28130 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28140 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
28150 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28160 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
28170 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
28180 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
28190 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
281a0 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ED);..}...cackey
281b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
281c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
281d0 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64  e = 0;...for (id
281e0 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63  x = 0; idx < cac
281f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28200 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
28210 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b  ery_count; idx++
28220 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
28230 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28240 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
28250 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a  [idx].pValue) {.
28260 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
28270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28280 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
28290 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d  dx].pValue);...}
282a0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
282b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
282c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
282d0 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65  ) {...free(cacke
282e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
282f0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
28300 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  y);..}...mutex_r
28310 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28320 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28330 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28340 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28350 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28360 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28370 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
28380 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28390 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
283a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
283b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
283c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
283d0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
283e0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
283f0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28400 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28410 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  V, C_EncryptInit
28420 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28430 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28440 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
28450 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
28460 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
28470 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
28480 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
28490 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
284a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
284b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
284c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
284d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
284e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
284f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
28500 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
28510 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28520 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28530 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
28540 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
28550 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
28560 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
28570 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
28580 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28590 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
285a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
285b0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43  RV, C_Encrypt)(C
285c0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
285d0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
285e0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
285f0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
28600 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
28610 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
28620 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
28630 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20  cryptedDataLen) 
28640 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
28650 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28660 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28670 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28680 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28690 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
286a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
286b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
286c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
286d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
286e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
286f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28700 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28710 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
28720 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
28730 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
28740 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
28750 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28760 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
28770 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
28780 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  , C_EncryptUpdat
28790 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
287a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
287b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
287c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
287d0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
287e0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
287f0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
28800 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
28810 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
28820 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
28830 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
28840 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
28850 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28860 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28870 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
28880 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28890 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
288a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
288b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
288c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
288d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
288e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
288f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
28900 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
28910 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
28920 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
28930 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
28940 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
28950 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46  K_RV, C_EncryptF
28960 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
28970 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28980 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c  , CK_BYTE_PTR pL
28990 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74  astEncryptedPart
289a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
289b0 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50  ulLastEncryptedP
289c0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
289d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
289e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
289f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28a00 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28a20 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28a30 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28a40 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28a50 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28a60 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
28a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28a80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
28a90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
28aa0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
28ab0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
28ac0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
28ad0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
28ae0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
28af0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
28b00 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
28b10 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  yptInit)(CK_SESS
28b20 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
28b30 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
28b40 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
28b50 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
28b60 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
28b70 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
28b80 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
28b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28ba0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28bb0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28bc0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28bd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28be0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
28bf0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
28c00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
28c10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
28c20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
28c30 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
28c40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28c50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28c60 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
28c70 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
28c80 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
28c90 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
28ca0 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
28cb0 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
28cc0 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
28cd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28ce0 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
28cf0 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
28d00 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
28d10 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
28d20 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
28d30 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
28d40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28d50 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28d60 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28d70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28d80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28d90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28da0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28db0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28dc0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28dd0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28de0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28df0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28e00 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
28e10 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
28e20 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
28e30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
28e40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
28e50 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
28e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28e70 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
28e80 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
28e90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
28ea0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
28eb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28ec0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
28ed0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
28ee0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
28ef0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
28f00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28f10 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28f20 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28f30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28f40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28f50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28f60 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
28f70 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
28f80 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
28f90 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
28fa0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28fb0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
28fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28fd0 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61  rror.  Decrypt a
28fe0 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
28ff0 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
29000 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
29010 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
29020 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
29030 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29040 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
29050 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
29060 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29070 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29080 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29090 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
290a0 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
290b0 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
290c0 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
290d0 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
290e0 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
290f0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
29100 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
29110 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
29120 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29130 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
29140 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
29150 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
29160 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
29170 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29180 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
29190 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
291a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
291b0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61  n].decrypt_mecha
291c0 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
291d0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63  m->mechanism;..c
291e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
291f0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
29200 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65  _mech_parm = pMe
29210 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65  chanism->pParame
29220 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  ter;..cackey_ses
29230 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29240 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
29250 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73  mlen = pMechanis
29260 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65  m->ulParameterLe
29270 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  n;..cackey_sessi
29280 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
29290 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d  crypt_identity =
292a0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
292b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
292c0 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09  tities[hKey];...
292d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
292e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
292f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29300 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
29310 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
29320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
29340 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29350 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29360 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29370 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29380 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29390 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
293a0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
293b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
293c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
293d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
293e0 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
293f0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29400 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
29410 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
29420 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
29430 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  dDataLen, CK_BYT
29440 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
29450 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74  ULONG_PTR pulDat
29460 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e  aLen) {..CK_ULON
29470 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  G datalen_update
29480 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b  , datalen_final;
29490 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f  ..CK_RV decrypt_
294a0 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
294b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
294c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
294d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
294e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
294f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29510 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29520 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29530 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29540 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29550 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44  );..}...if (pulD
29560 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ataLen == NULL) 
29570 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29580 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29590 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55  pulDataLen is NU
295a0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
295b0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
295c0 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65  AD);..}...datale
295d0 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44  n_update = *pulD
295e0 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70  ataLen;...decryp
295f0 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
29600 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e  tUpdate(hSession
29610 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61  , pEncryptedData
29620 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74  , ulEncryptedDat
29630 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61  aLen, pData, &da
29640 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09  talen_update);..
29650 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
29660 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
29670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29680 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
29690 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75  yptUpdate() retu
296a0 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
296b0 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
296c0 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
296d0 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28  pt_ret);....if (
296e0 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
296f0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
29700 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72  ALL) {..../* Ter
29710 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f  minate decryptio
29720 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  n operation */..
29730 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
29740 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
29750 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29760 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
29770 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29780 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
29790 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
297a0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
297b0 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
297c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
297d0 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  OR);....}.....if
297e0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
297f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
29800 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
29810 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29820 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29830 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
29840 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29850 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
29860 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
29870 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
29880 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
29890 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  D);....}.....if 
298a0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
298b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
298c0 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ypt_active) {...
298d0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
298e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
298f0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
29900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29910 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
29920 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
29930 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
29940 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
29950 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
29960 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
29970 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29980 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
29990 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72  = 0;.....mutex_r
299a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
299b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
299c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
299d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
299e0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
299f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a00 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
29a10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
29a20 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
29a30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
29a40 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
29a50 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
29a60 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20  .}...if (pData) 
29a70 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74  {...pData += dat
29a80 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a  alen_update;..}.
29a90 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d  .datalen_final =
29aa0 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64   *pulDataLen - d
29ab0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a  atalen_update;..
29ac0 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43  .decrypt_ret = C
29ad0 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53  _DecryptFinal(hS
29ae0 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26  ession, pData, &
29af0 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a  datalen_final);.
29b00 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
29b10 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
29b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b30 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
29b40 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75  ryptFinal() retu
29b50 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
29b60 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
29b70 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79  gned long) decry
29b80 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  pt_ret);....retu
29b90 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
29ba0 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65  ..}...*pulDataLe
29bb0 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  n = datalen_upda
29bc0 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e  te + datalen_fin
29bd0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
29be0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29bf0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
29c00 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
29c10 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
29c20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29c30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
29c40 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
29c50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29c60 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29c70 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
29c80 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
29c90 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
29ca0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
29cb0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
29cc0 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
29cd0 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62  static CK_BYTE b
29ce0 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a  uf[16384];..ssiz
29cf0 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f  e_t buflen;..CK_
29d00 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
29d10 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
29d20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29d30 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  R;..int mutex_re
29d40 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
29d50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29d60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29d70 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29d80 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29d90 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29da0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29db0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29dc0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29dd0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29de0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
29df0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
29e00 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
29e10 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
29e20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
29e30 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
29e40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29e50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29e60 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
29e70 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
29e80 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
29e90 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
29ea0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72  ;..}...if (pEncr
29eb0 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c  yptedPart == NUL
29ec0 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64  L && ulEncrypted
29ed0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
29ee0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
29ef0 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
29f00 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f  ed to decrypt no
29f10 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
29f20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29f30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29f40 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
29f50 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
29f60 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
29f70 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
29f80 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d  pEncryptedPart =
29f90 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
29fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29fb0 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74  "Error. pEncrypt
29fc0 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20  edPart is NULL, 
29fd0 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50  but ulEncryptedP
29fe0 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
29ff0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a000 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2a010 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63  ;..}...if (ulEnc
2a020 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
2a030 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2a040 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a050 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50  or. ulEncryptedP
2a060 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
2a070 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
2a080 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2a090 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2a0a0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  AD);..}...if (pu
2a0b0 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lPartLen == NULL
2a0c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a0d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a0e0 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  . pulPartLen is 
2a0f0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
2a100 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2a110 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
2a120 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2a130 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2a140 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a150 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a160 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a180 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2a190 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2a1a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2a1b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2a1c0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2a1d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2a1e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2a1f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a200 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2a210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2a230 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2a240 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2a250 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2a260 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2a270 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2a280 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a290 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
2a2a0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2a2b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a2c0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2a2d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a2e0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
2a2f0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
2a300 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2a310 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2a320 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a330 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
2a340 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a350 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
2a360 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
2a370 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
2a380 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
2a390 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2a3a0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
2a3b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a3c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2a3d0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2a3e0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
2a3f0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
2a400 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
2a410 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2a420 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2a430 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
2a440 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
2a450 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2a460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a470 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2a480 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2a490 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
2a4a0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
2a4b0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
2a4c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2a4d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2a4e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a4f0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a500 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
2a510 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a520 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
2a530 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
2a540 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
2a550 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
2a560 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09  o decrypt */....
2a570 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
2a580 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
2a590 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2a5a0 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
2a5b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2a5c0 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70  rypt_identity, p
2a5d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75  EncryptedPart, u
2a5e0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2a5f0 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  n, buf, sizeof(b
2a600 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09  uf), 0, 1);.....
2a610 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
2a620 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
2a630 4c 4f 47 49 4e 20 26 26 20 63 61 63 6b 65 79 5f  LOGIN && cackey_
2a640 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
2a650 55 4c 4c 29 20 7b 0a 09 09 09 09 69 66 20 28 43  ULL) {.....if (C
2a660 5f 4c 6f 67 69 6e 28 68 53 65 73 73 69 6f 6e 2c  _Login(hSession,
2a670 20 43 4b 55 5f 55 53 45 52 2c 20 4e 55 4c 4c 2c   CKU_USER, NULL,
2a680 20 30 29 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b   0) == CKR_OK) {
2a690 0a 09 09 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  ......buflen = c
2a6a0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
2a6b0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
2a6c0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
2a6d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a6e0 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
2a6f0 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
2a700 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
2a710 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
2a720 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
2a730 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
2a740 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29  .if (buflen < 0)
2a750 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2a760 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  tion failed. */.
2a770 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d  ....if (buflen =
2a780 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2a790 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
2a7a0 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
2a7b0 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
2a7c0 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
2a7d0 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
2a7e0 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
2a7f0 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
2a800 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
2a810 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
2a820 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
2a830 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2a840 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2a850 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2a860 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
2a870 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
2a880 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
2a890 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
2a8a0 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2a8b0 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
2a8c0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2a8d0 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
2a8e0 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
2a8f0 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2a900 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
2a910 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
2a920 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
2a930 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2a940 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2a950 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2a960 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2a970 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a980 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a990 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2a9a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2a9b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a9c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2a9d0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2a9e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a9f0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2aa00 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2aa10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2aa20 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2aa30 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2aa40 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2aa50 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2aa60 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2aa70 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2aa80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2aa90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2aaa0 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
2aab0 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
2aac0 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2aad0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
2aae0 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
2aaf0 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
2ab00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2ab10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2ab20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2ab30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2ab40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ab50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2ab60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2ab70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2ab80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2ab90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2aba0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2abb0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2abc0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2abd0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2abe0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2abf0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ac00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ac10 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2ac20 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2ac30 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2ac40 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2ac50 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2ac60 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
2ac70 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2ac80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ac90 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
2aca0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2acb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2acc0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2acd0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2ace0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2acf0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2ad00 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2ad10 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2ad20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ad30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2ad40 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2ad50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2ad60 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2ad70 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2ad80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ad90 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2ada0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2adb0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2adc0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2add0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ade0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2adf0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2ae00 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2ae10 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2ae20 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2ae30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ae40 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2ae50 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2ae60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2ae70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ae80 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ae90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2aea0 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2aeb0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2aec0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2aed0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2aee0 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
2aef0 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
2af00 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
2af10 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
2af20 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
2af30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2af40 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
2af50 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2af60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2af70 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2af80 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2af90 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2afa0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2afb0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2afc0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2afd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2afe0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aff0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2b000 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b010 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b020 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2b030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b040 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2b050 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2b060 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2b070 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2b080 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2b090 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
2b0a0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b0b0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2b0c0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2b0d0 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
2b0e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b0f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b100 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b110 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b130 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2b140 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2b150 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b160 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b170 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2b180 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b190 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2b1a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2b1b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2b1c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2b1d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2b1e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b1f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2b200 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2b210 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2b220 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2b230 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2b240 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2b250 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2b260 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2b270 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
2b280 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
2b290 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2b2a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2b2b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2b2c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2b2d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2b2e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b2f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2b300 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2b310 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2b320 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b330 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b340 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b350 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2b360 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2b370 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2b380 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b390 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2b3a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b3b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2b3c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2b3d0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
2b3e0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2b3f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b400 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b410 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2b420 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2b430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b440 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b450 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b460 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b470 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b480 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b490 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b4a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b4b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b4c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b4d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b4e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b4f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b500 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b510 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b520 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b530 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b540 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b550 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b560 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2b570 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
2b580 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2b590 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
2b5a0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2b5b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b5c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b5d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b5e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b5f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b600 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b610 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b620 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b630 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b640 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2b650 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b660 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2b670 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b680 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2b690 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b6a0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2b6b0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2b6c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2b6d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b6e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b6f0 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
2b700 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b710 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2b720 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
2b730 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
2b740 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
2b750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b760 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2b770 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2b780 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2b790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b7a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2b7b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2b7c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2b7d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2b7e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2b7f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b800 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2b810 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b820 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2b830 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b840 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2b850 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2b860 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2b870 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b880 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2b890 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
2b8a0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b8b0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2b8c0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2b8d0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2b8e0 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
2b8f0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
2b900 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
2b910 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2b920 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2b930 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2b940 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2b950 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b960 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2b970 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2b980 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2b990 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b9a0 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
2b9b0 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
2b9c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b9d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
2b9e0 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
2b9f0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ba00 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2ba10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
2ba20 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2ba30 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
2ba40 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
2ba50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ba60 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
2ba70 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
2ba80 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
2ba90 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74  A_PKCS");....ret
2baa0 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53  urn(CKR_MECHANIS
2bab0 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29  M_PARAM_INVALID)
2bac0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2bad0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2bae0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2baf0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2bb00 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2bb10 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2bb20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bb30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bb40 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2bb50 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2bb60 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2bb70 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2bb80 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2bb90 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2bba0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2bbb0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2bbc0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2bbd0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bbe0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bbf0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2bc00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2bc10 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2bc20 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2bc30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bc40 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2bc50 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2bc60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2bc70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2bc80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bc90 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2bca0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2bcb0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2bcc0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2bcd0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2bce0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2bcf0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bd00 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2bd10 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2bd20 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2bd30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2bd40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bd50 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69    Sign already i
2bd60 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
2bd70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2bd80 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
2bd90 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
2bda0 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
2bdb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2bdc0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
2bdd0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2bde0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2bdf0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2be00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2be10 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
2be20 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
2be30 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
2be40 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
2be50 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
2be60 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
2be70 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
2be80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
2be90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2bea0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2beb0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
2bec0 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
2bed0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2bee0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2bef0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bf00 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2bf10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bf20 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
2bf30 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
2bf40 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
2bf50 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2bf60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bf70 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09  _buflen = 128;..
2bf80 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bf90 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2bfa0 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63  ufused = 0;..cac
2bfb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bfc0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
2bfd0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2bfe0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
2bff0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c000 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
2c010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c020 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a  .sign_buflen);..
2c030 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c040 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c  INTF("Session %l
2c050 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  u sign_identity 
2c060 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20  is %p (identity 
2c070 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  #%lu)", (unsigne
2c080 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
2c090 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b  , (void *) &cack
2c0a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c0b0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2c0c0 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
2c0d0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
2c0e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c0f0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2c100 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
2c110 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c120 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2c130 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
2c140 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c150 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2c160 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2c170 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2c180 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2c190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2c1a0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2c1b0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c1c0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c1d0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2c1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c1f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c200 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2c210 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2c220 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2c230 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2c240 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
2c250 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2c260 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2c270 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2c280 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2c290 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2c2a0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2c2b0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2c2c0 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
2c2d0 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
2c2e0 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
2c2f0 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  sign_ret;..int m
2c300 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2c310 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c320 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2c330 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2c340 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2c350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c360 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2c370 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c380 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c390 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c3a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2c3b0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2c3c0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2c3d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2c3e0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2c3f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c400 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2c410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c420 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2c430 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2c440 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2c450 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2c460 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74  NVALID);..}...st
2c470 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2c480 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2c490 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c4a0 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67  n_bufused;...sig
2c4b0 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
2c4c0 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
2c4d0 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
2c4e0 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
2c4f0 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
2c500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c510 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2c520 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
2c530 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2c540 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2c550 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2c560 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  );....if (sign_r
2c570 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
2c580 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2c590 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2c5a0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2c5b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c5c0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2c5d0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2c5e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c5f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c600 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2c610 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
2c620 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2c630 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
2c640 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c650 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2c660 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2c670 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c680 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2c690 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c6a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c6b0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2c6c0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2c6d0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2c6e0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2c6f0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
2c700 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c710 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2c720 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
2c730 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c740 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c750 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
2c760 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c770 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
2c780 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2c790 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2c7a0 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2c7b0 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
2c7c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c7d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2c7e0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
2c7f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2c800 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c810 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c820 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2c830 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2c840 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c850 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2c860 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2c870 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2c880 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2c890 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
2c8a0 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
2c8b0 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
2c8c0 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
2c8d0 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
2c8e0 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
2c8f0 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
2c900 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2c910 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
2c920 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
2c930 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41  O_SMALL) {....CA
2c940 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c950 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  F("SignFinal() r
2c960 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46  eturned CKR_BUFF
2c970 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76  ER_TOO_SMALL (rv
2c980 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67   = %lu), undoing
2c990 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
2c9a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c9b0 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
2c9c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c9d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c9e0 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
2c9f0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
2ca00 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2ca10 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  t);...}....CACKE
2ca20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ca30 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61  Error.  SignFina
2ca40 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
2ca50 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2ca60 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2ca70 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
2ca80 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2ca90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67  );..}...if (pSig
2caa0 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20  nature == NULL) 
2cab0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cac0 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74  _PRINTF("pSignat
2cad0 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73  ure specified as
2cae0 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43   NULL, undoing C
2caf0 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b  _SignUpdate()");
2cb00 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2cb10 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2cb20 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
2cb30 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2cb40 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
2cb50 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
2cb60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cb70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2cb80 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2cb90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2cba0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2cbb0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2cbc0 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
2cbd0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2cbe0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2cbf0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2cc00 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2cc10 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
2cc20 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2cc30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2cc40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2cc50 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2cc60 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2cc70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2cc80 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2cc90 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2cca0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2ccb0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ccc0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2ccd0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2cce0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2ccf0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2cd00 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2cd10 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2cd20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cd30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cd40 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2cd50 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2cd60 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2cd70 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2cd80 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
2cd90 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61   == NULL && ulPa
2cda0 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2cdb0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
2cdc0 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64   if we are asked
2cdd0 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67   to sign nothing
2cde0 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
2cdf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2ce00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2ce10 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
2ce20 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
2ce30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2ce40 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
2ce50 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2ce60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ce70 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20  F("Error. pPart 
2ce80 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50  is NULL, but ulP
2ce90 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
2cea0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ceb0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2cec0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72  ;..}...if (ulPar
2ced0 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
2cee0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cef0 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72  TF("Error. ulPar
2cf00 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70  tLen is 0, but p
2cf10 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Part is not NULL
2cf20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cf30 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2cf40 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2cf50 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2cf60 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2cf70 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2cf80 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2cf90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2cfa0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cfb0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2cfc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2cfd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2cfe0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2cff0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d000 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2d010 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2d020 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d030 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2d040 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d050 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2d060 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2d070 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2d080 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2d090 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2d0a0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2d0b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d0c0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2d0d0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d0e0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d0f0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2d100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d110 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
2d120 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2d130 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2d140 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2d150 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
2d160 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d170 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
2d180 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
2d190 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
2d1a0 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
2d1b0 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09  e directly */...
2d1c0 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73  .if ((cackey_ses
2d1d0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d1e0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75  sign_bufused + u
2d1f0 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b  lPartLen) > cack
2d200 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d210 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2d220 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  n) {.....cackey_
2d230 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d240 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a  n].sign_buflen *
2d250 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  = 2;......cackey
2d260 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2d270 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72  on].sign_buf = r
2d280 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65  ealloc(cackey_se
2d290 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2d2a0 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f  .sign_buf, sizeo
2d2b0 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
2d2c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d2d0 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
2d2e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d2f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
2d300 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
2d310 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d320 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2d330 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73  buf + cackey_ses
2d340 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d350 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50  sign_bufused, pP
2d360 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b  art, ulPartLen);
2d370 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2d380 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d390 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75  ign_bufused += u
2d3a0 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72  lPartLen;.....br
2d3b0 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
2d3c0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2d3d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d3e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2d3f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2d400 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2d410 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d420 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2d430 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2d440 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2d450 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2d460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d470 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2d480 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2d490 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2d4a0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2d4b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d4c0 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29  RV, C_SignFinal)
2d4d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d4e0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d4f0 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2d500 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
2d510 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
2d520 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
2d530 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34  BYTE sigbuf[1024
2d540 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62  ];..ssize_t sigb
2d550 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  uflen;..CK_SLOT_
2d560 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52  ID slotID;..CK_R
2d570 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  V retval = CKR_G
2d580 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69  ENERAL_ERROR;..i
2d590 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  nt terminate_sig
2d5a0 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65  n = 1;..int mute
2d5b0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2d5c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d5d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d5e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d5f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d610 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d620 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d630 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d640 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d650 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
2d660 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d  lSignatureLen ==
2d670 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d690 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74  Error. pulSignat
2d6a0 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  ureLen is NULL."
2d6b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d6c0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2d6d0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2d6e0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2d6f0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2d700 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2d710 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2d720 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2d730 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d740 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d750 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2d760 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2d770 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2d780 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2d790 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2d7a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2d7b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2d7c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2d7d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2d7e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d7f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d800 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2d810 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d820 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2d830 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2d840 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d850 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2d860 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2d870 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2d880 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2d890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d8a0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2d8b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2d8c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d8d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d8e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2d8f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2d900 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d910 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2d920 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d930 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d940 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d950 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d960 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
2d970 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2d980 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2d990 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d9a0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
2d9b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d9c0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
2d9d0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
2d9e0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
2d9f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2da00 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
2da10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
2da20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2da30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2da40 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2da50 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2da60 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
2da70 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
2da80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2da90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2daa0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2dab0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
2dac0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
2dad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dae0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2daf0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2db00 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
2db10 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
2db20 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
2db30 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2db40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2db50 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
2db60 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2db70 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
2db80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2db90 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2dba0 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2dbb0 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2dbc0 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
2dbd0 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43   to sign */....C
2dbe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dbf0 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69  TF("Asking to si
2dc00 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79  gn from identity
2dc10 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25   %p in session %
2dc20 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61  lu", (void *) ca
2dc30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2dc40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
2dc50 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64  ntity, (unsigned
2dc60 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29   long) hSession)
2dc70 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d  ;....sigbuflen =
2dc80 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2dc90 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2dca0 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2dcb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2dcc0 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
2dcd0 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ty, cackey_sessi
2dce0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2dcf0 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73  gn_buf, cackey_s
2dd00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2dd10 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
2dd20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  sigbuf, sizeof(s
2dd30 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a  igbuf), 1, 0);..
2dd40 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
2dd50 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2dd60 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 26 26 20 63  E_NEEDLOGIN && c
2dd70 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
2dd80 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  d != NULL) {....
2dd90 09 69 66 20 28 43 5f 4c 6f 67 69 6e 28 68 53 65  .if (C_Login(hSe
2dda0 73 73 69 6f 6e 2c 20 43 4b 55 5f 55 53 45 52 2c  ssion, CKU_USER,
2ddb0 20 4e 55 4c 4c 2c 20 30 29 20 3d 3d 20 43 4b 52   NULL, 0) == CKR
2ddc0 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 73 69 67 62  _OK) {......sigb
2ddd0 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
2dde0 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
2ddf0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
2de00 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2de10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2de20 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65  _identity, cacke
2de30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2de40 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63  ion].sign_buf, c
2de50 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2de60 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2de70 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73  fused, sigbuf, s
2de80 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31  izeof(sigbuf), 1
2de90 2c 20 30 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  , 0);.....}....}
2dea0 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
2deb0 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
2dec0 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e   Signing failed.
2ded0 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62   */.....if (sigb
2dee0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2def0 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
2df00 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
2df10 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  = CKR_USER_NOT_L
2df20 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20  OGGED_IN;.....} 
2df30 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c  else if (sigbufl
2df40 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2df50 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
2df60 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2df70 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
2df80 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  VED;.....} else 
2df90 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2dfa0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2dfb0 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  R;.....}....} el
2dfc0 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
2dfd0 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
2dfe0 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75  n) > *pulSignatu
2dff0 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74  reLen && pSignat
2e000 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  ure) {...../* Si
2e010 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  gned data too la
2e020 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45  rge */.....CACKE
2e030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e040 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
2e050 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20  FER_TOO_SMALL;  
2e060 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c  sigbuflen = %lu,
2e070 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2e080 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
2e090 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
2e0a0 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
2e0b0 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ng) *pulSignatur
2e0c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76  eLen);......retv
2e0d0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
2e0e0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09  TOO_SMALL;......
2e0f0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2e100 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   0;....} else {.
2e110 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2e120 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20  gn = 0;......if 
2e130 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09  (pSignature) {..
2e140 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e  ....memcpy(pSign
2e150 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73  ature, sigbuf, s
2e160 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  igbuflen);......
2e170 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
2e180 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  = 1;.....}......
2e190 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
2e1a0 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09   = sigbuflen;...
2e1b0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2e1c0 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
2e1d0 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72  ak;..}...if (ter
2e1e0 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09  minate_sign) {..
2e1f0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2e200 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2e210 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72  ign_buf) {....fr
2e220 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
2e230 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2e240 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63  n_buf);...}....c
2e250 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2e260 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2e270 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
2e280 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2e290 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2e2a0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2e2b0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2e2c0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2e2d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e2e0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2e2f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2e300 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2e310 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2e320 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e330 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e340 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
2e350 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
2e360 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
2e370 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2e380 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
2e390 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
2e3a0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2e3b0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2e3c0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2e3d0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2e3e0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2e3f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e400 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e410 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e420 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e430 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e440 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e450 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e460 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e470 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e480 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e490 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e4a0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e4b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e4c0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e4d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e4e0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e4f0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e500 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e510 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e520 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2e530 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  nRecover)(CK_SES
2e540 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e550 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e560 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2e570 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2e580 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2e590 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
2e5a0 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
2e5b0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2e5c0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e5d0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e5e0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e5f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e600 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e610 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e620 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e630 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e640 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e650 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e660 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e670 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e680 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e690 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e6a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e6b0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e6c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e6d0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e6e0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e6f0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69  _RV, C_VerifyIni
2e700 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2e710 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e720 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2e730 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2e740 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2e750 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2e760 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e770 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e780 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e790 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e7a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e7b0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e7c0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e7d0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e7e0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e7f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e800 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e810 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e820 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e830 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e840 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e850 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e860 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e870 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e880 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e890 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43  _RV, C_Verify)(C
2e8a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e8b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e8c0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2e8d0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2e8e0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2e8f0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2e900 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
2e910 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2e920 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e930 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e940 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e950 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e960 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e970 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e980 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e990 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e9a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e9b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e9c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e9d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e9e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e9f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2ea00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ea10 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2ea20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ea30 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2ea40 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2ea50 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64  _RV, C_VerifyUpd
2ea60 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2ea70 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2ea80 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2ea90 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2eaa0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2eab0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2eac0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2ead0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2eae0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2eaf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2eb00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2eb10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2eb20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2eb30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2eb40 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2eb50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2eb60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2eb70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2eb80 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2eb90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2eba0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2ebb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ebc0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2ebd0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2ebe0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
2ebf0 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  fyFinal)(CK_SESS
2ec00 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ec10 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2ec20 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2ec30 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2ec40 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2ec50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ec60 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ec70 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ec80 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ec90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2eca0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ecb0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ecc0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ecd0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2ece0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ecf0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ed00 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ed10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ed20 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ed30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ed40 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2ed50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ed60 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2ed70 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2ed80 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2ed90 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
2eda0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2edb0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2edc0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2edd0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2ede0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2edf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ee00 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ee10 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ee20 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ee30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ee40 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ee50 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ee60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ee70 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ee80 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2ee90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eea0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2eeb0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2eec0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2eed0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2eee0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2eef0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ef00 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ef10 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ef20 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ef30 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28  _VerifyRecover)(
2ef40 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2ef50 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2ef60 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2ef70 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
2ef80 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f  ignatureLen, CK_
2ef90 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2efa0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2efb0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
2efc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2efd0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2efe0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2eff0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f010 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f020 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f030 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f040 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f050 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f060 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f070 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f080 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f090 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f0a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f0b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f0c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f0d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f0e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f0f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2f100 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
2f110 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f120 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f130 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
2f140 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
2f150 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2f160 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2f170 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2f180 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2f190 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2f1a0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2f1b0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2f1c0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2f1d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f1e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f1f0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2f200 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f210 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2f220 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f230 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f240 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f250 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f260 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f270 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f280 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f290 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2f2a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f2b0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2f2c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f2d0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69  _RV, C_DecryptDi
2f2e0 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
2f2f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f300 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2f310 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2f320 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
2f330 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
2f340 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2f350 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2f360 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
2f370 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f380 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f390 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2f3a0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2f3b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f3c0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2f3d0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2f3e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2f3f0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2f400 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2f410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f420 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2f430 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f440 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2f450 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f460 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2f470 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2f480 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f490 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f4a0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f4b0 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
2f4c0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2f4d0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2f4e0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2f4f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2f500 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2f510 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2f520 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2f530 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
2f540 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2f550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2f560 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2f570 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2f580 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2f590 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f5a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2f5b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2f5c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2f5d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2f5e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2f5f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2f600 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2f610 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2f620 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2f630 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f640 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2f650 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f660 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2f670 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2f680 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2f690 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
2f6a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f6b0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2f6c0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2f6d0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2f6e0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2f6f0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2f700 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
2f710 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
2f720 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f730 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2f740 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2f750 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2f760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2f780 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2f790 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2f7a0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2f7b0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2f7c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f7d0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2f7e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f7f0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2f800 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f810 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2f820 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2f830 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f840 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2f850 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2f860 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28   C_GenerateKey)(
2f870 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2f880 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2f890 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2f8a0 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
2f8b0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2f8c0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2f8d0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
2f8e0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
2f8f0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2f900 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2f910 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2f920 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2f930 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f940 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f950 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2f960 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f970 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2f980 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f990 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f9a0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f9b0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f9c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f9d0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f9e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f9f0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2fa00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fa10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2fa20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2fa30 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
2fa40 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49  eyPair)(CK_SESSI
2fa50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2fa60 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2fa70 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2fa80 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2fa90 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70  R pPublicKeyTemp
2faa0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2fab0 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62  lPublicKeyAttrib
2fac0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54  uteCount, CK_ATT
2fad0 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76  RIBUTE_PTR pPriv
2fae0 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  ateKeyTemplate, 
2faf0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61  CK_ULONG ulPriva
2fb00 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  teKeyAttributeCo
2fb10 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2fb20 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c  ANDLE_PTR phPubl
2fb30 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  icKey, CK_OBJECT
2fb40 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72  _HANDLE_PTR phPr
2fb50 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43  ivateKey) {..CAC
2fb60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2fb70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2fb80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2fb90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2fba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fbb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2fbc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2fbd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2fbe0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2fbf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2fc00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fc10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2fc20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2fc30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2fc40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2fc50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2fc60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2fc70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2fc80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2fc90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72  TION(CK_RV, C_Wr
2fca0 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
2fcb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2fcc0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2fcd0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2fce0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2fcf0 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43   hWrappingKey, C
2fd00 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2fd10 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  hKey, CK_BYTE_PT
2fd20 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
2fd30 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57  K_ULONG_PTR pulW
2fd40 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a  rappedKeyLen) {.
2fd50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2fd60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2fd70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2fd80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2fd90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2fda0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2fdb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2fdc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2fdd0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2fde0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2fdf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2fe00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2fe10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2fe20 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2fe30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2fe40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2fe50 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2fe60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2fe70 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2fe80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2fe90 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f  C_UnwrapKey)(CK_
2fea0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2feb0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2fec0 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2fed0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2fee0 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69  HANDLE hUnwrappi
2fef0 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50  ngKey, CK_BYTE_P
2ff00 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
2ff10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70  CK_ULONG ulWrapp
2ff20 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54  edKeyLen, CK_ATT
2ff30 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2ff40 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2ff50 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
2ff60 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2ff70 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
2ff80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ff90 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ffa0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ffb0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ffc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ffd0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ffe0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2fff0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
30000 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
30010 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
30020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
30030 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
30040 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
30050 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
30060 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
30070 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
30080 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
30090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
300a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
300b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
300c0 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53  _DeriveKey)(CK_S
300d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
300e0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
300f0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
30100 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
30110 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20  ANDLE hBaseKey, 
30120 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
30130 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
30140 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
30150 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
30160 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
30170 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
30180 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
30190 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
301a0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
301b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
301c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
301d0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
301e0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
301f0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
30200 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
30210 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
30220 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
30230 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
30240 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
30250 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
30260 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
30270 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
30280 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
30290 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
302a0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
302b0 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f  _RV, C_SeedRando
302c0 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
302d0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
302e0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64  K_BYTE_PTR pSeed
302f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65  , CK_ULONG ulSee
30300 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  dLen) {..CACKEY_
30310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
30320 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
30330 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
30340 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
30350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
30360 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
30370 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
30380 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
30390 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
303a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
303b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
303c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
303d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
303e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
303f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
30400 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
30410 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
30420 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
30430 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30440 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
30450 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  teRandom)(CK_SES
30460 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
30470 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
30480 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43  R pRandomData, C
30490 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d  K_ULONG ulRandom
304a0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
304b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
304c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
304d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
304e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
304f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
30500 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
30510 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
30520 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
30530 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
30540 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
30550 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
30560 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
30570 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
30580 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
30590 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
305a0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
305b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
305c0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  PPORTED);.}../* 
305d0 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74  Deprecated Funct
305e0 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ion */.CK_DEFINE
305f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
30600 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
30610 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  atus)(CK_SESSION
30620 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
30630 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
30640 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
30650 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
30660 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
30670 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
30680 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
30690 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
306a0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
306b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
306c0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
306d0 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
306e0 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
306f0 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
30700 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
30710 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  g */.}../* Depre
30720 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
30730 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
30740 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61  TION(CK_RV, C_Ca
30750 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b  ncelFunction)(CK
30760 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
30770 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
30780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30790 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
307a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
307b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
307c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
307d0 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
307e0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
307f0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
30800 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
30810 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
30820 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
30830 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
30840 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
30850 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
30860 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30870 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
30880 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f  unctionList)(CK_
30890 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
308a0 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e  R_PTR ppFunction
308b0 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43  List) {..CK_FUNC
308c0 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46  TION_LIST_PTR pF
308d0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
308e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
308f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
30900 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c  .if (ppFunctionL
30910 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
30920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
30930 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46  INTF("Error. ppF
30940 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e  unctionList is N
30950 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
30960 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
30970 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63  BAD);..}...pFunc
30980 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f  tionList = mallo
30990 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74  c(sizeof(*pFunct
309a0 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75  ionList));...pFu
309b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
309c0 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
309d0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
309e0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
309f0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e  6) & 0xff;..pFun
30a00 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
30a10 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
30a20 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
30a30 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
30a40 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63   & 0xff;...pFunc
30a50 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
30a60 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69  ialize = C_Initi
30a70 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
30a80 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a  nList->C_Finaliz
30a90 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a  e = C_Finalize;.
30aa0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30ab0 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65  C_GetInfo = C_Ge
30ac0 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
30ad0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
30ae0 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74  List = C_GetSlot
30af0 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
30b00 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49  List->C_GetSlotI
30b10 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49  nfo = C_GetSlotI
30b20 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
30b30 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49  ist->C_GetTokenI
30b40 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e  nfo = C_GetToken
30b50 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
30b60 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53  List->C_WaitForS
30b70 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69  lotEvent = C_Wai
30b80 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09  tForSlotEvent;..
30b90 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30ba0 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
30bb0 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  t = C_GetMechani
30bc0 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  smList;..pFuncti
30bd0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
30be0 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47  hanismInfo = C_G
30bf0 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b  etMechanismInfo;
30c00 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30c10 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43  >C_InitToken = C
30c20 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75  _InitToken;..pFu
30c30 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
30c40 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49  itPIN = C_InitPI
30c50 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
30c60 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f  t->C_SetPIN = C_
30c70 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  SetPIN;..pFuncti
30c80 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
30c90 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65  ssion = C_OpenSe
30ca0 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
30cb0 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
30cc0 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53  ssion = C_CloseS
30cd0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
30ce0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41  onList->C_CloseA
30cf0 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43  llSessions = C_C
30d00 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b  loseAllSessions;
30d10 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30d20 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  >C_GetSessionInf
30d30 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  o = C_GetSession
30d40 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
30d50 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61  List->C_GetOpera
30d60 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65  tionState = C_Ge
30d70 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
30d80 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30d90 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_SetOperationS
30da0 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72  tate = C_SetOper
30db0 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
30dc0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
30dd0 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09  gin = C_Login;..
30de0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30df0 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f  _Logout = C_Logo
30e00 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ut;..pFunctionLi
30e10 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65  st->C_CreateObje
30e20 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a  ct = C_CreateObj
30e30 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
30e40 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63  ist->C_CopyObjec
30e50 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  t = C_CopyObject
30e60 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30e70 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  ->C_DestroyObjec
30e80 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  t = C_DestroyObj
30e90 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
30ea0 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74  ist->C_GetObject
30eb0 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65  Size = C_GetObje
30ec0 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ctSize;..pFuncti
30ed0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74  onList->C_GetAtt
30ee0 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
30ef0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
30f00 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
30f10 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74  t->C_SetAttribut
30f20 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74  eValue = C_SetAt
30f30 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
30f40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30f50 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20  FindObjectsInit 
30f60 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  = C_FindObjectsI
30f70 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
30f80 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
30f90 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  ts = C_FindObjec
30fa0 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ts;..pFunctionLi
30fb0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
30fc0 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f  sFinal = C_FindO
30fd0 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46  bjectsFinal;..pF
30fe0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
30ff0 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45  ncryptInit = C_E
31000 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ncryptInit;..pFu
31010 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
31020 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70  crypt = C_Encryp
31030 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31040 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61  t->C_EncryptUpda
31050 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70  te = C_EncryptUp
31060 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
31070 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46  List->C_EncryptF
31080 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74  inal = C_Encrypt
31090 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
310a0 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
310b0 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74  Init = C_Decrypt
310c0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
310d0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20  List->C_Decrypt 
310e0 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46  = C_Decrypt;..pF
310f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
31100 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ecryptUpdate = C
31110 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _DecryptUpdate;.
31120 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
31130 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_DecryptFinal =
31140 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b   C_DecryptFinal;
31150 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31160 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20  >C_DigestInit = 
31170 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70  C_DigestInit;..p
31180 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31190 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73  Digest = C_Diges
311a0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
311b0 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74  t->C_DigestUpdat
311c0 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61  e = C_DigestUpda
311d0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
311e0 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20  st->C_DigestKey 
311f0 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09  = C_DigestKey;..
31200 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31210 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43  _DigestFinal = C
31220 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70  _DigestFinal;..p
31230 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31240 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67  SignInit = C_Sig
31250 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  nInit;..pFunctio
31260 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20  nList->C_Sign = 
31270 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69  C_Sign;..pFuncti
31280 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70  onList->C_SignUp
31290 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64  date = C_SignUpd
312a0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
312b0 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c  ist->C_SignFinal
312c0 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a   = C_SignFinal;.
312d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
312e0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
312f0 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  t = C_SignRecove
31300 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
31310 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
31320 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63  over = C_SignRec
31330 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
31340 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e  List->C_VerifyIn
31350 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69  it = C_VerifyIni
31360 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31370 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f  t->C_Verify = C_
31380 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69  Verify;..pFuncti
31390 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
313a0 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66  Update = C_Verif
313b0 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
313c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
313d0 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66  yFinal = C_Verif
313e0 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  yFinal;..pFuncti
313f0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
31400 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
31410 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
31420 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
31430 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
31440 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  er = C_VerifyRec
31450 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
31460 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e  List->C_DigestEn
31470 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
31480 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
31490 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
314a0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69  ist->C_DecryptDi
314b0 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
314c0 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
314d0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
314e0 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70  st->C_SignEncryp
314f0 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  tUpdate = C_Sign
31500 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
31510 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31520 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
31530 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
31540 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
31550 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31560 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f  GenerateKey = C_
31570 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46  GenerateKey;..pF
31580 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
31590 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d  enerateKeyPair =
315a0 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
315b0 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ir;..pFunctionLi
315c0 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20  st->C_WrapKey = 
315d0 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  C_WrapKey;..pFun
315e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77  ctionList->C_Unw
315f0 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61  rapKey = C_Unwra
31600 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
31610 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65  List->C_DeriveKe
31620 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b  y = C_DeriveKey;
31630 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31640 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20  >C_SeedRandom = 
31650 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70  C_SeedRandom;..p
31660 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
31670 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d  GenerateRandom =
31680 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
31690 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
316a0 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
316b0 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75  Status = C_GetFu
316c0 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70  nctionStatus;..p
316d0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
316e0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d  CancelFunction =
316f0 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f   C_CancelFunctio
31700 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
31710 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
31720 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63  List = C_GetFunc
31730 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46  tionList;...*ppF
31740 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46  unctionList = pF
31750 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
31760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
31770 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
31780 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
31790 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
317a0 52 5f 4f 4b 29 3b 0a 7d 0a 0a                    R_OK);.}..