Hex Artifact Content

Artifact 1a206186e3277ae46a0b4227024d7de31780be04:


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 09 69 66 20 28  +;...}..}...if (
1f30: 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  logfile != NULL)
1f40: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f50: 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1f60: 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c  log file: %s", l
1f70: 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d  ogfile);....fd =
1f80: 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20   fopen(logfile, 
1f90: 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  "a");..}...if (f
1fa0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  d == NULL) {...f
1fb0: 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a  d = stderr;..}..
1fc0: 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72  .if (fd == stder
1fd0: 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  r) {...CACKEY_DE
1fe0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ff0: 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a  rning stderr");.
2000: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
2010: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2020: 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20  "Returning %p", 
2030: 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d  (void *) fd);..}
2040: 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d  ...return(fd);.}
2050: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43  ..static void *C
2060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2070: 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73  _MALLOC(size_t s
2080: 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ize, const char 
2090: 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29  *func, int line)
20a0: 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c   {..void *retval
20b0: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  ;...retval = mal
20c0: 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72  loc(size);...fpr
20d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
20e0: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
20f0: 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28  %s():%i: MALLOC(
2100: 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45  ) = %p\n", CACKE
2110: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
2120: 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72  ), func, line, r
2130: 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28  etval);..fflush(
2140: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2150: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ));...return(ret
2160: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
2170: 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42  void *CACKEY_DEB
2180: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
2190: 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f  void *ptr, size_
21a0: 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68  t size, const ch
21b0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
21c0: 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74  ne) {..void *ret
21d0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
21e0: 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a  realloc(ptr, siz
21f0: 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  e);...if (retval
2200: 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72   != ptr) {...fpr
2210: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2220: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
2230: 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43  %s():%i: REALLOC
2240: 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41  (%p) = %p\n", CA
2250: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
2260: 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65  ME(), func, line
2270: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a  , ptr, retval);.
2280: 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2290: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a  debug_fd());..}.
22a0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
22b0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
22c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
22d0: 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65  *** ERROR *** re
22e0: 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e  alloc returned N
22f0: 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29  ULL (size = %lu)
2300: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2310: 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72  g) size);..}...r
2320: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2330: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43  ..static char *C
2340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2350: 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68  _STRDUP(const ch
2360: 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63  ar *ptr, const c
2370: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2380: 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65  ine) {..char *re
2390: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
23a0: 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09   strdup(ptr);...
23b0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
23c0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
23d0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44  ]: %s():%i: STRD
23e0: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
23f0: 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  \n", CACKEY_DEBU
2400: 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e  G_GETTIME(), fun
2410: 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29  c, line, retval)
2420: 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ;..fflush(cackey
2430: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09  _debug_fd());...
2440: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2450: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
2460: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
2470: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
2480: 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  TR(unsigned char
2490: 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20   tag) {..switch 
24a0: 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47  (tag) {...case G
24b0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a  SCIS_TAG_CARDID:
24c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24d0: 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a  S_TAG_CARDID");.
24e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
24f0: 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74  _CCC_VER:....ret
2500: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2510: 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  CC_VER");...case
2520: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
2530: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2540: 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52  SCIS_TAG_CCG_VER
2550: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2560: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
2570: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2580: 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09  AG_CARDURL");...
2590: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50  case GSCIS_TAG_P
25a0: 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e  KCS15:....return
25b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  ("GSCIS_TAG_PKCS
25c0: 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  15");...case GSC
25d0: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
25e0: 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e  MODEL:....return
25f0: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  ("GSCIS_TAG_REG_
2600: 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09  DATA_MODEL");...
2610: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
2620: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74  CR_TABLE:....ret
2630: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41  urn("GSCIS_TAG_A
2640: 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  CR_TABLE");...ca
2650: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2660: 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72  D_APDU:....retur
2670: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2680: 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65  D_APDU");...case
2690: 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52   GSCIS_TAG_REDIR
26a0: 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  ECTION:....retur
26b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44  n("GSCIS_TAG_RED
26c0: 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61  IRECTION");...ca
26d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a  se GSCIS_TAG_CT:
26e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
26f0: 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61  S_TAG_CT");...ca
2700: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a  se GSCIS_TAG_ST:
2710: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2720: 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61  S_TAG_ST");...ca
2730: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58  se GSCIS_TAG_NEX
2740: 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28  TCCC:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43  "GSCIS_TAG_NEXTC
2760: 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CC");...case GSC
2770: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09  IS_TAG_FNAME:...
2780: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2790: 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_FNAME");...ca
27a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  se GSCIS_TAG_MNA
27b0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
27c0: 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29  SCIS_TAG_MNAME")
27d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
27e0: 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_LNAME:....ret
27f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c  urn("GSCIS_TAG_L
2800: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
2810: 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a  SCIS_TAG_SUFFIX:
2820: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2830: 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a  S_TAG_SUFFIX");.
2840: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2850: 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09  _GOVT_AGENCY:...
2860: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2870: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29  AG_GOVT_AGENCY")
2880: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2890: 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65  AG_BUREAU:....re
28a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
28b0: 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65  BUREAU");...case
28c0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
28d0: 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  U_CODE:....retur
28e0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
28f0: 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  EAU_CODE");...ca
2900: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50  se GSCIS_TAG_DEP
2910: 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  T_CODE:....retur
2920: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50  n("GSCIS_TAG_DEP
2930: 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  T_CODE");...case
2940: 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45   GSCIS_TAG_TITLE
2950: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2960: 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a  IS_TAG_TITLE");.
2970: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2980: 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65  _BUILDING:....re
2990: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29a0: 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61  BUILDING");...ca
29b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
29c0: 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65  ICE_ADDR1:....re
29d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29e0: 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a  OFFICE_ADDR1");.
29f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2a00: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09  _OFFICE_ADDR2:..
2a10: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2a20: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
2a30: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
2a50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49  IS_TAG_OFFICE_CI
2a70: 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TY");...case GSC
2a80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a90: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2aa0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ab0: 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65  _STATE");...case
2ac0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2ad0: 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e  E_ZIP:....return
2ae0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2af0: 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65  CE_ZIP");...case
2b00: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2b10: 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65  E_COUNTRY:....re
2b20: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2b30: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29  OFFICE_COUNTRY")
2b40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2b50: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a  AG_OFFICE_PHONE:
2b60: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2b70: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2b80: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NE");...case GSC
2b90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2ba0: 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75  ONE_EXT:....retu
2bb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2bc0: 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29  FICE_PHONE_EXT")
2bd0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2be0: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09  AG_OFFICE_FAX:..
2bf0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2c00: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29  TAG_OFFICE_FAX")
2c10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2c20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a  AG_OFFICE_EMAIL:
2c30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2c40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41  S_TAG_OFFICE_EMA
2c50: 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IL");...case GSC
2c60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
2c70: 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OM:....return("G
2c80: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c90: 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47  ROOM");...case G
2ca0: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
2cb0: 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72  AGENCY:....retur
2cc0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  n("GSCIS_TAG_NON
2cd0: 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09  GOV_AGENCY");...
2ce0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2cf0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09  SN_DESIGNATOR:..
2d00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d10: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2d20: 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  OR");...case GSC
2d30: 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72  IS_TAG_SSN:....r
2d40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2d50: 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  _SSN");...case G
2d60: 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09  SCIS_TAG_DOB:...
2d70: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d80: 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65  AG_DOB");...case
2d90: 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45   GSCIS_TAG_GENDE
2da0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2db0: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29  CIS_TAG_GENDER")
2dc0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2dd0: 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65  AG_USERID:....re
2de0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2df0: 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  USERID");...case
2e00: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
2e10: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
2e20: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29  CIS_TAG_DOMAIN")
2e30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2e40: 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09  AG_PASSWORD:....
2e50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2e60: 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09  G_PASSWORD");...
2e70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49  case GSCIS_TAG_I
2e80: 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75  SSUERID:....retu
2e90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53  rn("GSCIS_TAG_IS
2ea0: 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  SUERID");...case
2eb0: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
2ec0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ed0: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a  IS_TAG_SERNO");.
2ee0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ef0: 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09  _ISSUE_DATE:....
2f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f10: 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a  G_ISSUE_DATE");.
2f20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2f30: 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09  _EXPIRE_DATE:...
2f40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f50: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29  AG_EXPIRE_DATE")
2f60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2f70: 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09  AG_CARD_TYPE:...
2f80: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f90: 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a  AG_CARD_TYPE");.
2fa0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2fb0: 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a  _SECURITY_CODE:.
2fc0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2fd0: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
2fe0: 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DE");...case GSC
2ff0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3000: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
3010: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3020: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
3030: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
3040: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3050: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
3060: 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CATE");...case G
3070: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53  SCIS_TAG_CERT_IS
3080: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
3090: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
30a0: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29  ERT_ISSUE_DATE")
30b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
30c0: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
30d0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30e0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
30f0: 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d  XPIRE_DATE");..}
3100: 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
3110: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
3120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
3130: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
3140: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f  ARDERR_TO_STR(LO
3150: 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73  NG retcode) {..s
3160: 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20  witch (retcode) 
3170: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53  {...case SCARD_S
3180: 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74  _SUCCESS:....ret
3190: 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43  urn("SCARD_S_SUC
31a0: 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53  CESS");...case S
31b0: 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44  CARD_E_CANCELLED
31c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
31d0: 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29  RD_E_CANCELLED")
31e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
31f0: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09  _CANT_DISPOSE:..
3200: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3210: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29  E_CANT_DISPOSE")
3220: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3230: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
3240: 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFER:....return(
3250: 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49  "SCARD_E_INSUFFI
3260: 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a  CIENT_BUFFER");.
3270: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3280: 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72  NVALID_ATR:....r
3290: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
32a0: 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09  NVALID_ATR");...
32b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
32c0: 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09  ALID_HANDLE:....
32d0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29  INVALID_HANDLE")
32f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3300: 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54  _INVALID_PARAMET
3310: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3320: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50  CARD_E_INVALID_P
3330: 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61  ARAMETER");...ca
3340: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
3350: 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65  ID_TARGET:....re
3360: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3370: 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a  VALID_TARGET");.
3380: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3390: 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09  NVALID_VALUE:...
33a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
33b0: 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29  _INVALID_VALUE")
33c0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
33d0: 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72  _NO_MEMORY:....r
33e0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
33f0: 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61  O_MEMORY");...ca
3400: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  se SCARD_E_UNKNO
3410: 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65  WN_READER:....re
3420: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3430: 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a  KNOWN_READER");.
3440: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54  ..case SCARD_E_T
3450: 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72  IMEOUT:....retur
3460: 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f  n("SCARD_E_TIMEO
3470: 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  UT");...case SCA
3480: 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RD_E_SHARING_VIO
3490: 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  LATION:....retur
34a0: 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49  n("SCARD_E_SHARI
34b0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a  NG_VIOLATION");.
34c0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
34d0: 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09  O_SMARTCARD:....
34e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
34f0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a  NO_SMARTCARD");.
3500: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3510: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09  NKNOWN_CARD:....
3520: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3530: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a  UNKNOWN_CARD");.
3540: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
3550: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09  ROTO_MISMATCH:..
3560: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3570: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
3580: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3590: 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09  _E_NOT_READY:...
35a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35b0: 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09  _NOT_READY");...
35c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53  case SCARD_E_SYS
35d0: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  TEM_CANCELLED:..
35e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35f0: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
3600: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3610: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
3620: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3630: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
3640: 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65  SACTED");...case
3650: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3660: 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  UNAVAILABLE:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3680: 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42  READER_UNAVAILAB
3690: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LE");...case SCA
36a0: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
36b0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
36c0: 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  ("SCARD_W_UNSUPP
36d0: 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  ORTED_CARD");...
36e0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52  case SCARD_W_UNR
36f0: 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a  ESPONSIVE_CARD:.
3700: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3710: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f  _W_UNRESPONSIVE_
3720: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3730: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
3740: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3750: 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  ("SCARD_W_UNPOWE
3760: 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  RED_CARD");...ca
3770: 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54  se SCARD_W_RESET
3780: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3790: 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  ("SCARD_W_RESET_
37a0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37b0: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
37c0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
37d0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
37e0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37f0: 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53  CARD_E_PCI_TOO_S
3800: 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MALL:....return(
3810: 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f  "SCARD_E_PCI_TOO
3820: 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65  _SMALL");...case
3830: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3840: 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09  UNSUPPORTED:....
3850: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3860: 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54  READER_UNSUPPORT
3870: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3880: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
3890: 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  EADER:....return
38a0: 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  ("SCARD_E_DUPLIC
38b0: 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09  ATE_READER");...
38c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52  case SCARD_E_CAR
38d0: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09  D_UNSUPPORTED:..
38e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38f0: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
3900: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3910: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a  RD_E_NO_SERVICE:
3920: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3930: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29  D_E_NO_SERVICE")
3940: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3950: 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44  _SERVICE_STOPPED
3960: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3970: 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f  RD_E_SERVICE_STO
3980: 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  PPED");...case S
3990: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
39a0: 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72  ED_FEATURE:....r
39b0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
39c0: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
39d0: 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41  RE");.#ifdef SCA
39e0: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
39f0: 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  RD...case SCARD_
3a00: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a  W_INSERTED_CARD:
3a10: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3a20: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a30: 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  D");.#endif.#ifd
3a40: 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45  ef SCARD_E_NO_RE
3a50: 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a  ADERS_AVAILABLE.
3a60: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3a70: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41  O_READERS_AVAILA
3a80: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
3a90: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
3aa0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a  RS_AVAILABLE");.
3ab0: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75  #endif..}...retu
3ac0: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3ad0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3ae0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3af0: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
3b00: 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a  STR(uint16_t obj
3b10: 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f  id) {..switch (o
3b20: 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30  bjid) {...case 0
3b30: 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2000:....return
3b40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3b50: 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29  ID_GENERALINFO")
3b60: 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a  ;...case 0x2100:
3b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3b80: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
3b90: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a  PERSONALINFO");.
3ba0: 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09  ..case 0x3000:..
3bb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3bc0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
3bd0: 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61  SCONTROL");...ca
3be0: 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65  se 0x4000:....re
3bf0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3c00: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a  _OBJID_LOGIN");.
3c10: 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09  ..case 0x5000:..
3c20: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3c30: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49  _TLV_OBJID_CARDI
3c40: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NFO");...case 0x
3c50: 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  6000:....return(
3c60: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c70: 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a  D_BIOMETRICS");.
3c80: 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09  ..case 0x7000:..
3c90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3ca0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
3cb0: 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63  ALSIGCERT");...c
3cc0: 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72  ase 0x0200:....r
3cd0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ce0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3cf0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  ON");...case 0x0
3d00: 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  202:....return("
3d10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3d20: 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b  _CAC_BENEFITS");
3d30: 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a  ...case 0x0203:.
3d40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3d60: 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b  OTHERBENEFITS");
3d70: 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a  ...case 0x0201:.
3d80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3da0: 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63  PERSONNEL");...c
3db0: 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72  ase 0x02FE:....r
3dc0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3dd0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43  V_OBJID_CAC_PKIC
3de0: 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74  ERT");..}....ret
3df0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3e00: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3e10: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3e20: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
3e30: 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61  TO_STR(uint8_t a
3e40: 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63  pptype) {..switc
3e50: 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09  h (apptype) {...
3e60: 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65  case 0x00:....re
3e70: 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09  turn("NONE");...
3e80: 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65  case 0x01:....re
3e90: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3ea0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a  _APP_GENERIC");.
3eb0: 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09  ..case 0x02:....
3ec0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ed0: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09  LV_APP_SKI");...
3ee0: 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65  case 0x03:....re
3ef0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3f00: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3f10: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f20: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34  I");...case 0x04
3f30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3f40: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3f50: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a  );...case 0x05:.
3f60: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3f70: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3f80: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
3f90: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3fa0: 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e   0x06:....return
3fb0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3fc0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c  _SKI | CACKEY_TL
3fd0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63  V_APP_PKI");...c
3fe0: 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74  ase 0x07:....ret
3ff0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
4000: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
4010: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
4020: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
4030: 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65  P_PKI");..}...re
4040: 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b  turn("INVALID");
4050: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
4060: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
4070: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
4080: 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54  TE_TO_STR(CK_ATT
4090: 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72  RIBUTE_TYPE attr
40a0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74  ) {..switch (att
40b0: 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  r) {...case CKA_
40c0: 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CLASS:....return
40d0: 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09  ("CKA_CLASS");..
40e0: 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a  .case CKA_TOKEN:
40f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4100: 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  TOKEN");...case 
4110: 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
4120: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56  return("CKA_PRIV
4130: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
4140: 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75  A_LABEL:....retu
4150: 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b  rn("CKA_LABEL");
4160: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c  ...case CKA_APPL
4170: 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  ICATION:....retu
4180: 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54  rn("CKA_APPLICAT
4190: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ION");...case CK
41a0: 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  A_VALUE:....retu
41b0: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b  rn("CKA_VALUE");
41c0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45  ...case CKA_OBJE
41d0: 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  CT_ID:....return
41e0: 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22  ("CKA_OBJECT_ID"
41f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45  );...case CKA_CE
4200: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
4210: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4220: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22  ERTIFICATE_TYPE"
4230: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53  );...case CKA_IS
4240: 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  SUER:....return(
4250: 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09  "CKA_ISSUER");..
4260: 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
4270: 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75  _NUMBER:....retu
4280: 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  rn("CKA_SERIAL_N
4290: 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20  UMBER");...case 
42a0: 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09  CKA_AC_ISSUER:..
42b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43  ..return("CKA_AC
42c0: 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73  _ISSUER");...cas
42d0: 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09  e CKA_OWNER:....
42e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45  return("CKA_OWNE
42f0: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4300: 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72  ATTR_TYPES:....r
4310: 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f  eturn("CKA_ATTR_
4320: 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20  TYPES");...case 
4330: 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
4340: 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53  return("CKA_TRUS
4350: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  TED");...case CK
4360: 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72  A_KEY_TYPE:....r
4370: 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54  eturn("CKA_KEY_T
4380: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
4390: 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65  A_SUBJECT:....re
43a0: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43  turn("CKA_SUBJEC
43b0: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
43c0: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
43d0: 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20  KA_ID");...case 
43e0: 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
43f0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4400: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4410: 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09  e CKA_ENCRYPT:..
4420: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e  ..return("CKA_EN
4430: 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20  CRYPT");...case 
4440: 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
4450: 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52  return("CKA_DECR
4460: 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPT");...case CK
4470: 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72  A_WRAP:....retur
4480: 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09  n("CKA_WRAP");..
4490: 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50  .case CKA_UNWRAP
44a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44b0: 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73  _UNWRAP");...cas
44c0: 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72  e CKA_SIGN:....r
44d0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22  eturn("CKA_SIGN"
44e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
44f0: 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72  GN_RECOVER:....r
4500: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f  eturn("CKA_SIGN_
4510: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
4520: 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09  e CKA_VERIFY:...
4530: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52  .return("CKA_VER
4540: 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IFY");...case CK
4550: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4560: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4570: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22  _VERIFY_RECOVER"
4580: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45  );...case CKA_DE
4590: 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIVE:....return(
45a0: 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09  "CKA_DERIVE");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f  .case CKA_START_
45c0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
45d0: 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22  "CKA_START_DATE"
45e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
45f0: 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  D_DATE:....retur
4600: 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22  n("CKA_END_DATE"
4610: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4620: 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e  DULUS:....return
4630: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b  ("CKA_MODULUS");
4640: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
4650: 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUS_BITS:....ret
4660: 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53  urn("CKA_MODULUS
4670: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
4680: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
4690: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46a0: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
46b0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
46c0: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
46d0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46e0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46f0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
4700: 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65  A_PRIME_1:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4720: 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  1");...case CKA_
4730: 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75  PRIME_2:....retu
4740: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22  rn("CKA_PRIME_2"
4750: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58  );...case CKA_EX
4760: 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74  PONENT_1:....ret
4770: 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e  urn("CKA_EXPONEN
4780: 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  T_1");...case CK
4790: 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09  A_EXPONENT_2:...
47a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50  .return("CKA_EXP
47b0: 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73  ONENT_2");...cas
47c0: 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e  e CKA_COEFFICIEN
47d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
47e0: 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b  A_COEFFICIENT");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d  ...case CKA_PRIM
4800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4810: 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  A_PRIME");...cas
4820: 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a  e CKA_SUBPRIME:.
4830: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4840: 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  UBPRIME");...cas
4850: 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72  e CKA_BASE:....r
4860: 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22  eturn("CKA_BASE"
4870: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
4880: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
4890: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42  urn("CKA_PRIME_B
48a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
48b0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
48d0: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22  _SUB_PRIME_BITS"
48e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41  );...case CKA_VA
48f0: 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUE_BITS:....ret
4900: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42  urn("CKA_VALUE_B
4910: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
4920: 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09  A_VALUE_LEN:....
4930: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55  return("CKA_VALU
4940: 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  E_LEN");...case 
4950: 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  CKA_EXTRACTABLE:
4960: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4970: 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09  EXTRACTABLE");..
4980: 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a  .case CKA_LOCAL:
4990: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
49a0: 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20  LOCAL");...case 
49b0: 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43  CKA_NEVER_EXTRAC
49c0: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
49d0: 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52  ("CKA_NEVER_EXTR
49e0: 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  ACTABLE");...cas
49f0: 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  e CKA_ALWAYS_SEN
4a00: 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72  SITIVE:....retur
4a10: 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  n("CKA_ALWAYS_SE
4a20: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4a30: 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45  e CKA_KEY_GEN_ME
4a40: 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75  CHANISM:....retu
4a50: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f  rn("CKA_KEY_GEN_
4a60: 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63  MECHANISM");...c
4a70: 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ase CKA_MODIFIAB
4a80: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4a90: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b  KA_MODIFIABLE");
4aa0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53  ...case CKA_ECDS
4ab0: 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74  A_PARAMS:....ret
4ac0: 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50  urn("CKA_ECDSA_P
4ad0: 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20  ARAMS");...case 
4ae0: 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09  CKA_EC_POINT:...
4af0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f  .return("CKA_EC_
4b00: 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  POINT");...case 
4b10: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b20: 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TH:....return("C
4b30: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b40: 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  H");...case CKA_
4b50: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a  AUTH_PIN_FLAGS:.
4b60: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4b70: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b  UTH_PIN_FLAGS");
4b80: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46  ...case CKA_HW_F
4b90: 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09  EATURE_TYPE:....
4ba0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46  return("CKA_HW_F
4bb0: 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09  EATURE_TYPE");..
4bc0: 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f  .case CKA_RESET_
4bd0: 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75  ON_INIT:....retu
4be0: 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e  rn("CKA_RESET_ON
4bf0: 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20  _INIT");...case 
4c00: 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09  CKA_HAS_RESET:..
4c10: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41  ..return("CKA_HA
4c20: 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73  S_RESET");...cas
4c30: 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  e CKA_VENDOR_DEF
4c40: 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  INED:....return(
4c50: 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49  "CKA_VENDOR_DEFI
4c60: 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  NED");..}...retu
4c70: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
4c80: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c  ..#  define mall
4c90: 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42  oc(x) CACKEY_DEB
4ca0: 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78  UG_FUNC_MALLOC(x
4cb0: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
4cc0: 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20  NE__).#  define 
4cd0: 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41  realloc(x, y) CA
4ce0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cf0: 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f  REALLOC(x, y, __
4d00: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d10: 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75  ).#  ifdef strdu
4d20: 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72  p.#    undef str
4d30: 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20  dup.#  endif.#  
4d40: 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29  define strdup(x)
4d50: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4d60: 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66  NC_STRDUP(x, __f
4d70: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d80: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4d90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
4da0: 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a  INTF(x...) /**/.
4db0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
4dd0: 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20  f, x, y) /**/.# 
4de0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4df0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
4e00: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e10: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e30: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
4e40: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e50: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e60: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e70: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
4e80: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4e90: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4eb0: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
4ec0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ed0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ee0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4ef0: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
4f00: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f10: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74 79  BLED".#endif..ty
4f20: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
4f30: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
4f40: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
4f50: 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f 49  E_PIV,..CACKEY_I
4f60: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
4f70: 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  .} cackey_pcsc_i
4f80: 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74 20  d_type;..struct 
4f90: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
4fa0: 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f 70  tity {..cackey_p
4fb0: 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
4fc0: 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ype;...size_t ce
4fd0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
4fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
4ff0: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
5000: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 0a  ize_t keysize;..
5010: 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63  .union {...struc
5020: 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20  t {....unsigned 
5030: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
5040: 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65  ...uint16_t file
5050: 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73 74  ;...} cac;....st
5060: 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e  ruct {....unsign
5070: 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b 0a  ed char key_id;.
5080: 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33 32  ...char label[32
5090: 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63  ];...} piv;..} c
50a0: 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ard;.};..struct 
50b0: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
50c0: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
50d0: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
50e0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  pcsc_identity;..
50f0: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  .CK_ATTRIBUTE *a
5100: 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55  ttributes;..CK_U
5110: 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f  LONG attributes_
5120: 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63  count;.};..struc
5130: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
5140: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
5150: 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
5160: 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20  tID;...CK_STATE 
5170: 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53  state;..CK_FLAGS
5180: 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e   flags;..CK_ULON
5190: 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  G ulDeviceError;
51a0: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  ..CK_VOID_PTR pA
51b0: 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f  pplication;..CK_
51c0: 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a  NOTIFY Notify;..
51d0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
51e0: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
51f0: 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
5200: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
5210: 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72  ount;...int sear
5220: 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41  ch_active;..CK_A
5230: 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65 61  TTRIBUTE_PTR sea
5240: 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55  rch_query;..CK_U
5250: 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72  LONG search_quer
5260: 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  y_count;..unsign
5270: 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63  ed long search_c
5280: 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69  urr_id;...int si
5290: 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d  gn_active;..CK_M
52a0: 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69  ECHANISM_TYPE si
52b0: 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  gn_mechanism;..C
52c0: 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f  K_BYTE_PTR sign_
52d0: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
52e0: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b  ong sign_buflen;
52f0: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5300: 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73  sign_bufused;..s
5310: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5320: 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e  ntity *sign_iden
5330: 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72  tity;...int decr
5340: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
5350: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
5360: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
5370: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
5380: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
5390: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
53a0: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
53b0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
53c0: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79  _identity *decry
53d0: 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a  pt_identity;.};.
53e0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
53f0: 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  lot {..int activ
5400: 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c  e;..int internal
5410: 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  ;...char *pcsc_r
5420: 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73  eader;...int pcs
5430: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
5440: 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70  ;..SCARDHANDLE p
5450: 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20  csc_card;...int 
5460: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
5470: 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74  h;..int transact
5480: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
5490: 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73  ;...int slot_res
54a0: 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74  et;...CK_FLAGS t
54b0: 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e  oken_flags;...un
54c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62  signed char *lab
54d0: 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74  el;...DWORD prot
54e0: 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  ocol;...unsigned
54f0: 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74   int cached_cert
5500: 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74  s_count;..struct
5510: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
5520: 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65  ntity *cached_ce
5530: 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  rts;.};..typedef
5540: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
5550: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
5560: 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f  = 0x01,..CACKEY_
5570: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20  TLV_APP_SKI     
5580: 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f  = 0x02,..CACKEY_
5590: 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20  TLV_APP_PKI     
55a0: 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f  = 0x04.} cackey_
55b0: 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79  tlv_apptype;..ty
55c0: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
55d0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
55e0: 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20  ENERALINFO      
55f0: 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b   = 0x2000,..CACK
5600: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
5610: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d  PERSONALINFO   =
5620: 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59   0x2100,..CACKEY
5630: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
5640: 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30  SCONTROL     = 0
5650: 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x3000,..CACKEY_T
5660: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20  LV_OBJID_LOGIN  
5670: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34             = 0x4
5680: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5690: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20  _OBJID_CARDINFO 
56a0: 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30           = 0x500
56b0: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
56c0: 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20  BJID_BIOMETRICS 
56d0: 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c         = 0x6000,
56e0: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
56f0: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
5700: 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09  T    = 0x7000,..
5710: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5720: 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20  _CAC_PERSON     
5730: 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41     = 0x0200,..CA
5740: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
5750: 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20  AC_BENEFITS     
5760: 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b   = 0x0202,..CACK
5770: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
5780: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d  _OTHERBENEFITS =
5790: 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59   0x0203,..CACKEY
57a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
57b0: 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30  ERSONNEL     = 0
57c0: 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54  x0201,..CACKEY_T
57d0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
57e0: 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30  CERT       = 0x0
57f0: 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  2FE.} cackey_tlv
5800: 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65  _objectid;..type
5810: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5820: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
5830: 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09  RESENT    = 1,..
5840: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
5860: 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  0,..CACKEY_PCSC_
5870: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20  E_GENERIC       
5880: 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f    = -1,..CACKEY_
5890: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20  PCSC_E_BADPIN   
58a0: 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41         = -2,..CA
58b0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
58c0: 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33  ED          = -3
58d0: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
58e0: 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20  _NEEDLOGIN      
58f0: 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50   = -4,..CACKEY_P
5900: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
5910: 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43  T     = -6,..CAC
5920: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
5930: 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a             = -7.
5940: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73  } cackey_ret;..s
5950: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
5960: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69  _cardurl {..unsi
5970: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
5980: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79   rid[5];..cackey
5990: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61  _tlv_apptype   a
59a0: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  pptype;..cackey_
59b0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62  tlv_objectid  ob
59c0: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f  jectid;..cackey_
59d0: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70  tlv_objectid  ap
59e0: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  pid;..unsigned c
59f0: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64  har        pinid
5a00: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5a10: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a  key_tlv_entity;.
5a20: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
5a30: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74  v_entity {..uint
5a40: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  8_t tag;..size_t
5a50: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e   length;...union
5a60: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65   {...void *value
5a70: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
5a80: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76  y_tlv_cardurl *v
5a90: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09  alue_cardurl;...
5aa0: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79  uint8_t value_by
5ab0: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74  te;..};...struct
5ac0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
5ad0: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f  ty *_next;.};../
5ae0: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20  * CACKEY Global 
5af0: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5b00: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62  c void *cackey_b
5b10: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73  iglock = NULL;.s
5b20: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
5b30: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b  key_session cack
5b40: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d  ey_sessions[128]
5b50: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
5b60: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b  cackey_slot cack
5b70: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73  ey_slots[128];.s
5b80: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
5b90: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
5ba0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
5bb0: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
5bc0: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49   = 0;.CK_C_INITI
5bd0: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65  ALIZE_ARGS cacke
5be0: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74  y_args;../** Ext
5bf0: 72 61 20 63 65 72 74 69 66 69 63 61 74 65 73 20  ra certificates 
5c00: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f  to include in to
5c10: 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63  ken **/.struct c
5c20: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5c30: 69 74 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b  ity extra_certs[
5c40: 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
5c50: 63 61 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63  cackey_builtin_c
5c60: 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50  erts.h".};../* P
5c70: 72 6f 74 65 63 74 65 64 20 41 75 74 68 65 6e 74  rotected Authent
5c80: 69 63 61 74 69 6f 6e 20 50 61 74 68 20 63 6f 6d  ication Path com
5c90: 6d 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  mand */.#define 
5ca0: 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
5cb0: 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52 28  ND_DEFAULT_XSTR(
5cc0: 73 74 72 29 20 43 41 43 4b 45 59 5f 50 49 4e 5f  str) CACKEY_PIN_
5cd0: 43 4f 4d 4d 41 4e 44 5f 44 45 46 41 55 4c 54 5f  COMMAND_DEFAULT_
5ce0: 53 54 52 28 73 74 72 29 0a 23 64 65 66 69 6e 65  STR(str).#define
5cf0: 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
5d00: 41 4e 44 5f 44 45 46 41 55 4c 54 5f 53 54 52 28  AND_DEFAULT_STR(
5d10: 73 74 72 29 20 23 73 74 72 0a 73 74 61 74 69 63  str) #str.static
5d20: 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 70 69   char *cackey_pi
5d30: 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 4e 55 4c 4c  n_command = NULL
5d40: 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  ;.static char *c
5d50: 61 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e  ackey_pin_comman
5d60: 64 5f 78 6f 6e 6c 79 20 3d 20 4e 55 4c 4c 3b 0a  d_xonly = NULL;.
5d70: 0a 2f 2a 20 50 43 53 43 20 47 6c 6f 62 61 6c 20  ./* PCSC Global 
5d80: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5d90: 63 20 4c 50 53 43 41 52 44 43 4f 4e 54 45 58 54  c LPSCARDCONTEXT
5da0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e   cackey_pcsc_han
5db0: 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61  dle = NULL;..sta
5dc0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5dd0: 67 20 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73  g cackey_getvers
5de0: 69 6f 6e 28 76 6f 69 64 29 20 7b 0a 09 73 74 61  ion(void) {..sta
5df0: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
5e00: 67 20 72 65 74 76 61 6c 20 3d 20 32 35 35 3b 0a  g retval = 255;.
5e10: 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6d  .unsigned long m
5e20: 61 6a 6f 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67  ajor = 0;..unsig
5e30: 6e 65 64 20 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d  ned long minor =
5e40: 20 30 3b 0a 09 63 68 61 72 20 2a 6d 61 6a 6f 72   0;..char *major
5e50: 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68  _str = NULL;..ch
5e60: 61 72 20 2a 6d 69 6e 6f 72 5f 73 74 72 20 3d 20  ar *minor_str = 
5e70: 4e 55 4c 4c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  NULL;...CACKEY_D
5e80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
5e90: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 72 65  led.");...if (re
5ea0: 74 76 61 6c 20 21 3d 20 32 35 35 29 20 7b 0a 09  tval != 255) {..
5eb0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5ec0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
5ed0: 30 78 25 6c 78 20 28 63 61 63 68 65 64 29 2e 22  0x%lx (cached)."
5ee0: 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65  , retval);....re
5ef0: 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 7d  turn(retval);..}
5f00: 0a 0a 09 72 65 74 76 61 6c 20 3d 20 30 3b 0a 0a  ...retval = 0;..
5f10: 23 69 66 64 65 66 20 50 41 43 4b 41 47 45 5f 56  #ifdef PACKAGE_V
5f20: 45 52 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 6d  ERSION.        m
5f30: 61 6a 6f 72 5f 73 74 72 20 3d 20 50 41 43 4b 41  ajor_str = PACKA
5f40: 47 45 5f 56 45 52 53 49 4f 4e 3b 0a 09 69 66 20  GE_VERSION;..if 
5f50: 28 6d 61 6a 6f 72 5f 73 74 72 29 20 7b 0a 09 20  (major_str) {.. 
5f60: 20 20 20 20 20 20 20 6d 61 6a 6f 72 20 3d 20 73         major = s
5f70: 74 72 74 6f 75 6c 28 6d 61 6a 6f 72 5f 73 74 72  trtoul(major_str
5f80: 2c 20 26 6d 69 6e 6f 72 5f 73 74 72 2c 20 31 30  , &minor_str, 10
5f90: 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f  );....if (minor_
5fa0: 73 74 72 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 20  str) {....minor 
5fb0: 3d 20 73 74 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f  = strtoul(minor_
5fc0: 73 74 72 20 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31  str + 1, NULL, 1
5fd0: 30 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  0);...}..}...ret
5fe0: 76 61 6c 20 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20  val = (major << 
5ff0: 31 36 29 20 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20  16) | (minor << 
6000: 38 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  8);.#endif...CAC
6010: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6020: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
6030: 78 22 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  x", retval);...r
6040: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
6050: 0a 0a 2f 2a 20 50 43 2f 53 43 20 52 65 6c 61 74  ../* PC/SC Relat
6060: 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ed Functions */.
6070: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6080: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
6090: 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
60a0: 63 74 5f 61 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a  ct_all(void);. *
60b0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
60c0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
60d0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
60e0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
60f0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
6100: 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63 6f 6e   function discon
6110: 6e 65 63 74 73 20 66 72 6f 6d 20 61 6c 6c 20 63  nects from all c
6120: 61 72 64 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61  ards.. *. */.sta
6130: 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
6140: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6150: 5f 61 6c 6c 28 76 6f 69 64 29 20 7b 0a 09 75 69  _all(void) {..ui
6160: 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
6170: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6180: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6190: 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
61a0: 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
61b0: 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
61c0: 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
61d0: 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
61e0: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
61f0: 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29  s[idx].internal)
6200: 20 7b 0a 09 09 09 2f 2a 20 53 6b 69 70 20 69 6e   {..../* Skip in
6210: 74 65 72 6e 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a  ternal slots */.
6220: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
6230: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6240: 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 63  lots[idx].pcsc_c
6250: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b  ard_connected) {
6260: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6270: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 44 69  _PRINTF("SCardDi
6280: 73 63 6f 6e 6e 65 63 74 28 25 6c 75 29 20 63 61  sconnect(%lu) ca
6290: 6c 6c 65 64 22 2c 20 28 75 6e 73 69 67 6e 65 64  lled", (unsigned
62a0: 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 0a 09 09   long) idx);....
62b0: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
62c0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
62d0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  x].pcsc_card, SC
62e0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
62f0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
6300: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
6310: 62 65 6c 29 20 7b 0a 09 09 09 66 72 65 65 28 63  bel) {....free(c
6320: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6330: 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 63 61 63  .label);.....cac
6340: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
6350: 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
6360: 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6370: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
6380: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
6390: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
63a0: 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  x].transaction_d
63b0: 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b  epth = 0;...cack
63c0: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
63d0: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
63e0: 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 09 69  w_lock = 0;....i
63f0: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
6400: 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
6410: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6420: 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67 20 61  RINTF("Marking a
6430: 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 20 61  ctive slot %lu a
6440: 73 20 62 65 69 6e 67 20 72 65 73 65 74 22 2c 20  s being reset", 
6450: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6460: 69 64 78 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  idx);...}....cac
6470: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
6480: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
6490: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
64a0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
64b0: 6e 67 22 29 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a  ng");...return;.
64c0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
64d0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
64e0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
64f0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20  connect(void);. 
6500: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
6510: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
6520: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
6530: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
6540: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
6550: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
6560: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
6570: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
6580: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
6590: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
65a0: 6f 6e 20 63 6f 6e 6e 65 63 74 73 20 74 6f 20 74  on connects to t
65b0: 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74  he PC/SC Connect
65c0: 69 6f 6e 20 4d 61 6e 61 67 65 72 20 61 6e 64 20  ion Manager and 
65d0: 75 70 64 61 74 65 73 20 74 68 65 0a 20 2a 20 20  updates the. *  
65e0: 20 20 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65     global handle
65f0: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
6600: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6610: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 76  y_pcsc_connect(v
6620: 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  oid) {..LONG sca
6630: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6640: 65 74 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  et;.#ifdef HAVE_
6650: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
6660: 45 58 54 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  EXT..LONG scard_
6670: 69 73 76 61 6c 69 64 5f 72 65 74 3b 0a 23 65 6e  isvalid_ret;.#en
6680: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
6690: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
66a0: 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  d.");...if (cack
66b0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
66c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b  = NULL) {...cack
66d0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
66e0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6700: 6c 65 29 29 3b 0a 09 09 69 66 20 28 63 61 63 6b  le));...if (cack
6710: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
6720: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 43 41 43  = NULL) {....CAC
6730: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6740: 28 22 43 61 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63  ("Call to malloc
6750: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
6760: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
6770: 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
6780: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6790: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
67a0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
67b0: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09  ENERIC);...}....
67c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
67d0: 4e 54 46 28 22 53 43 61 72 64 45 73 74 61 62 6c  NTF("SCardEstabl
67e0: 69 73 68 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  ishContext() cal
67f0: 6c 65 64 22 29 3b 0a 09 09 73 63 61 72 64 5f 65  led");...scard_e
6800: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 3d  st_context_ret =
6810: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6820: 6f 6e 74 65 78 74 28 53 43 41 52 44 5f 53 43 4f  ontext(SCARD_SCO
6830: 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c  PE_SYSTEM, NULL,
6840: 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79 5f 70 63   NULL, cackey_pc
6850: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 69 66  sc_handle);...if
6860: 20 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74   (scard_est_cont
6870: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
6880: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
6890: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
68a0: 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f 20 53 43  INTF("Call to SC
68b0: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
68c0: 65 78 74 20 66 61 69 6c 65 64 20 28 72 65 74 75  ext failed (retu
68d0: 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c 20 72 65  rned %s/%li), re
68e0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
68f0: 72 65 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  re", CACKEY_DEBU
6900: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
6910: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 65 73 74  TO_STR(scard_est
6920: 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 2c 20 28  _context_ret), (
6930: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65 73 74 5f  long) scard_est_
6940: 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b 0a 0a 09  context_ret);...
6950: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63  ..free(cackey_pc
6960: 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 09 09 63  sc_handle);....c
6970: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6980: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61  e = NULL;.....ca
6990: 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f  ckey_slots_disco
69a0: 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09  nnect_all();....
69b0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
69c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
69d0: 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 48  ..}..}..#ifdef H
69e0: 41 56 45 5f 53 43 41 52 44 49 53 56 41 4c 49 44  AVE_SCARDISVALID
69f0: 43 4f 4e 54 45 58 54 0a 09 43 41 43 4b 45 59 5f  CONTEXT..CACKEY_
6a00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6a10: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
6a20: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 73  t() called");..s
6a30: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
6a40: 20 3d 20 53 43 61 72 64 49 73 56 61 6c 69 64 43   = SCardIsValidC
6a50: 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f 70  ontext(*cackey_p
6a60: 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 69 66  csc_handle);..if
6a70: 20 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f   (scard_isvalid_
6a80: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6a90: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
6aa0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6ab0: 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 63 6f  "Handle has beco
6ac0: 6d 65 20 69 6e 76 61 6c 69 64 20 28 53 43 61 72  me invalid (SCar
6ad0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 20  dIsValidContext 
6ae0: 3d 20 25 73 2f 25 6c 69 29 2c 20 74 72 79 69 6e  = %s/%li), tryin
6af0: 67 20 74 6f 20 72 65 2d 65 73 74 61 62 6c 69 73  g to re-establis
6b00: 68 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  h...", CACKEY_DE
6b10: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
6b20: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 69  R_TO_STR(scard_i
6b30: 73 76 61 6c 69 64 5f 72 65 74 29 2c 20 28 6c 6f  svalid_ret), (lo
6b40: 6e 67 29 20 73 63 61 72 64 5f 69 73 76 61 6c 69  ng) scard_isvali
6b50: 64 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45  d_ret);....CACKE
6b60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6b70: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6b80: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6b90: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
6ba0: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
6bb0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6bc0: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
6bd0: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
6be0: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
6bf0: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
6c00: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6c10: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
6c20: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
6c30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6c40: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
6c50: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
6c60: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
6c70: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
6c80: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
6c90: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
6ca0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
6cb0: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
6cc0: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
6cd0: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
6ce0: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
6cf0: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6d00: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79  ndle);....cackey
6d10: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6d20: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ULL;.....cackey_
6d30: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6d40: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
6d50: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6d60: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a  _GENERIC);...}..
6d70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
6d80: 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20 68 61  RINTF("Handle ha
6d90: 73 20 62 65 65 6e 20 72 65 2d 65 73 74 61 62 6c  s been re-establ
6da0: 69 73 68 65 64 22 29 3b 0a 09 7d 0a 23 65 6e 64  ished");..}.#end
6db0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
6dc0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65 73 73  G_PRINTF("Sucess
6dd0: 66 75 6c 6c 79 20 63 6f 6e 6e 65 63 74 65 64 20  fully connected 
6de0: 74 6f 20 50 43 2f 53 43 2c 20 72 65 74 75 72 6e  to PC/SC, return
6df0: 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29  ing in success")
6e00: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
6e10: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
6e20: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
6e30: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
6e40: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  t cackey_pcsc_di
6e50: 73 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 3b 0a  sconnect(void);.
6e60: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
6e70: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
6e80: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
6e90: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
6ea0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
6eb0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
6ec0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
6ed0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
6ee0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
6ef0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
6f00: 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20  ion disconnects 
6f10: 66 72 6f 6d 20 74 68 65 20 50 43 2f 53 43 20 43  from the PC/SC C
6f20: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
6f30: 72 20 61 6e 64 20 75 70 64 61 74 65 73 0a 20 2a  r and updates. *
6f40: 20 20 20 20 20 74 68 65 20 67 6c 6f 62 61 6c 20       the global 
6f50: 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73  handle.. *. */.s
6f60: 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
6f70: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73   cackey_pcsc_dis
6f80: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
6f90: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 72 65 6c 5f  .LONG scard_rel_
6fa0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 0a 09 43  context_ret;...C
6fb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6fc0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6fd0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6fe0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6ff0: 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b   {...return(CACK
7000: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
7010: 7d 0a 0a 09 73 63 61 72 64 5f 72 65 6c 5f 63 6f  }...scard_rel_co
7020: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
7030: 64 52 65 6c 65 61 73 65 43 6f 6e 74 65 78 74 28  dReleaseContext(
7040: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
7050: 64 6c 65 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b  dle);...if (cack
7060: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 20  ey_pcsc_handle) 
7070: 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  {...free(cackey_
7080: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a  pcsc_handle);...
7090: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
70a0: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  ndle = NULL;..}.
70b0: 0a 09 69 66 20 28 73 63 61 72 64 5f 72 65 6c 5f  ..if (scard_rel_
70c0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
70d0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
70e0: 7b 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  {...return(CACKE
70f0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7100: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 43  );..}...return(C
7110: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
7120: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
7130: 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20  SIS. *     void 
7140: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
7150: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
7160: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7170: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
7180: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
7190: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
71a0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
71b0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
71c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
71d0: 72 6b 73 20 61 20 73 6c 6f 74 20 68 61 73 20 68  rks a slot has h
71e0: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74  aving been reset
71f0: 2c 20 74 6f 20 6c 61 74 65 72 20 62 65 20 63 6c  , to later be cl
7200: 65 61 6e 65 64 20 75 70 2e 0a 20 2a 20 20 20 20  eaned up.. *    
7210: 20 43 6c 65 61 6e 75 70 20 6f 6e 6c 79 20 68 61   Cleanup only ha
7220: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 50 4b 43  ppens when a PKC
7230: 53 23 31 31 20 63 6c 69 65 6e 74 20 63 61 6c 6c  S#11 client call
7240: 73 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  s C_FindObjectsI
7250: 6e 69 74 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  nit.. *. */.stat
7260: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d  ic void cackey_m
7270: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7290: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 69 66 20 28  t *slot) {..if (
72a0: 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  slot == NULL) {.
72b0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43  ..return;..}...C
72c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
72d0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
72e0: 09 69 66 20 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  .if (slot->pcsc_
72f0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20  card_connected) 
7300: 7b 0a 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e  {...SCardDisconn
7310: 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ect(slot->pcsc_c
7320: 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45  ard, SCARD_LEAVE
7330: 5f 43 41 52 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  _CARD);..}...slo
7340: 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  t->slot_reset = 
7350: 31 3b 0a 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1;..slot->pcsc_c
7360: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20  ard_connected = 
7370: 30 3b 0a 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  0;..slot->token_
7380: 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
7390: 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 43 41  N_REQUIRED;...CA
73a0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
73b0: 46 28 22 52 65 74 75 72 6e 69 6e 67 2e 22 29 3b  F("Returning.");
73c0: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
73d0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
73e0: 20 20 20 20 4c 4f 4e 47 20 63 61 63 6b 65 79 5f      LONG cackey_
73f0: 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
7400: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7410: 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20 64  t *slot, DWORD d
7420: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c  efault_protocol,
7430: 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74 65   LPDWORD selecte
7440: 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a  d_protocol);. *.
7450: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
7460: 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20      cackey_slot 
7470: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
7480: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
7490: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
74a0: 20 20 20 20 44 57 4f 52 44 20 64 65 66 61 75 6c      DWORD defaul
74b0: 74 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20  t_protocol. *   
74c0: 20 20 20 20 20 20 50 72 6f 74 6f 63 6f 6c 20 74        Protocol t
74d0: 6f 20 61 74 74 65 6d 70 74 20 66 69 72 73 74 0a  o attempt first.
74e0: 20 2a 0a 20 2a 20 20 20 20 20 4c 50 44 57 4f 52   *. *     LPDWOR
74f0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
7500: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  col. *         [
7510: 4f 55 54 5d 20 50 72 6f 74 6f 63 6f 6c 20 73 65  OUT] Protocol se
7520: 6c 65 63 74 65 64 0a 20 2a 0a 20 2a 20 52 45 54  lected. *. * RET
7530: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
7540: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
7550: 65 20 66 72 6f 6d 20 53 43 61 72 64 52 65 63 6f  e from SCardReco
7560: 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f  nnect(). *. * NO
7570: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
7580: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
7590: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 53 43 61  apper around SCa
75a0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a 20 2a  rdReconnect(). *
75b0: 0a 20 2a 20 20 20 20 20 54 68 65 20 53 43 61 72  . *     The SCar
75c0: 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 66 75 6e  dReconnect() fun
75d0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 6c 6c 20  ction call will 
75e0: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20  be called first 
75f0: 77 69 74 68 20 74 68 65 0a 20 2a 20 20 20 20 20  with the. *     
7600: 64 77 50 72 65 66 65 72 72 65 64 50 72 6f 74 6f  dwPreferredProto
7610: 63 6f 6c 73 20 6f 66 20 22 64 65 66 61 75 6c 74  cols of "default
7620: 5f 70 72 6f 74 6f 63 6f 6c 22 2e 20 20 49 66 20  _protocol".  If 
7630: 74 68 61 74 20 63 61 6c 6c 20 72 65 74 75 72 6e  that call return
7640: 73 0a 20 2a 20 20 20 20 20 53 43 41 52 44 5f 45  s. *     SCARD_E
7650: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 20  _PROTO_MISMATCH 
7660: 74 72 79 20 61 67 61 69 6e 20 77 69 74 68 20 61  try again with a
7670: 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 54 3d 30   protocol of T=0
7680: 2c 20 61 6e 64 20 66 61 69 6c 69 6e 67 0a 20 2a  , and failing. *
7690: 20 20 20 20 20 74 68 61 74 20 54 3d 31 2e 0a 20       that T=1.. 
76a0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 4c 4f 4e  *. */.static LON
76b0: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
76c0: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
76d0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
76e0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
76f0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
7700: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
7710: 63 6f 6c 29 20 7b 0a 09 4c 4f 4e 47 20 73 63 61  col) {..LONG sca
7720: 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73  rd_conn_ret;...s
7730: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7740: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73  SCardReconnect(s
7750: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
7760: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7770: 45 44 2c 20 64 65 66 61 75 6c 74 5f 70 72 6f 74  ED, default_prot
7780: 6f 63 6f 6c 2c 20 53 43 41 52 44 5f 52 45 53 45  ocol, SCARD_RESE
7790: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
77a0: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66  _protocol);...if
77b0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
77c0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
77d0: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
77e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
77f0: 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e  NTF("SCardReconn
7800: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
7810: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7820: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
7830: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
7840: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7850: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
7860: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7870: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7880: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7890: 43 4f 4c 5f 54 30 2c 20 53 43 41 52 44 5f 52 45  COL_T0, SCARD_RE
78a0: 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74  SET_CARD, select
78b0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  ed_protocol);...
78c0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
78d0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
78e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
78f0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 52 65  _PRINTF("SCardRe
7910: 63 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  connect() return
7920: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7930: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7940: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7950: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
7960: 72 65 74 20 3d 20 53 43 61 72 64 52 65 63 6f 6e  ret = SCardRecon
7970: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
7980: 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48 41 52  card, SCARD_SHAR
7990: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
79a0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 53 43 41  PROTOCOL_T1, SCA
79b0: 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20 73  RD_RESET_CARD, s
79c0: 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c  elected_protocol
79d0: 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75  );...}..}...retu
79e0: 72 6e 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  rn(scard_conn_re
79f0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  t);.}../*. * SYN
7a00: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
7a10: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
7a20: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7a30: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7a40: 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  slot);. *. * ARG
7a50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61  UMENTS. *     ca
7a60: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a  ckey_slot *slot.
7a70: 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20   *         Slot 
7a80: 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73  to send commands
7a90: 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e   to. *. * RETURN
7aa0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
7ab0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
7ac0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
7ad0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
7ae0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
7af0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
7b00: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
7b10: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
7b20: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
7b30: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
7b40: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
7b50: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63  ot *slot) {..cac
7b60: 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e  key_ret pcsc_con
7b70: 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44  nect_ret;..DWORD
7b80: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47   protocol;..LONG
7b90: 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b   scard_conn_ret;
7ba0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7bb0: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
7bc0: 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20  );...if (!slot) 
7bd0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7be0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
7bf0: 20 73 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2c   slot specified,
7c00: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
7c10: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
7c20: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
7c30: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
7c40: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7c50: 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63   = cackey_pcsc_c
7c60: 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70  onnect();..if (p
7c70: 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
7c80: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
7c90: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
7ca0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f  DEBUG_PRINTF("Co
7cb0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
7cc0: 43 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  C failed, return
7cd0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
7ce0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
7cf0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
7d00: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e  C);..}.../* Conn
7d10: 65 63 74 20 74 6f 20 72 65 61 64 65 72 2c 20 69  ect to reader, i
7d20: 66 20 6e 65 65 64 65 64 20 2a 2f 0a 09 69 66 20  f needed */..if 
7d30: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
7d40: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
7d50: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7d60: 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65  INTF("SCardConne
7d70: 63 74 28 25 73 29 20 63 61 6c 6c 65 64 22 2c 20  ct(%s) called", 
7d80: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
7d90: 72 29 3b 0a 09 09 73 63 61 72 64 5f 63 6f 6e 6e  r);...scard_conn
7da0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7db0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7dc0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7dd0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7de0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7df0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7e00: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
7e10: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
7e20: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
7e30: 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
7e40: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  d_conn_ret == SC
7e50: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
7e60: 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b 45  ATCH) {....CACKE
7e70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7e80: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7e90: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7ea0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7eb0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7ec0: 20 54 3d 30 22 29 0a 09 09 09 73 63 61 72 64 5f   T=0")....scard_
7ed0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
7ee0: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
7ef0: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
7f00: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
7f10: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
7f20: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
7f30: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
7f40: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
7f50: 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61  ol);.....if (sca
7f60: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7f70: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7f80: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43  MATCH) {.....CAC
7f90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7fa0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
7fb0: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
7fc0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7fd0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
7fe0: 73 74 20 54 3d 31 22 29 0a 09 09 09 09 73 63 61  st T=1").....sca
7ff0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
8000: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
8010: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
8020: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8030: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
8040: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
8050: 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d  TOCOL_T1, &slot-
8060: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8070: 74 6f 63 6f 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d  tocol);....}...}
8080: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8090: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
80a0: 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41 52 44  W_UNPOWERED_CARD
80b0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
80c0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
80d0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
80e0: 6e 65 64 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f  ned SCARD_W_UNPO
80f0: 57 45 52 45 44 5f 43 41 52 44 2c 20 74 72 79 69  WERED_CARD, tryi
8100: 6e 67 20 74 6f 20 72 65 2d 63 6f 6e 6e 65 63 74  ng to re-connect
8110: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
8120: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8130: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8140: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8150: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8160: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 44 49 52   SCARD_SHARE_DIR
8170: 45 43 54 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  ECT, SCARD_PROTO
8180: 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
8190: 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f  ROTOCOL_T1, &slo
81a0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70  t->pcsc_card, &p
81b0: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66  rotocol);.....if
81c0: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
81d0: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
81e0: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
81f0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8200: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
8210: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
8220: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8230: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
8240: 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09 09  th just T=0")...
8250: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8260: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
8270: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
8280: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
8290: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
82a0: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
82b0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26  D_PROTOCOL_T0, &
82c0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
82d0: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
82e0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
82f0: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
8300: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
8310: 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
8320: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
8330: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
8340: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
8350: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
8360: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31  ng with just T=1
8370: 22 29 0a 09 09 09 09 09 73 63 61 72 64 5f 63 6f  ")......scard_co
8380: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
8390: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
83a0: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
83b0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
83c0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
83d0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
83e0: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
83f0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
8400: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
8410: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
8420: 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e   = cackey_reconn
8430: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 70  ect_card(slot, p
8440: 72 6f 74 6f 63 6f 6c 2c 20 26 70 72 6f 74 6f 63  rotocol, &protoc
8450: 6f 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ol);...}....if (
8460: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 21  scard_conn_ret !
8470: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
8480: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
8490: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e  EBUG_PRINTF("Con
84a0: 6e 65 63 74 69 6f 6e 20 74 6f 20 63 61 72 64 20  nection to card 
84b0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
84c0: 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28 53 43  g in failure (SC
84d0: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 3d 20 25  ardConnect() = %
84e0: 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f  s/%li)", CACKEY_
84f0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
8500: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
8510: 5f 63 6f 6e 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e  _conn_ret), (lon
8520: 67 29 20 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  g) scard_conn_re
8530: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  t);.....return(C
8540: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8550: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c  ERIC);...}....sl
8560: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8570: 6e 6e 65 63 74 65 64 20 3d 20 31 3b 0a 09 09 73  nnected = 1;...s
8580: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8590: 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 73 6c  _depth = 0;...sl
85a0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
85b0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
85c0: 3b 0a 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ;...slot->protoc
85d0: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
85e0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
85f0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
8600: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 22 29 3b  ng in success");
8610: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8620: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
8630: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
8640: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
8650: 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
8660: 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74  ansaction(struct
8670: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8680: 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ot);. *. * ARGUM
8690: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
86a0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
86b0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
86c0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
86d0: 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  o. *. * RETURN V
86e0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
86f0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
8700: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
8710: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
8720: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
8730: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
8740: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 65 20  OTES. *     The 
8750: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 68 6f 75  transaction shou
8760: 6c 64 20 62 65 20 74 65 72 6d 69 6e 61 74 65 64  ld be terminated
8770: 20 75 73 69 6e 67 20 22 63 61 63 6b 65 79 5f 65   using "cackey_e
8780: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 0a  nd_transaction".
8790: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
87a0: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
87b0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
87c0: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
87d0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63  slot *slot) {..c
87e0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
87f0: 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47  _conn_ret;..LONG
8800: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
8810: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8820: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8830: 22 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 63 6f 6e  ");...cackey_con
8840: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  n_ret = cackey_c
8850: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
8860: 29 3b 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 63  );..if (cackey_c
8870: 6f 6e 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  onn_ret != CACKE
8880: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
8890: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
88a0: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
88b0: 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
88c0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
88d0: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
88e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
88f0: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c  ENERIC);..}...sl
8900: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8910: 64 65 70 74 68 2b 2b 3b 0a 0a 09 69 66 20 28 73  depth++;...if (s
8920: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8930: 5f 64 65 70 74 68 20 3e 20 31 20 26 26 20 21 73  _depth > 1 && !s
8940: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8950: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b  _need_hw_lock) {
8960: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8970: 50 52 49 4e 54 46 28 22 41 6c 72 65 61 64 79 20  PRINTF("Already 
8980: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
8990: 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 6e 6f 20  , performing no 
89a0: 61 63 74 69 6f 6e 20 28 6e 65 77 20 64 65 70 74  action (new dept
89b0: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
89c0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
89d0: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
89e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
89f0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8a00: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
8a10: 6c 6f 63 6b 20 3d 20 30 3b 0a 0a 09 73 63 61 72  lock = 0;...scar
8a20: 64 5f 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43  d_trans_ret = SC
8a30: 61 72 64 42 65 67 69 6e 54 72 61 6e 73 61 63 74  ardBeginTransact
8a40: 69 6f 6e 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  ion(slot->pcsc_c
8a50: 61 72 64 29 3b 0a 09 69 66 20 28 73 63 61 72 64  ard);..if (scard
8a60: 5f 74 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43  _trans_ret != SC
8a70: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
8a80: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8a90: 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
8aa0: 6f 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  o begin transact
8ab0: 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ion, returning i
8ac0: 6e 20 65 72 72 6f 72 22 29 3b 0a 0a 09 09 72 65  n error");....re
8ad0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8ae0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
8af0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
8b00: 52 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c  RINTF("Sucessful
8b10: 6c 79 20 62 65 67 61 6e 20 74 72 61 6e 73 61 63  ly began transac
8b20: 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73  tion on slot (%s
8b30: 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  )", slot->pcsc_r
8b40: 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e  eader);...return
8b50: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
8b60: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
8b70: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63  POSIS. *     cac
8b80: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65  key_ret cackey_e
8b90: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8ba0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8bb0: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
8bc0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
8bd0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
8be0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
8bf0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
8c00: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 52 45 54  nds to. *. * RET
8c10: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
8c20: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
8c30: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
8c40: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
8c50: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8c60: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
8c70: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
8c80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8c90: 65 71 75 69 72 65 73 20 22 63 61 63 6b 65 79 5f  equires "cackey_
8ca0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8cb0: 6e 22 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  n" to be called 
8cc0: 66 69 72 73 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61  first. *. */.sta
8cd0: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
8ce0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
8cf0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
8d00: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20  key_slot *slot) 
8d10: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 74 72  {..LONG scard_tr
8d20: 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ans_ret;...CACKE
8d30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8d40: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
8d50: 28 21 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  (!slot->pcsc_car
8d60: 64 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09  d_connected) {..
8d70: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8d80: 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 6e 6f  INTF("Card is no
8d90: 74 20 63 6f 6e 6e 65 63 74 65 64 2c 20 75 6e 61  t connected, una
8da0: 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61 6e 73  ble to end trans
8db0: 61 63 74 69 6f 6e 20 6f 6e 20 63 61 72 64 22 29  action on card")
8dc0: 3b 0a 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  ;....if (slot->t
8dd0: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8de0: 20 3e 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45   > 0) {....CACKE
8df0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8e00: 44 65 63 72 65 61 73 69 6e 67 20 74 72 61 6e 73  Decreasing trans
8e10: 61 63 74 69 6f 6e 20 64 65 70 74 68 20 61 6e 64  action depth and
8e20: 20 61 73 6b 69 6e 67 20 66 6f 72 20 61 20 68 61   asking for a ha
8e30: 72 64 77 61 72 65 20 6c 6f 63 6b 20 6f 6e 20 74  rdware lock on t
8e40: 68 65 20 6e 65 78 74 20 62 65 67 69 6e 20 74 72  he next begin tr
8e50: 61 6e 73 61 63 74 69 6f 6e 20 28 63 75 72 72 65  ansaction (curre
8e60: 6e 74 20 64 65 70 74 68 20 3d 20 25 69 29 22 2c  nt depth = %i)",
8e70: 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69   slot->transacti
8e80: 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09 09 73  on_depth);.....s
8e90: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8ea0: 5f 64 65 70 74 68 2d 2d 3b 0a 0a 09 09 09 69 66  _depth--;.....if
8eb0: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8ec0: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
8ed0: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
8ee0: 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
8ef0: 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 7d 0a 09 09  ock = 1;....}...
8f00: 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
8f10: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
8f20: 43 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  C);..}...if (slo
8f30: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8f40: 65 70 74 68 20 3d 3d 20 30 29 20 7b 0a 09 09 43  epth == 0) {...C
8f50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8f60: 54 46 28 22 54 65 72 6d 69 6e 61 74 69 6e 67 20  TF("Terminating 
8f70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
8f80: 61 74 20 68 61 73 20 6e 6f 74 20 62 65 67 75 6e  at has not begun
8f90: 21 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  !");....return(C
8fa0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8fb0: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ERIC);..}...slot
8fc0: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8fd0: 70 74 68 2d 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f  pth--;...if (slo
8fe0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8ff0: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 43 41  epth > 0) {...CA
9000: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9010: 46 28 22 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  F("Transactions 
9020: 73 74 69 6c 6c 20 69 6e 20 70 72 6f 67 72 65 73  still in progres
9030: 73 2c 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 69  s, not terminati
9040: 6e 67 20 6f 6e 2d 63 61 72 64 20 54 72 61 6e 73  ng on-card Trans
9050: 61 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20  action (current 
9060: 64 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c  depth = %i)", sl
9070: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
9080: 64 65 70 74 68 29 3b 0a 0a 09 09 72 65 74 75 72  depth);....retur
9090: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
90a0: 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72 64 5f  OK);..}...scard_
90b0: 74 72 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72  trans_ret = SCar
90c0: 64 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  dEndTransaction(
90d0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
90e0: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
90f0: 44 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74  D);..if (scard_t
9100: 72 61 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52  rans_ret != SCAR
9110: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
9120: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9130: 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
9140: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  end transaction,
9150: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
9160: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
9170: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9180: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
9190: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
91a0: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 74  F("Sucessfully t
91b0: 65 72 6d 69 6e 61 74 65 64 20 74 72 61 6e 73 61  erminated transa
91c0: 63 74 69 6f 6e 20 6f 6e 20 73 6c 6f 74 20 28 25  ction on slot (%
91d0: 73 29 22 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  s)", slot->pcsc_
91e0: 72 65 61 64 65 72 29 3b 0a 0a 09 72 65 74 75 72  reader);...retur
91f0: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  n(CACKEY_PCSC_S_
9200: 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20  OK);.}../* APDU 
9210: 52 65 6c 61 74 65 64 20 46 75 6e 63 74 69 6f 6e  Related Function
9220: 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  s */./*. * SYNPO
9230: 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  SIS. *     cacke
9240: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6e  y_ret cackey_sen
9250: 64 5f 61 70 64 75 28 73 74 72 75 63 74 20 63 61  d_apdu(struct ca
9260: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
9270: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
9280: 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65 64 20 63  lass, unsigned c
9290: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c  har instruction,
92a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70   unsigned char p
92b0: 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  1, unsigned char
92c0: 20 70 32 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   p2, unsigned ch
92d0: 61 72 20 6c 63 2c 20 75 6e 73 69 67 6e 65 64 20  ar lc, unsigned 
92e0: 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e 73 69  char *data, unsi
92f0: 67 6e 65 64 20 63 68 61 72 20 6c 65 2c 20 75 69  gned char le, ui
9300: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
9310: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
9320: 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65 5f  *respdata, size_
9330: 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  t *respdata_len)
9340: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
9350: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
9360: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
9370: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
9380: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
9390: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
93a0: 64 20 63 68 61 72 20 63 6c 61 73 73 0a 20 2a 20  d char class. * 
93b0: 20 20 20 20 20 20 20 20 41 50 44 55 20 43 6c 61          APDU Cla
93c0: 73 73 20 28 47 53 43 49 53 5f 43 4c 41 53 53 5f  ss (GSCIS_CLASS_
93d0: 49 53 4f 37 38 31 36 20 6f 72 20 47 53 43 49 53  ISO7816 or GSCIS
93e0: 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
93f0: 41 54 46 4f 52 4d 0a 20 2a 20 20 20 20 20 20 20  ATFORM. *       
9400: 20 20 75 73 75 61 6c 6c 79 29 2c 20 28 43 4c 41    usually), (CLA
9410: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
9420: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9430: 63 74 69 6f 6e 0a 20 2a 20 20 20 20 20 20 20 20  ction. *        
9440: 20 41 50 44 55 20 49 6e 73 74 72 75 63 74 69 6f   APDU Instructio
9450: 6e 20 28 49 4e 53 29 0a 20 2a 0a 20 2a 20 20 20  n (INS). *. *   
9460: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9470: 70 31 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  p1. *         AP
9480: 44 55 20 50 61 72 61 6d 65 74 65 72 20 31 20 28  DU Parameter 1 (
9490: 50 31 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  P1). *. *     un
94a0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 0a 20  signed char p2. 
94b0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
94c0: 61 72 61 6d 65 74 65 72 20 32 20 28 50 32 29 0a  arameter 2 (P2).
94d0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
94e0: 65 64 20 63 68 61 72 20 6c 63 0a 20 2a 20 20 20  ed char lc. *   
94f0: 20 20 20 20 20 20 41 50 44 55 20 4c 65 6e 67 74        APDU Lengt
9500: 68 20 6f 66 20 43 6f 6e 74 65 6e 74 20 28 4c 63  h of Content (Lc
9510: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
9520: 20 6c 65 6e 67 74 68 20 6f 66 20 22 64 61 74 61   length of "data
9530: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 70 61 72  ". *         par
9540: 61 6d 65 74 65 72 2e 20 20 49 66 20 22 64 61 74  ameter.  If "dat
9550: 61 22 20 69 73 20 73 70 65 63 69 66 69 65 64 20  a" is specified 
9560: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 70 61  as NULL, this pa
9570: 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 20 2a 20  rameter will. * 
9580: 20 20 20 20 20 20 20 20 62 65 20 69 67 6e 6f 72          be ignor
9590: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ed.. *. *     un
95a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
95b0: 61 0a 20 2a 20 20 20 20 20 20 20 20 20 50 6f 69  a. *         Poi
95c0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 74  nter to buffer t
95d0: 6f 20 73 65 6e 64 2e 20 20 49 74 20 73 68 6f 75  o send.  It shou
95e0: 6c 64 20 62 65 20 22 4c 63 22 20 62 79 74 65 73  ld be "Lc" bytes
95f0: 20 6c 6f 6e 67 2e 20 20 49 66 0a 20 2a 20 20 20   long.  If. *   
9600: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 22 4c 63 22 20 77 69  as NULL, "Lc" wi
9620: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 6e 74 2c 20  ll not be sent, 
9630: 61 6e 64 20 74 68 69 73 20 62 75 66 66 65 72 20  and this buffer 
9640: 77 69 6c 6c 20 62 65 0a 20 2a 20 20 20 20 20 20  will be. *      
9650: 20 20 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20     ignored.. *. 
9660: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9670: 68 61 72 20 6c 65 0a 20 2a 20 20 20 20 20 20 20  har le. *       
9680: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
9690: 20 45 78 70 65 63 74 61 74 69 6f 6e 20 28 4c 65   Expectation (Le
96a0: 29 20 2d 2d 20 74 68 69 73 20 69 73 20 74 68 65  ) -- this is the
96b0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 20   length of the. 
96c0: 2a 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74  *         expect
96d0: 65 64 20 72 65 70 6c 79 2e 20 20 49 66 20 74 68  ed reply.  If th
96e0: 69 73 20 69 73 20 73 70 65 63 69 66 69 65 64 20  is is specified 
96f0: 61 73 20 30 20 74 68 65 6e 20 69 74 20 77 69 6c  as 0 then it wil
9700: 6c 20 6e 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  l not. *        
9710: 20 62 65 20 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20   be sent.. *. * 
9720: 20 20 20 20 75 69 6e 74 31 36 5f 74 20 2a 72 65      uint16_t *re
9730: 73 70 63 6f 64 65 0a 20 2a 20 20 20 20 20 20 20  spcode. *       
9740: 20 20 5b 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20    [OUT] Pointer 
9750: 74 6f 20 73 74 6f 72 61 67 65 20 6f 66 20 41 50  to storage of AP
9760: 44 55 20 72 65 73 70 6f 6e 73 65 20 63 6f 64 65  DU response code
9770: 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a 20 2a  .  If this is. *
9780: 20 20 20 20 20 20 20 20 20 73 70 65 63 69 66 69           specifi
9790: 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 65 20  ed as NULL, the 
97a0: 72 65 73 70 6f 6e 73 65 20 63 6f 64 65 20 77 69  response code wi
97b0: 6c 6c 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  ll be discarded.
97c0: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
97d0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
97e0: 74 61 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  ta. *         [O
97f0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
9800: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
9810: 65 73 70 6f 6e 73 65 20 64 61 74 61 2e 20 20 49  esponse data.  I
9820: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
9830: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
9840: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9850: 6f 6e 73 65 20 64 61 74 61 20 77 69 6c 6c 20 62  onse data will b
9860: 65 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66  e discarded.  If
9870: 0a 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  . *         the 
9880: 22 72 65 73 70 64 61 74 61 5f 6c 65 6e 22 20 70  "respdata_len" p
9890: 61 72 61 6d 65 74 65 72 20 69 73 20 73 70 65 63  arameter is spec
98a0: 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 74  ified as NULL, t
98b0: 68 69 73 20 62 75 66 66 65 72 0a 20 2a 20 20 20  his buffer. *   
98c0: 20 20 20 20 20 20 77 69 6c 6c 20 6e 6f 74 20 62        will not b
98d0: 65 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a  e updated.. *. *
98e0: 20 20 20 20 20 73 69 7a 65 5f 74 20 2a 72 65 73       size_t *res
98f0: 70 64 61 74 61 5f 6c 65 6e 0a 20 2a 20 20 20 20  pdata_len. *    
9900: 20 20 20 20 20 5b 49 4e 2c 20 4f 55 54 5d 20 50       [IN, OUT] P
9910: 6f 69 6e 74 65 72 20 69 6e 69 74 69 61 6c 69 6e  ointer initialin
9920: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
9930: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 22 72 65   size of the "re
9940: 73 70 64 61 74 61 22 0a 20 2a 20 20 20 20 20 20  spdata". *      
9950: 20 20 20 62 75 66 66 65 72 2e 20 20 42 65 66 6f     buffer.  Befo
9960: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68  re returning, th
9970: 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 76 61 6c  e pointed to val
9980: 75 65 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ue is updated to
9990: 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20   the. *         
99a0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
99b0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62  written to the b
99c0: 75 66 66 65 72 2e 20 20 49 66 20 74 68 69 73 20  uffer.  If this 
99d0: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 0a  is specified as.
99e0: 20 2a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c   *         NULL,
99f0: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
9a00: 75 70 64 61 74 65 64 2c 20 61 6e 64 20 22 72 65  updated, and "re
9a10: 73 70 64 61 74 61 22 20 77 69 6c 6c 20 62 65 20  spdata" will be 
9a20: 69 67 6e 6f 72 65 64 20 63 61 75 73 69 6e 67 0a  ignored causing.
9a30: 20 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72   *         the r
9a40: 65 73 70 6f 6e 73 65 20 64 61 74 61 20 74 6f 20  esponse data to 
9a50: 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a  be discarded.. *
9a60: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
9a70: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
9a80: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
9a90: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
9aa0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
9ab0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
9ac0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 20 20 20 20 20  On error. *     
9ad0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
9ae0: 4b 45 4e 41 42 53 45 4e 54 20 20 49 66 20 74 68  KENABSENT  If th
9af0: 65 20 73 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  e sending failed
9b00: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 6f 6b   because the tok
9b10: 65 6e 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  en is. *        
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 61 62 73 65 6e 74 0a 20          absent. 
9b40: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
9b50: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
9b60: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9b70: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
9b80: 74 69 6f 6e 20 4d 61 6e 61 67 65 72 20 76 69 61  tion Manager via
9b90: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 70  . *     cackey_p
9ba0: 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 20 69 66  csc_connect() if
9bb0: 20 6e 65 65 64 65 64 2e 0a 20 2a 0a 20 2a 20 20   needed.. *. *  
9bc0: 20 20 20 49 74 20 77 69 6c 6c 20 63 6f 6e 6e 65     It will conne
9bd0: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9be0: 6e 20 74 68 65 20 72 65 61 64 65 72 20 61 74 74  n the reader att
9bf0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 73 6c 6f  ached to the slo
9c00: 74 0a 20 2a 20 20 20 20 20 73 70 65 63 69 66 69  t. *     specifi
9c10: 65 64 2e 20 20 49 74 20 77 69 6c 6c 20 72 65 63  ed.  It will rec
9c20: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 63 61  onnect to the ca
9c30: 72 64 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  rd if the connec
9c40: 74 69 6f 6e 0a 20 2a 20 20 20 20 20 67 6f 65 73  tion. *     goes
9c50: 20 61 77 61 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74   away.. *. */.st
9c60: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
9c70: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
9c80: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
9c90: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
9ca0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
9cb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9cc0: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9cd0: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9ce0: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9cf0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 63 2c 20  nsigned int lc, 
9d00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
9d10: 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  ata, unsigned in
9d20: 74 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20 2a  t le, uint16_t *
9d30: 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67 6e  respcode, unsign
9d40: 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61 74  ed char *respdat
9d50: 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64  a, size_t *respd
9d60: 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 75 69 6e 74  ata_len) {..uint
9d70: 38 5f 74 20 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69  8_t major_rc, mi
9d80: 6e 6f 72 5f 72 63 3b 0a 09 73 69 7a 65 5f 74 20  nor_rc;..size_t 
9d90: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 74  bytes_to_copy, t
9da0: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  mp_respdata_len;
9db0: 0a 09 4c 50 43 53 43 41 52 44 5f 49 4f 5f 52 45  ..LPCSCARD_IO_RE
9dc0: 51 55 45 53 54 20 70 69 6f 53 65 6e 64 50 63 69  QUEST pioSendPci
9dd0: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
9de0: 6c 3b 0a 09 44 57 4f 52 44 20 78 6d 69 74 5f 6c  l;..DWORD xmit_l
9df0: 65 6e 2c 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c  en, recv_len;..L
9e00: 4f 4e 47 20 73 63 61 72 64 5f 78 6d 69 74 5f 72  ONG scard_xmit_r
9e10: 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e  et, scard_reconn
9e20: 5f 72 65 74 3b 0a 09 42 59 54 45 20 78 6d 69 74  _ret;..BYTE xmit
9e30: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 72 65 63 76  _buf[1024], recv
9e40: 5f 62 75 66 5b 31 30 32 34 5d 3b 0a 09 69 6e 74  _buf[1024];..int
9e50: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
9e60: 74 2c 20 70 63 73 63 5f 67 65 74 72 65 73 70 5f  t, pcsc_getresp_
9e70: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
9e80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
9e90: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
9ea0: 0a 0a 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a  ...if (!slot) {.
9eb0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9ec0: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73  RINTF("Invalid s
9ed0: 6c 6f 74 20 73 70 65 63 69 66 69 65 64 2e 22 29  lot specified.")
9ee0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
9ef0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9f00: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
9f10: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
9f20: 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  ey_connect_card(
9f30: 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63  slot);..if (pcsc
9f40: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20  _connect_ret != 
9f50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
9f60: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
9f70: 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
9f80: 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
9f90: 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
9fa0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
9fb0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9fc0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9fd0: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
9fe0: 65 20 77 68 69 63 68 20 70 72 6f 74 6f 63 6f 6c  e which protocol
9ff0: 20 74 6f 20 73 65 6e 64 20 75 73 69 6e 67 20 2a   to send using *
a000: 2f 0a 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  /..switch (slot-
a010: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 63  >protocol) {...c
a020: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
a030: 4f 4c 5f 54 30 3a 0a 09 09 09 43 41 43 4b 45 59  OL_T0:....CACKEY
a040: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
a050: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
a060: 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 30 22  datagram is T=0"
a070: 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  );.....pioSendPc
a080: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30  i = SCARD_PCI_T0
a090: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  ;.....break;...c
a0a0: 61 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ase SCARD_PROTOC
a0b0: 4f 4c 5f 54 31 3a 0a 09 09 09 43 41 43 4b 45 59  OL_T1:....CACKEY
a0c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
a0d0: 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e 64 20  rotocol to send 
a0e0: 64 61 74 61 67 72 61 6d 20 69 73 20 54 3d 31 22  datagram is T=1"
a0f0: 29 3b 0a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  );.....pioSendPc
a100: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31  i = SCARD_PCI_T1
a110: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  ;.....break;...d
a120: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
a130: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
a140: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
a150: 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67   found, aborting
a160: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
a170: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
a180: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
a190: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69  Transmit */..xmi
a1a0: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74  t_len = 0;..xmit
a1b0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a1c0: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f   = class;..xmit_
a1d0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a1e0: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09  = instruction;..
a1f0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a200: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74  n++] = p1;..xmit
a210: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a220: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61   = p2;..if (data
a230: 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32  ) {...if (lc > 2
a240: 35 35 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  55) {....CACKEY_
a250: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41  DEBUG_PRINTF("CA
a260: 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e  UTION!  Using an
a270: 20 4c 63 20 67 72 65 61 74 65 72 20 74 68 61 6e   Lc greater than
a280: 20 32 35 35 20 69 73 20 75 6e 74 65 73 74 65 64   255 is untested
a290: 2e 20 20 4c 63 20 3d 20 25 75 22 2c 20 6c 63 29  .  Lc = %u", lc)
a2a0: 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78  ;.....xmit_buf[x
a2b0: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38  mit_len++] = 0x8
a2c0: 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54  2; /* XXX UNTEST
a2d0: 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75  ED */....xmit_bu
a2e0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a2f0: 28 6c 63 20 26 20 30 78 66 66 30 30 29 20 3e 3e  (lc & 0xff00) >>
a300: 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   8;....xmit_buf[
a310: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
a320: 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73   & 0xff;...} els
a330: 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  e {....xmit_buf[
a340: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63  xmit_len++] = lc
a350: 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 64 78  ;...}...for (idx
a360: 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c 63 3b 20   = 0; idx < lc; 
a370: 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78 6d 69 74  idx++) {....xmit
a380: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a390: 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b 0a 09 09   = data[idx];...
a3a0: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65 20 21 3d  }..}...if (le !=
a3b0: 20 30 78 30 30 29 20 7b 0a 09 09 69 66 20 28 6c   0x00) {...if (l
a3c0: 65 20 3e 20 32 35 36 29 20 7b 0a 09 09 09 43 41  e > 256) {....CA
a3d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a3e0: 46 28 22 43 41 55 54 49 4f 4e 21 20 20 55 73 69  F("CAUTION!  Usi
a3f0: 6e 67 20 61 6e 20 4c 65 20 67 72 65 61 74 65 72  ng an Le greater
a400: 20 74 68 61 6e 20 32 35 36 20 69 73 20 75 6e 74   than 256 is unt
a410: 65 73 74 65 64 2e 20 20 4c 65 20 3d 20 25 75 22  ested.  Le = %u"
a420: 2c 20 6c 65 29 3b 0a 0a 09 09 09 78 6d 69 74 5f  , le);.....xmit_
a430: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a440: 3d 20 30 78 38 32 3b 20 2f 2a 20 58 58 58 20 55  = 0x82; /* XXX U
a450: 4e 54 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d  NTESTED */....xm
a460: 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b  it_buf[xmit_len+
a470: 2b 5d 20 3d 20 28 6c 65 20 26 20 30 78 66 66 30  +] = (le & 0xff0
a480: 30 29 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74  0) >> 8;....xmit
a490: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a4a0: 20 3d 20 6c 65 20 26 20 30 78 66 66 3b 0a 09 09   = le & 0xff;...
a4b0: 7d 20 65 6c 73 65 20 69 66 20 28 6c 65 20 3d 3d  } else if (le ==
a4c0: 20 32 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f   256) {....xmit_
a4d0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
a4e0: 3d 20 30 78 30 30 3b 0a 09 09 7d 20 65 6c 73 65  = 0x00;...} else
a4f0: 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78   {....xmit_buf[x
a500: 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b  mit_len++] = le;
a510: 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ...}..}.../* Beg
a520: 69 6e 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  in Smartcard Tra
a530: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
a540: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
a550: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69  ction(slot);...i
a560: 66 20 28 63 6c 61 73 73 20 3d 3d 20 47 53 43 49  f (class == GSCI
a570: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 20  S_CLASS_ISO7816 
a580: 26 26 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 3d  && instruction =
a590: 3d 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45  = GSCIS_INSTR_VE
a5a0: 52 49 46 59 20 26 26 20 70 31 20 3d 3d 20 30 78  RIFY && p1 == 0x
a5b0: 30 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  00) {...CACKEY_D
a5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6e  EBUG_PRINTF("Sen
a5d0: 64 69 6e 67 20 41 50 44 55 3a 20 3c 3c 63 65 6e  ding APDU: <<cen
a5e0: 73 6f 72 65 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c  sored>>");..} el
a5f0: 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  se {...CACKEY_DE
a600: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
a610: 6e 64 69 6e 67 20 41 50 44 55 3a 22 2c 20 78 6d  nding APDU:", xm
a620: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a630: 29 3b 0a 09 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e  );..}...recv_len
a640: 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62   = sizeof(recv_b
a650: 75 66 29 3b 0a 09 73 63 61 72 64 5f 78 6d 69 74  uf);..scard_xmit
a660: 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e  _ret = SCardTran
a670: 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  smit(slot->pcsc_
a680: 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69  card, pioSendPci
a690: 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74  , xmit_buf, xmit
a6a0: 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76  _len, NULL, recv
a6b0: 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29  _buf, &recv_len)
a6c0: 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ;...if (scard_xm
a6d0: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
a6e0: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
a6f0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
a700: 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
a710: 64 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74  d to send APDU t
a720: 6f 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  o card (SCardTra
a730: 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78  nsmit() = %s/%lx
a740: 29 2c 20 77 69 6c 6c 20 61 73 6b 20 63 61 6c 6c  ), will ask call
a750: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ing function to 
a760: 72 65 74 72 79 20 28 6e 6f 74 20 72 65 73 65 74  retry (not reset
a770: 74 69 6e 67 20 63 61 72 64 29 2e 2e 2e 22 2c 20  ting card)...", 
a780: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
a790: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
a7a0: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
a7b0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
a7c0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a7d0: 74 29 3b 0a 0a 09 09 2f 2a 20 42 65 67 69 6e 20  t);..../* Begin 
a7e0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
a7f0: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
a800: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
a810: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
a820: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
a830: 5f 52 45 54 52 59 29 3b 0a 09 7d 0a 0a 09 69 66  _RETRY);..}...if
a840: 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74   (scard_xmit_ret
a850: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
a860: 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ESS) {...CACKEY_
a870: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
a880: 69 6c 65 64 20 74 6f 20 73 65 6e 64 20 41 50 44  iled to send APD
a890: 55 20 74 6f 20 63 61 72 64 20 28 53 43 61 72 64  U to card (SCard
a8a0: 54 72 61 6e 73 6d 69 74 28 29 20 3d 20 25 73 2f  Transmit() = %s/
a8b0: 25 6c 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45  %lx)", CACKEY_DE
a8c0: 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
a8d0: 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78  R_TO_STR(scard_x
a8e0: 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67  mit_ret), (unsig
a8f0: 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ned long) scard_
a900: 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 43 41  xmit_ret);....CA
a910: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a920: 46 28 22 4d 61 72 6b 69 6e 67 20 73 6c 6f 74 20  F("Marking slot 
a930: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 72  as having been r
a940: 65 73 65 74 22 29 3b 0a 09 09 63 61 63 6b 65 79  eset");...cackey
a950: 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
a960: 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
a970: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d  card_xmit_ret ==
a980: 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
a990: 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ARD) {....CACKEY
a9a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
a9b0: 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70  eset required, p
a9c0: 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b  lease hold...");
a9d0: 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e  .....scard_recon
a9e0: 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
a9f0: 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
aa00: 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ot, SCARD_PROTOC
aa10: 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
aa20: 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74  OTOCOL_T1, &prot
aa30: 6f 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73  ocol);.....if (s
aa40: 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
aa50: 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
aa60: 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64  SS) {...../* Upd
aa70: 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ate protocol */.
aa80: 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ....slot->protoc
aa90: 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  ol = protocol;..
aaa0: 09 09 09 73 77 69 74 63 68 20 28 73 6c 6f 74 2d  ...switch (slot-
aab0: 3e 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09 09 09  >protocol) {....
aac0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 50 52 4f  ..case SCARD_PRO
aad0: 54 4f 43 4f 4c 5f 54 30 3a 0a 09 09 09 09 09 09  TOCOL_T0:.......
aae0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
aaf0: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 09  RD_PCI_T0;......
ab00: 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
ab10: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
ab20: 4c 5f 54 31 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T1:.......pioS
ab30: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
ab40: 43 49 5f 54 31 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T1;........br
ab50: 65 61 6b 3b 0a 09 09 09 09 09 64 65 66 61 75 6c  eak;......defaul
ab60: 74 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f  t:.......CACKEY_
ab70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
ab80: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66  valid protocol f
ab90: 6f 75 6e 64 2c 20 62 75 74 20 74 6f 6f 20 6c 61  ound, but too la
aba0: 74 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e  te to do anythin
abb0: 67 20 61 62 6f 75 74 20 69 74 20 6e 6f 77 20 2d  g about it now -
abc0: 2d 20 74 72 79 69 6e 67 20 61 6e 79 77 61 79 2e  - trying anyway.
abd0: 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
abe0: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
abf0: 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
ac00: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
ac10: 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
ac20: 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
ac30: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
ac40: 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
ac50: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
ac60: 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
ac70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
ac80: 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
ac90: 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
aca0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
acb0: 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
acc0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
acd0: 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
ace0: 73 66 75 6c 2c 20 72 65 74 72 61 6e 73 6d 69 74  sful, retransmit
acf0: 74 69 6e 67 22 29 3b 0a 0a 09 09 09 09 72 65 63  ting");......rec
ad00: 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 72  v_len = sizeof(r
ad10: 65 63 76 5f 62 75 66 29 3b 0a 09 09 09 09 73 63  ecv_buf);.....sc
ad20: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53  ard_xmit_ret = S
ad30: 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f  CardTransmit(slo
ad40: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69  t->pcsc_card, pi
ad50: 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62  oSendPci, xmit_b
ad60: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55  uf, xmit_len, NU
ad70: 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72  LL, recv_buf, &r
ad80: 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69  ecv_len);......i
ad90: 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  f (scard_xmit_re
ada0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
adb0: 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
adc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
add0: 28 22 52 65 74 72 61 6e 73 6d 69 74 20 66 61 69  ("Retransmit fai
ade0: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
adf0: 6e 20 66 61 69 6c 75 72 65 20 61 66 74 65 72 20  n failure after 
ae00: 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 74 68  disconnecting th
ae10: 65 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61  e card (SCardTra
ae20: 6e 73 6d 69 74 20 3d 20 25 73 2f 25 6c 69 29 22  nsmit = %s/%li)"
ae30: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ae40: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
ae50: 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  STR(scard_xmit_r
ae60: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
ae70: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
ae80: 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65  ...SCardDisconne
ae90: 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ct(slot->pcsc_ca
aea0: 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f  rd, SCARD_LEAVE_
aeb0: 43 41 52 44 29 3b 0a 09 09 09 09 09 73 6c 6f 74  CARD);......slot
aec0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
aed0: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09  ected = 0;......
aee0: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
aef0: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
af00: 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
af10: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
af20: 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 65  1;......cackey_e
af30: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
af40: 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  lot);.......retu
af50: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
af60: 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
af70: 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
af80: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
af90: 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f 6e  G_PRINTF("Discon
afa0: 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b 0a  necting card");.
afb0: 0a 09 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
afc0: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
afd0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
afe0: 45 5f 43 41 52 44 29 3b 0a 09 09 09 09 73 6c 6f  E_CARD);.....slo
aff0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
b000: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09  nected = 0;.....
b010: 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72  ./* End Smartcar
b020: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
b030: 0a 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
b040: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
b050: 3b 0a 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  ;.....cackey_end
b060: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b070: 74 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  t);......CACKEY_
b080: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
b090: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
b0a0: 72 65 22 29 3b 0a 09 09 09 09 72 65 74 75 72 6e  re");.....return
b0b0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
b0c0: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
b0d0: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
b0e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b0f0: 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69  NTF("Disconnecti
b100: 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 53  ng card");.....S
b110: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
b120: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
b130: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
b140: 29 3b 0a 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  );....slot->pcsc
b150: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
b160: 3d 20 30 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20  = 0;...../* End 
b170: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b180: 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74  ction */....slot
b190: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
b1a0: 70 74 68 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  pth = 1;....cack
b1b0: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b1c0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 43 41  on(slot);.....CA
b1d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b1e0: 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
b1f0: 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 72 65  failure");....re
b200: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
b210: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
b220: 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
b230: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
b240: 22 52 65 74 75 72 6e 65 64 20 56 61 6c 75 65 3a  "Returned Value:
b250: 22 2c 20 72 65 63 76 5f 62 75 66 2c 20 72 65 63  ", recv_buf, rec
b260: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 72 65  v_len);...if (re
b270: 63 76 5f 6c 65 6e 20 3c 20 32 29 20 7b 0a 09 09  cv_len < 2) {...
b280: 2f 2a 20 4d 69 6e 69 6d 61 6c 20 72 65 73 70 6f  /* Minimal respo
b290: 6e 73 65 20 6c 65 6e 67 74 68 20 69 73 20 32 20  nse length is 2 
b2a0: 62 79 74 65 73 2c 20 72 65 74 75 72 6e 69 6e 67  bytes, returning
b2b0: 20 69 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 09   in failure */..
b2c0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
b2d0: 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65 20 74  INTF("Response t
b2e0: 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e  oo small, return
b2f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20 28  ing in failure (
b300: 72 65 63 76 5f 6c 65 6e 20 3d 20 25 6c 75 29 22  recv_len = %lu)"
b310: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
b320: 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09  ) recv_len);....
b330: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b340: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b350: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b360: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b370: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b380: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
b390: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
b3a0: 69 6e 65 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ine result code 
b3b0: 2a 2f 0a 09 6d 61 6a 6f 72 5f 72 63 20 3d 20 72  */..major_rc = r
b3c0: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
b3d0: 20 2d 20 32 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63   - 2];..minor_rc
b3e0: 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65 63 76   = recv_buf[recv
b3f0: 5f 6c 65 6e 20 2d 20 31 5d 3b 0a 09 69 66 20 28  _len - 1];..if (
b400: 72 65 73 70 63 6f 64 65 29 20 7b 0a 09 09 2a 72  respcode) {...*r
b410: 65 73 70 63 6f 64 65 20 3d 20 28 6d 61 6a 6f 72  espcode = (major
b420: 5f 72 63 20 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f  _rc << 8) | mino
b430: 72 5f 72 63 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64  r_rc;..}.../* Ad
b440: 6a 75 73 74 20 6d 65 73 73 61 67 65 20 62 75 66  just message buf
b450: 66 65 72 20 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e  fer */..recv_len
b460: 20 2d 3d 20 32 3b 0a 0a 09 2f 2a 20 41 64 64 20   -= 2;.../* Add 
b470: 62 79 74 65 73 20 74 6f 20 72 65 74 75 72 6e 20  bytes to return 
b480: 76 61 6c 75 65 20 2a 2f 0a 09 74 6d 70 5f 72 65  value */..tmp_re
b490: 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a  spdata_len = 0;.
b4a0: 09 69 66 20 28 72 65 73 70 64 61 74 61 20 26 26  .if (respdata &&
b4b0: 20 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b   respdata_len) {
b4c0: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
b4d0: 6c 65 6e 20 3d 20 2a 72 65 73 70 64 61 74 61 5f  len = *respdata_
b4e0: 6c 65 6e 3b 0a 0a 09 09 62 79 74 65 73 5f 74 6f  len;....bytes_to
b4f0: 5f 63 6f 70 79 20 3d 20 2a 72 65 73 70 64 61 74  _copy = *respdat
b500: 61 5f 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 72 65  a_len;....if (re
b510: 63 76 5f 6c 65 6e 20 3c 20 62 79 74 65 73 5f 74  cv_len < bytes_t
b520: 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 09 62 79 74  o_copy) {....byt
b530: 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 72 65 63  es_to_copy = rec
b540: 76 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41  v_len;...}....CA
b550: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b560: 46 28 22 43 6f 70 79 69 6e 67 20 25 6c 75 20 62  F("Copying %lu b
b570: 79 74 65 73 20 74 6f 20 74 68 65 20 62 75 66 66  ytes to the buff
b580: 65 72 20 28 72 65 63 76 27 64 20 25 6c 75 20 62  er (recv'd %lu b
b590: 79 74 65 73 2c 20 62 75 74 20 6f 6e 6c 79 20 25  ytes, but only %
b5a0: 6c 75 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  lu bytes left in
b5b0: 20 6f 75 72 20 62 75 66 66 65 72 29 22 2c 20 28   our buffer)", (
b5c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
b5d0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 2c 20 28 75  ytes_to_copy, (u
b5e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
b5f0: 63 76 5f 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  cv_len, (unsigne
b600: 64 20 6c 6f 6e 67 29 20 2a 72 65 73 70 64 61 74  d long) *respdat
b610: 61 5f 6c 65 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70  a_len);....memcp
b620: 79 28 72 65 73 70 64 61 74 61 2c 20 72 65 63 76  y(respdata, recv
b630: 5f 62 75 66 2c 20 62 79 74 65 73 5f 74 6f 5f 63  _buf, bytes_to_c
b640: 6f 70 79 29 3b 0a 09 09 72 65 73 70 64 61 74 61  opy);...respdata
b650: 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   += bytes_to_cop
b660: 79 3b 0a 0a 09 09 2a 72 65 73 70 64 61 74 61 5f  y;....*respdata_
b670: 6c 65 6e 20 3d 20 62 79 74 65 73 5f 74 6f 5f 63  len = bytes_to_c
b680: 6f 70 79 3b 0a 09 09 74 6d 70 5f 72 65 73 70 64  opy;...tmp_respd
b690: 61 74 61 5f 6c 65 6e 20 2d 3d 20 62 79 74 65 73  ata_len -= bytes
b6a0: 5f 74 6f 5f 63 6f 70 79 3b 0a 09 7d 20 65 6c 73  _to_copy;..} els
b6b0: 65 20 7b 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  e {...if (recv_l
b6c0: 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  en != 0) {....CA
b6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
b6e0: 46 28 22 54 68 72 6f 77 69 6e 67 20 61 77 61 79  F("Throwing away
b6f0: 20 25 6c 75 20 62 79 74 65 73 2c 20 6e 6f 77 68   %lu bytes, nowh
b700: 65 72 65 20 74 6f 20 70 75 74 20 74 68 65 6d 21  ere to put them!
b710: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
b720: 67 29 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 09 09  g) recv_len);...
b730: 7d 0a 09 7d 0a 0a 09 69 66 20 28 6d 61 6a 6f 72  }..}...if (major
b740: 5f 72 63 20 3d 3d 20 30 78 36 31 29 20 7b 0a 09  _rc == 0x61) {..
b750: 09 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 52  ./* We need to R
b760: 45 41 44 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  EAD */...CACKEY_
b770: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
b780: 66 66 65 72 20 72 65 61 64 20 72 65 71 75 69 72  ffer read requir
b790: 65 64 22 29 3b 0a 0a 09 09 69 66 20 28 6d 69 6e  ed");....if (min
b7a0: 6f 72 5f 72 63 20 3d 3d 20 30 78 30 30 29 20 7b  or_rc == 0x00) {
b7b0: 0a 09 09 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 43  ....minor_rc = C
b7c0: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
b7d0: 09 09 7d 0a 0a 09 09 70 63 73 63 5f 67 65 74 72  ..}....pcsc_getr
b7e0: 65 73 70 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  esp_ret = cackey
b7f0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
b800: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
b810: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
b820: 52 5f 47 45 54 5f 52 45 53 50 4f 4e 53 45 2c 20  R_GET_RESPONSE, 
b830: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 2c 20 4e  0x00, 0x00, 0, N
b840: 55 4c 4c 2c 20 6d 69 6e 6f 72 5f 72 63 2c 20 72  ULL, minor_rc, r
b850: 65 73 70 63 6f 64 65 2c 20 72 65 73 70 64 61 74  espcode, respdat
b860: 61 2c 20 26 74 6d 70 5f 72 65 73 70 64 61 74 61  a, &tmp_respdata
b870: 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 70 63  _len);....if (pc
b880: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 21  sc_getresp_ret !
b890: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
b8a0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
b8b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75  DEBUG_PRINTF("Bu
b8c0: 66 66 65 72 20 72 65 61 64 20 66 61 69 6c 65 64  ffer read failed
b8d0: 21 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  !  Returning in 
b8e0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f  failure");...../
b8f0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
b900: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
b910: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b920: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b930: 0a 09 09 09 69 66 20 28 70 63 73 63 5f 67 65 74  ....if (pcsc_get
b940: 72 65 73 70 5f 72 65 74 20 3d 3d 20 43 41 43 4b  resp_ret == CACK
b950: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
b960: 20 7b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41   {.....return(CA
b970: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
b980: 59 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  Y);....}.....ret
b990: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b9a0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
b9b0: 0a 09 09 69 66 20 28 72 65 73 70 64 61 74 61 5f  ...if (respdata_
b9c0: 6c 65 6e 29 20 7b 0a 09 09 09 2a 72 65 73 70 64  len) {....*respd
b9d0: 61 74 61 5f 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72  ata_len += tmp_r
b9e0: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d  espdata_len;...}
b9f0: 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74  ..../* End Smart
ba00: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
ba10: 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64   */...cackey_end
ba20: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
ba30: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
ba40: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
ba50: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
ba60: 20 28 62 75 66 66 65 72 20 72 65 61 64 20 63 6f   (buffer read co
ba70: 6d 70 6c 65 74 65 29 22 29 3b 0a 09 09 72 65 74  mplete)");...ret
ba80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
ba90: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45  S_OK);..}.../* E
baa0: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
bab0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63  nsaction */..cac
bac0: 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
bad0: 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20  ion(slot);...if 
bae0: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 39  (major_rc == 0x9
baf0: 30 29 20 7b 0a 09 09 2f 2a 20 53 75 63 63 65 73  0) {.../* Succes
bb00: 73 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  s */...CACKEY_DE
bb10: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
bb20: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
bb30: 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 20 30 78 39   (major_rc = 0x9
bb40: 30 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0)");....return(
bb50: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
bb60: 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f  );..}....CACKEY_
bb70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50  DEBUG_PRINTF("AP
bb80: 44 55 20 52 65 74 75 72 6e 65 64 20 61 6e 20 65  DU Returned an e
bb90: 72 72 6f 72 2c 20 72 65 74 75 72 6e 69 6e 67 20  rror, returning 
bba0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
bbb0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
bbc0: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 7d  SC_E_GENERIC);.}
bbd0: 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
bbe0: 64 20 63 68 61 72 20 2a 63 61 63 6b 65 79 5f 72  d char *cackey_r
bbf0: 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 75  ead_bertlv_tag(u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
bc10: 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 62 75  ffer, size_t *bu
bc20: 66 66 65 72 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69  ffer_len_p, unsi
bc30: 67 6e 65 64 20 63 68 61 72 20 74 61 67 2c 20 75  gned char tag, u
bc40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
bc50: 74 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  tbuffer, size_t 
bc60: 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70  *outbuffer_len_p
bc70: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
bc80: 61 72 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 73  ar *buffer_p;..s
bc90: 69 7a 65 5f 74 20 6f 75 74 62 75 66 66 65 72 5f  ize_t outbuffer_
bca0: 6c 65 6e 2c 20 62 75 66 66 65 72 5f 6c 65 6e 3b  len, buffer_len;
bcb0: 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 3b 0a 09  ..size_t size;..
bcc0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
bcd0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bce0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
bcf0: 28 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d  (buffer_len_p ==
bd00: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
bd10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
bd20: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20  buffer_len_p is 
bd30: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67  NULL.  Returning
bd40: 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a   in failure.");.
bd50: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
bd60: 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66  ..}...if (outbuf
bd70: 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c  fer_len_p == NUL
bd80: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
bd90: 42 55 47 5f 50 52 49 4e 54 46 28 22 6f 75 74 62  BUG_PRINTF("outb
bda0: 75 66 66 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e  uffer_len_p is N
bdb0: 55 4c 4c 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ULL.  Returning 
bdc0: 69 6e 20 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a  in failure.");..
bdd0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
bde0: 09 7d 0a 0a 09 62 75 66 66 65 72 5f 6c 65 6e 20  .}...buffer_len 
bdf0: 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  = *outbuffer_len
be00: 5f 70 3b 0a 09 6f 75 74 62 75 66 66 65 72 5f 6c  _p;..outbuffer_l
be10: 65 6e 20 3d 20 2a 6f 75 74 62 75 66 66 65 72 5f  en = *outbuffer_
be20: 6c 65 6e 5f 70 3b 0a 0a 09 62 75 66 66 65 72 5f  len_p;...buffer_
be30: 70 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20  p = buffer;..if 
be40: 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 21 3d 20  (buffer_p[0] != 
be50: 74 61 67 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  tag) {...CACKEY_
be60: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
be70: 67 20 66 6f 75 6e 64 20 77 61 73 20 6e 6f 74 20  g found was not 
be80: 74 61 67 20 65 78 70 65 63 74 65 64 2e 20 20 54  tag expected.  T
be90: 61 67 20 3d 20 25 30 32 78 2c 20 45 78 70 65 63  ag = %02x, Expec
bea0: 74 65 64 20 3d 20 25 30 32 78 2e 20 20 52 65 74  ted = %02x.  Ret
beb0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
bec0: 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  e.", (unsigned i
bed0: 6e 74 29 20 62 75 66 66 65 72 5f 70 5b 30 5d 2c  nt) buffer_p[0],
bee0: 20 74 61 67 29 3b 0a 0a 09 09 72 65 74 75 72 6e   tag);....return
bef0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66  (NULL);..}...buf
bf00: 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72  fer_p++;..buffer
bf10: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 28 62  _len--;...if ((b
bf20: 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 38  uffer_p[0] & 0x8
bf30: 30 29 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09  0) == 0x80) {...
bf40: 73 69 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78 20  size = 0;...idx 
bf50: 3d 20 28 62 75 66 66 65 72 5f 70 5b 30 5d 20 26  = (buffer_p[0] &
bf60: 20 30 78 37 66 29 3b 0a 0a 09 09 69 66 20 28 69   0x7f);....if (i
bf70: 64 78 20 3e 20 62 75 66 66 65 72 5f 6c 65 6e 29  dx > buffer_len)
bf80: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
bf90: 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f  UG_PRINTF("Malfo
bfa0: 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20 2d  rmed BER value -
bfb0: 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  - not enough byt
bfc0: 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  es available to 
bfd0: 72 65 61 64 20 6c 65 6e 67 74 68 20 28 69 64 78  read length (idx
bfe0: 20 3d 20 25 69 2c 20 62 75 66 66 65 72 5f 6c 65   = %i, buffer_le
bff0: 6e 20 3d 20 25 6c 75 29 22 2c 20 69 64 78 2c 20  n = %lu)", idx, 
c000: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c010: 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09  buffer_len);....
c020: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
c030: 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64 78  .}....for (; idx
c040: 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09   > 0; idx--) {..
c050: 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09  ..buffer_p++;...
c060: 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a  .buffer_len--;..
c070: 09 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09  ...size <<= 8;..
c080: 09 09 73 69 7a 65 20 7c 3d 20 62 75 66 66 65 72  ..size |= buffer
c090: 5f 70 5b 30 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c  _p[0];...}..} el
c0a0: 73 65 20 7b 0a 09 09 73 69 7a 65 20 3d 20 62 75  se {...size = bu
c0b0: 66 66 65 72 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09  ffer_p[0];..}...
c0c0: 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 62 75 66  buffer_p++;..buf
c0d0: 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20  fer_len--;...if 
c0e0: 28 73 69 7a 65 20 3e 20 6f 75 74 62 75 66 66 65  (size > outbuffe
c0f0: 72 5f 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45  r_len) {...CACKE
c100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c110: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 70 79 20 76  Unable to copy v
c120: 61 6c 75 65 20 62 75 66 66 65 72 20 74 6f 20 6f  alue buffer to o
c130: 75 74 62 75 66 66 65 72 2c 20 6e 6f 74 20 65 6e  utbuffer, not en
c140: 6f 75 67 68 20 72 6f 6f 6d 2e 20 20 56 61 6c 75  ough room.  Valu
c150: 65 20 62 75 66 66 65 72 20 6c 65 6e 67 74 68 20  e buffer length 
c160: 3d 20 25 6c 75 2c 20 6f 75 74 20 62 75 66 66 65  = %lu, out buffe
c170: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c  r length = %lu",
c180: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
c190: 20 73 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64   size, (unsigned
c1a0: 20 6c 6f 6e 67 29 20 6f 75 74 62 75 66 66 65 72   long) outbuffer
c1b0: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
c1c0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75  (NULL);..}...*ou
c1d0: 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 20 3d 20  tbuffer_len_p = 
c1e0: 73 69 7a 65 3b 0a 09 69 66 20 28 6f 75 74 62 75  size;..if (outbu
c1f0: 66 66 65 72 29 20 7b 0a 09 09 6d 65 6d 63 70 79  ffer) {...memcpy
c200: 28 6f 75 74 62 75 66 66 65 72 2c 20 62 75 66 66  (outbuffer, buff
c210: 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62  er_p, size);...b
c220: 75 66 66 65 72 5f 70 20 2b 3d 20 73 69 7a 65 3b  uffer_p += size;
c230: 0a 09 09 62 75 66 66 65 72 5f 6c 65 6e 20 2d 3d  ...buffer_len -=
c240: 20 73 69 7a 65 3b 0a 0a 09 09 2a 62 75 66 66 65   size;....*buffe
c250: 72 5f 6c 65 6e 5f 70 20 3d 20 62 75 66 66 65 72  r_len_p = buffer
c260: 5f 6c 65 6e 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  _len;....CACKEY_
c270: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
c280: 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a  BER-TLV results:
c290: 22 2c 20 6f 75 74 62 75 66 66 65 72 2c 20 73 69  ", outbuffer, si
c2a0: 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ze);..} else {..
c2b0: 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c  .memmove(buffer,
c2c0: 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65 29   buffer_p, size)
c2d0: 3b 0a 09 09 62 75 66 66 65 72 5f 70 20 3d 20 62  ;...buffer_p = b
c2e0: 75 66 66 65 72 3b 0a 0a 09 09 43 41 43 4b 45 59  uffer;....CACKEY
c2f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
c300: 22 42 45 52 2d 54 4c 56 20 72 65 73 75 6c 74 73  "BER-TLV results
c310: 3a 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65  :", buffer, size
c320: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
c330: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
c340: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
c350: 73 2e 20 20 53 69 7a 65 20 6f 66 20 63 6f 6e 74  s.  Size of cont
c360: 65 6e 74 73 20 66 6f 72 20 74 61 67 20 25 30 32  ents for tag %02
c370: 78 20 69 73 20 25 6c 75 22 2c 20 28 75 6e 73 69  x is %lu", (unsi
c380: 67 6e 65 64 20 69 6e 74 29 20 74 61 67 2c 20 28  gned int) tag, (
c390: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
c3a0: 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 62  ize);...return(b
c3b0: 75 66 66 65 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  uffer_p);.}../*.
c3c0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
c3d0: 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65     ssize_t cacke
c3e0: 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75 63  y_get_data(struc
c3f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
c400: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
c410: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
c420: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75  _t buffer_len, u
c430: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c440: 5b 33 5d 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  [3]);. *. * ARGU
c450: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72  MENTS. *     str
c460: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c470: 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *slot. *        
c480: 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f   Slot to send co
c490: 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20  mmands to. *. * 
c4a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
c4b0: 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20  r *buffer. *    
c4c0: 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65       [OUT] Buffe
c4d0: 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65  r. *. *     size
c4e0: 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 0a 20 2a  _t buffer_len. *
c4f0: 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20           Number 
c500: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65  of bytes to atte
c510: 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20  mpt to read. *. 
c520: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
c530: 68 61 72 20 6f 69 64 5b 33 5d 0a 20 2a 20 20 20  har oid[3]. *   
c540: 20 20 20 20 20 20 33 2d 62 79 74 65 20 4f 49 44        3-byte OID
c550: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 0a 20   to read. *. *. 
c560: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
c570: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
c580: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
c590: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c5a0: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f  actually read, o
c5b0: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20  r -1 on error.. 
c5c0: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c5d0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
c5e0: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c5f0: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72  key_get_data(str
c600: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c610: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
c620: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
c630: 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 2c  ze_t buffer_len,
c640: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f   unsigned char o
c650: 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e  id[3]) {..unsign
c660: 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20 3d 20  ed char cmd[] = 
c670: 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30 78 30  {0x5C, 0x03, 0x0
c680: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
c690: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
c6a0: 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f  buffer_p;..size_
c6b0: 74 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65  t init_buffer_le
c6c0: 6e 2c 20 73 69 7a 65 3b 0a 09 75 69 6e 74 31 36  n, size;..uint16
c6d0: 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e  _t respcode;..in
c6e0: 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41  t send_ret;...CA
c6f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c700: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
c710: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 20  init_buffer_len 
c720: 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09  = buffer_len;...
c730: 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b  cmd[2] = oid[0];
c740: 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31  ..cmd[3] = oid[1
c750: 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64  ];..cmd[4] = oid
c760: 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f  [2];.../* 256 to
c770: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c 61   indicate the la
c780: 72 67 65 73 74 20 6d 65 73 73 61 67 65 20 73 69  rgest message si
c790: 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20  ze -- not clear 
c7a0: 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f 72  if this will wor
c7b0: 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73 61  k with all messa
c7c0: 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ges */..send_ret
c7d0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
c7e0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
c7f0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e  CLASS_ISO7816, N
c800: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
c810: 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30 78  STR_GET_DATA, 0x
c820: 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f 66  3F, 0xFF, sizeof
c830: 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c  (cmd), cmd, 256,
c840: 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66   &respcode, buff
c850: 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e 29  er, &buffer_len)
c860: 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ;...if (send_ret
c870: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
c880: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43  E_RETRY) {...CAC
c890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
c8a0: 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66  ("ADPU Sending f
c8b0: 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20  ailed, retrying 
c8c0: 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a 0a  read buffer");..
c8d0: 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f  ..return(cackey_
c8e0: 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62  get_data(slot, b
c8f0: 75 66 66 65 72 2c 20 69 6e 69 74 5f 62 75 66 66  uffer, init_buff
c900: 65 72 5f 6c 65 6e 2c 20 6f 69 64 29 29 3b 0a 09  er_len, oid));..
c910: 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74  }...if (send_ret
c920: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
c930: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
c940: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
c950: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
c960: 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  ) failed, return
c970: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
c980: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c990: 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
c9a0: 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
c9b0: 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
c9c0: 45 5f 4d 41 58 0a 09 69 66 20 28 62 75 66 66 65  E_MAX..if (buffe
c9d0: 72 5f 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53  r_len > _POSIX_S
c9e0: 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41  SIZE_MAX) {...CA
c9f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ca00: 46 28 22 52 65 61 64 20 62 79 74 65 73 20 28 62  F("Read bytes (b
ca10: 75 66 66 65 72 5f 6c 65 6e 29 20 65 78 63 65 65  uffer_len) excee
ca20: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
ca30: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
ca40: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
ca50: 6c 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d  li, buffer_len =
ca60: 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
ca70: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
ca80: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
ca90: 20 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09   buffer_len);...
caa0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
cab0: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
cac0: 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e  ..if (buffer_len
cad0: 20 3c 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59   < 2) {...CACKEY
cae0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
caf0: 50 44 55 20 47 45 54 20 44 41 54 41 20 72 65 74  PDU GET DATA ret
cb00: 75 72 6e 65 64 20 25 6c 75 20 62 79 74 65 73 2c  urned %lu bytes,
cb10: 20 77 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68   which is too sh
cb20: 6f 72 74 20 66 6f 72 20 61 20 42 45 52 2d 54 4c  ort for a BER-TL
cb30: 56 20 72 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e  V response", (un
cb40: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
cb50: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  fer_len);....ret
cb60: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69  urn(-1);..}...si
cb70: 7a 65 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b  ze = buffer_len;
cb80: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 63 61 63  ..buffer_p = cac
cb90: 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
cba0: 74 61 67 28 62 75 66 66 65 72 2c 20 26 62 75 66  tag(buffer, &buf
cbb0: 66 65 72 5f 6c 65 6e 2c 20 30 78 35 33 2c 20 4e  fer_len, 0x53, N
cbc0: 55 4c 4c 2c 20 26 73 69 7a 65 29 3b 0a 0a 09 69  ULL, &size);...i
cbd0: 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e  f (buffer_p == N
cbe0: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
cbf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
cc00: 67 20 64 65 63 6f 64 69 6e 67 20 66 61 69 6c 65  g decoding faile
cc10: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
cc20: 65 72 72 6f 72 2e 22 29 3b 0a 0a 09 09 72 65 74  error.");....ret
cc30: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41  urn(-1);..}...CA
cc40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cc50: 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65  BUF("GET DATA re
cc60: 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73  sult", buffer, s
cc70: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
cc80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
cc90: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
cca0: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
ccb0: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
ccc0: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
ccd0: 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  urn(size);.}../*
cce0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ccf0: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
cd00: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
cd10: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cd20: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
cd30: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
cd40: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
cd50: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
cd60: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
cd70: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
cd80: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
cd90: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
cda0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
cdb0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
cdc0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
cdd0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
cde0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
cdf0: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
ce00: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
ce10: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
ce20: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
ce30: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
ce40: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
ce50: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
ce60: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
ce70: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
ce80: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
ce90: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
cea0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
ceb0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
cec0: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
ced0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
cee0: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
cef0: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
cf00: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
cf10: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
cf20: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
cf30: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
cf40: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
cf50: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
cf60: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
cf70: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
cf80: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
cf90: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
cfa0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
cfb0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
cfc0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
cfd0: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
cfe0: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
cff0: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
d000: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
d010: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69  _offset) {..unsi
d020: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f  gned char *init_
d030: 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20  buffer;..size_t 
d040: 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a  init_count;..siz
d050: 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  e_t init_initial
d060: 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f  _offset;...size_
d070: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
d080: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
d090: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
d0a0: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
d0b0: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
d0c0: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
d0d0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d0e0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
d0f0: 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d  ...init_buffer =
d100: 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63   buffer;..init_c
d110: 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69  ount = count;..i
d120: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
d130: 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66  et = initial_off
d140: 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  set;...max_offse
d150: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
d160: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
d170: 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74  PDU_MTU;...if (t
d180: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
d190: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
d1a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d1b0: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
d1c0: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
d1d0: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
d1e0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d1f0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
d200: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
d210: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
d220: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
d230: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
d240: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d250: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
d260: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
d270: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
d280: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
d290: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
d2a0: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
d2b0: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
d2c0: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
d2d0: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
d2e0: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
d2f0: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
d300: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
d310: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
d320: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
d330: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
d340: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
d350: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
d360: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
d370: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
d380: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
d390: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
d3a0: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
d3b0: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
d3c0: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
d3d0: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
d3e0: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
d3f0: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
d400: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41  E_RETRY) {....CA
d410: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d420: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
d430: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
d440: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
d450: 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
d460: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
d470: 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c  ot, init_buffer,
d480: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f   init_count, t_o
d490: 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61  r_v, init_initia
d4a0: 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a  l_offset));...}.
d4b0: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d4c0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d4d0: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
d4e0: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
d4f0: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
d500: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
d510: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
d520: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
d530: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
d540: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
d550: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
d560: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
d570: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
d580: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
d590: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d5a0: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
d5b0: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
d5c0: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
d5d0: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
d5e0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d5f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
d600: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
d610: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
d620: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
d630: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
d640: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
d650: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
d660: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
d670: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
d680: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
d690: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
d6a0: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
d6b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
d6c0: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
d6d0: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
d6e0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
d6f0: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
d700: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
d710: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
d720: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
d730: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
d740: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
d750: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
d760: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d770: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
d780: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
d790: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
d7a0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d7b0: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
d7c0: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
d7d0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d7e0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
d7f0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d800: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
d810: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d820: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
d830: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
d840: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d850: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d860: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d870: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d880: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d890: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d8a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
d8b0: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
d8c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d8d0: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
d8e0: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
d8f0: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
d900: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
d910: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
d920: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
d930: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
d940: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
d950: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
d960: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
d970: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
d980: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
d990: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
d9a0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
d9b0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
d9c0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
d9d0: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
d9e0: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
d9f0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
da00: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
da10: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
da20: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
da30: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
da40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
da50: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
da60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
da70: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
da80: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
da90: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
daa0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
dab0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
dac0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
dad0: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
dae0: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
daf0: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
db00: 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  0, aid_len, aid,
db10: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
db20: 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
db30: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
db40: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
db50: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
db60: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
db70: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
db80: 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61  etrying select a
db90: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75  pplet");....retu
dba0: 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  rn(cackey_select
dbb0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69  _applet(slot, ai
dbc0: 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d  d, aid_len));..}
dbd0: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
dbe0: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
dbf0: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
dc00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
dc10: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
dc20: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
dc30: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
dc40: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
dc50: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
dc60: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
dc70: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
dc80: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
dc90: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
dca0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
dcb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
dcc0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
dcd0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
dce0: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
dcf0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
dd00: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
dd10: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
dd20: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
dd30: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
dd40: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
dd50: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
dd60: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
dd70: 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20  uint16_t ef. *  
dd80: 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c         Elemental
dd90: 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a   File to select.
dda0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
ddb0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
ddc0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
ddd0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
dde0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
ddf0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
de00: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
de10: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73  ES. *     This s
de20: 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e  elects an Elemen
de30: 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75  tary File (EF) u
de40: 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  nder the current
de50: 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20  ly selected. *  
de60: 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c     Dedicated Fil
de70: 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20  e (DF). *. *    
de80: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20   Typically this 
de90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
dea0: 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f  selecting the co
deb0: 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73  rrect Applet (us
dec0: 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  ing. *     cacke
ded0: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29  y_select_applet)
dee0: 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a   for VM cards. *
def0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
df00: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
df10: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
df20: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
df30: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
df40: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
df50: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
df60: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
df70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
df80: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
df90: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
dfa0: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
dfb0: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
dfc0: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
dfd0: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
dfe0: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
dff0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e000: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
e010: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
e020: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
e030: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
e040: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
e050: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
e060: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
e070: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
e080: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
e090: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
e0a0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
e0b0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
e0c0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
e0d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
e0e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e0f0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
e100: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
e110: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e120: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
e130: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
e140: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
e150: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
e160: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
e170: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
e180: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
e190: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
e1a0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e1b0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
e1c0: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
e1d0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e1e0: 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  root);. *. * ARG
e1f0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
e200: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
e210: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20  entity *root. * 
e220: 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20          Root of 
e230: 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20  the TLV list to 
e240: 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a  start freeing. *
e250: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
e260: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
e270: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
e280: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72  This function fr
e290: 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b  ees the TLV link
e2a0: 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e  ed listed return
e2b0: 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22  ed from. *     "
e2c0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22  cackey_read_tlv"
e2d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
e2e0: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
e2f0: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
e300: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
e310: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
e320: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e330: 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09  *curr, *next;...
e340: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
e350: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
e360: 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72  ...for (curr = r
e370: 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20  oot; curr; curr 
e380: 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74  = next) {...next
e390: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a   = curr->_next;.
e3a0: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d  ...switch (curr-
e3b0: 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  >tag) {....case 
e3c0: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
e3d0: 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43  BLE:....case GSC
e3e0: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
e3f0: 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  TE:.....if (curr
e400: 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  ->value) {......
e410: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
e420: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
e430: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
e440: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
e450: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
e460: 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09  ue_cardurl) {...
e470: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
e480: 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09  lue_cardurl);...
e490: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
e4a0: 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29  .}....free(curr)
e4b0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
e4c0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
e4d0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e4e0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
e4f0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
e500: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e510: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
e520: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
e530: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
e540: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e550: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
e560: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
e570: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
e580: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
e590: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
e5a0: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
e5b0: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
e5c0: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
e5d0: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
e5e0: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
e5f0: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
e600: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
e610: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
e620: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
e630: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
e640: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
e650: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73 69   tmpbuflen;..ssi
e660: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
e670: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
e680: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
e690: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
e6a0: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
e6b0: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
e6c0: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
e6d0: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e  ef HAVE_LIBZ..in
e6e0: 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
e6f0: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
e700: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e710: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61  Called.");...rea
e720: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e730: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e740: 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   tlen_buf, sizeo
e750: 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20  f(tlen_buf), 1, 
e760: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
e770: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e780: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(tlen_buf)) {.
e790: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e7a0: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e7b0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e7c0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e7d0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e7e0: 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62  ..tlen = (tlen_b
e7f0: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c  uf[1] << 8) | tl
e800: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61  en_buf[0];...rea
e810: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e820: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e830: 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   vlen_buf, sizeo
e840: 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20  f(vlen_buf), 2, 
e850: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
e860: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e870: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(vlen_buf)) {.
e880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e890: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e8a0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e8b0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e8c0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e8d0: 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62  ..vlen = (vlen_b
e8e0: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c  uf[1] << 8) | vl
e8f0: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43  en_buf[0];...CAC
e900: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e910: 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25  ("Tag Length = %
e920: 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74 68  lu, Value Length
e930: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
e940: 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20 28  ed long) tlen, (
e950: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76  unsigned long) v
e960: 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74  len);...offset_t
e970: 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   += 2;..offset_v
e980: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
e990: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
e9a0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e9b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
e9c0: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
e9d0: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
e9e0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
e9f0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
ea00: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
ea10: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
ea20: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
ea30: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
ea40: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
ea50: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
ea60: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
ea70: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ea80: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
ea90: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
eaa0: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
eab0: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
eac0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
ead0: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
eae0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
eaf0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
eb00: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
eb10: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
eb20: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
eb30: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
eb40: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
eb50: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
eb60: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
eb70: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
eb80: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
eb90: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
eba0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ebb0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
ebc0: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
ebd0: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
ebe0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
ebf0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
ec00: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
ec10: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
ec20: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
ec30: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
ec40: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
ec50: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
ec60: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
ec70: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
ec80: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
ec90: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
eca0: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
ecb0: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
ecc0: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
ecd0: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
ece0: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
ecf0: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
ed00: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ed10: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
ed20: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
ed30: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
ed40: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
ed50: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
ed60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ed70: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
ed80: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
ed90: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
eda0: 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28  NULL;...switch (
edb0: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47  tag) {....case G
edc0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
edd0: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
ede0: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
edf0: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
ee00: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ee10: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
ee20: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
ee30: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  (*curr_entity->v
ee40: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a  alue_cardurl));.
ee50: 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
ee60: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
ee70: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61  ardurl->rid, vva
ee80: 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f  l, 5);.....curr_
ee90: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
eea0: 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d  rdurl->apptype =
eeb0: 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75   vval[5];.....cu
eec0: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
eed0: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
eee0: 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c  id = (vval[6] <<
eef0: 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09   8) | vval[7];..
ef00: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ef10: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
ef20: 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20  ppid = (vval[8] 
ef30: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b  << 8) | vval[9];
ef40: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
ef50: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
ef60: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
ef70: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
ef80: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
ef90: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
efa0: 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  ABLE:.....curr_e
efb0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
efc0: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
efd0: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
efe0: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
eff0: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
f000: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
f010: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
f020: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f030: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f040: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
f050: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
f060: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
f070: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
f080: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
f090: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
f0a0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
f0b0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
f0c0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
f0d0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
f0e0: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
f0f0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
f100: 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  Z.....tmpbuflen 
f110: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
f120: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
f130: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
f140: 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
f150: 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74  t = uncompress(t
f160: 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65  mpbuf, &tmpbufle
f170: 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  n, vval, length)
f180: 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ;.....if (uncomp
f190: 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b  ress_ret != Z_OK
f1a0: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
f1b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
f1c0: 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65  iled to decompre
f1d0: 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ss, uncompress()
f1e0: 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20   returned %i -- 
f1f0: 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72  resorting to dir
f200: 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d  ect copy", uncom
f210: 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09  press_ret);.....
f220: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
f230: 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70  ngth;......memcp
f240: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
f250: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a  length);.....}..
f260: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
f270: 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
f280: 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
f290: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
f2a0: 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b  ;.#else.....CACK
f2b0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f2c0: 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75  "Missing ZLIB Su
f2d0: 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74  pport, this cert
f2e0: 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c  ificate is likel
f2f0: 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a  y useless...");.
f300: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
f310: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d   length;.....mem
f320: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
f330: 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69  , length);.#endi
f340: 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f......curr_enti
f350: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
f360: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f370: 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c  length = tmpbufl
f380: 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  en;.....curr_ent
f390: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
f3a0: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
f3b0: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
f3c0: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
f3d0: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
f3e0: 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75  G_PKCS15:.....cu
f3f0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
f400: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
f410: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63  entity));......c
f420: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
f430: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
f440: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79  entity->value_by
f450: 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09  te = vval[0];...
f460: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f470: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f480: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
f490: 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  vval += length;.
f4a0: 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68  ..vlen -= length
f4b0: 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e  ;....if (curr_en
f4c0: 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  tity != NULL) {.
f4d0: 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
f4e0: 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20  ULL) {.....root 
f4f0: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
f500: 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74  ..}.....if (last
f510: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
f520: 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75  last->_next = cu
f530: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
f540: 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f  ....last = curr_
f550: 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a  entity;...}..}..
f560: 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d  .return(root);.}
f570: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
f580: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f590: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
f5a0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
f5b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
f5c0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
f5d0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
f5e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f5f0: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
f600: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
f610: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
f620: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
f630: 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72  t, int free_star
f640: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
f650: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
f660: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
f670: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  n;..}...for (idx
f680: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
f690: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
f6a0: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72   (start[idx].cer
f6b0: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66  tificate) {....f
f6c0: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  ree(start[idx].c
f6d0: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d  ertificate);...}
f6e0: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73  ..}...if (free_s
f6f0: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73  tart) {...free(s
f700: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tart);..}...retu
f710: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  rn;.}..static st
f720: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f730: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
f740: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74 72  y_copy_certs(str
f750: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
f760: 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c 20  identity *dest, 
f770: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
f780: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61  sc_identity *sta
f790: 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  rt, size_t count
f7a0: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b  ) {..size_t idx;
f7b0: 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20  ...if (start == 
f7c0: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
f7d0: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
f7e0: 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (dest == NULL) {
f7f0: 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f 63  ...dest = malloc
f800: 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20 2a  (sizeof(*dest) *
f810: 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f   count);..}...fo
f820: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
f830: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
f840: 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69 64  {...dest[idx].id
f850: 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69 64  _type = start[id
f860: 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09 73  x].id_type;....s
f870: 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78 5d  witch (dest[idx]
f880: 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
f890: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
f8a0: 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d 63  PE_CAC:.....memc
f8b0: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  py(dest[idx].car
f8c0: 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 74  d.cac.applet, st
f8d0: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  art[idx].card.ca
f8e0: 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
f8f0: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
f900: 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
f910: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
f920: 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61 72  .cac.file = star
f930: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f940: 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b 3b  file;.....break;
f950: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
f960: 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
f970: 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  .dest[idx].card.
f980: 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74 61  piv.key_id = sta
f990: 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76  rt[idx].card.piv
f9a0: 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 6d 65 6d  .key_id;.....mem
f9b0: 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  cpy(dest[idx].ca
f9c0: 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 73 74  rd.piv.label, st
f9d0: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69  art[idx].card.pi
f9e0: 76 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  v.label, sizeof(
f9f0: 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  dest[idx].card.p
fa00: 69 76 2e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  iv.label));.....
fa10: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
fa20: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
fa30: 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
fa40: 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b 69  ak;...}...dest[i
fa50: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
fa60: 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  len = start[idx]
fa70: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
fa80: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65  ;...dest[idx].ke
fa90: 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69 64  ysize = start[id
faa0: 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64  x].keysize;....d
fab0: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fac0: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65  cate = malloc(de
fad0: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fae0: 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63  ate_len);...memc
faf0: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  py(dest[idx].cer
fb00: 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74 5b  tificate, start[
fb10: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fb20: 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  , dest[idx].cert
fb30: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d  ificate_len);..}
fb40: 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29 3b  ...return(dest);
fb50: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
fb60: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
fb70: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
fb80: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
fb90: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
fba0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
fbb0: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
fbc0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
fbd0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
fbe0: 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
fbf0: 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63  read_certs(struc
fc00: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
fc10: 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
fc20: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
fc30: 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65   *certs, unsigne
fc40: 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b  d long *count) {
fc50: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
fc60: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fc70: 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
fc80: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
fc90: 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
fca0: 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
fcb0: 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
fcc0: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
fcd0: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
fce0: 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b  D_CCC}, piv_aid[
fcf0: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
fd00: 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75  3_3_PIV_AID};..u
fd10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
fd20: 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70  v_oid, piv_oid_p
fd30: 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54  ivauth[] = {NIST
fd40: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50  SP800_73_3_OID_P
fd50: 49 56 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64  IVAUTH}, piv_oid
fd60: 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b  _signature[] = {
fd70: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
fd80: 49 44 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20 70  ID_SIGNATURE}, p
fd90: 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20  iv_oid_keymgt[] 
fda0: 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
fdb0: 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09  3_OID_KEYMGT};..
fdc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
fdd0: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
fde0: 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72  gned char buffer
fdf0: 5b 38 31 39 32 5d 2c 20 2a 62 75 66 66 65 72 5f  [8192], *buffer_
fe00: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  p;..unsigned lon
fe10: 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63  g outidx = 0;..c
fe20: 68 61 72 20 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a  har *piv_label;.
fe30: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
fe40: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73  saction_ret;..ss
fe50: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
fe60: 09 73 69 7a 65 5f 74 20 62 75 66 66 65 72 5f 6c  .size_t buffer_l
fe70: 65 6e 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72  en;..int certs_r
fe80: 65 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73  esizable;..int s
fe90: 65 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f  end_ret, select_
fea0: 72 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65  ret;..int piv_ke
feb0: 79 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74  y, piv = 0;..int
fec0: 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   idx;...CACKEY_D
fed0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
fee0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f  led.");...if (co
fef0: 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  unt == NULL) {..
ff00: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ff10: 49 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e  INTF("count is N
ff20: 55 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  ULL, returning i
ff30: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
ff40: 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
ff50: 0a 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20  ...if (certs != 
ff60: 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63  NULL) {...if (*c
ff70: 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09  ount == 0) {....
ff80: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ff90: 4e 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77  NTF("Requested w
ffa0: 65 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63  e return 0 objec
ffb0: 74 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69  ts, short-circui
ffc0: 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t");.....return(
ffd0: 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  certs);...}..}..
ffe0: 09 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74  .if (!slot->slot
fff0: 5f 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28  _reset) {...if (
10000 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
10010 74 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72  ts) {....if (cer
10020 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ts == NULL) {...
10030 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
10040 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
10050 2a 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  * slot->cached_c
10060 65 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09  erts_count);....
10070 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e  .*count = slot->
10080 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
10090 6e 74 3b 0a 0a 09 09 09 7d 20 65 6c 73 65 20 7b  nt;.....} else {
100a0 0a 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20  .....if (*count 
100b0 3e 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  > slot->cached_c
100c0 65 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  erts_count) {...
100d0 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74  ...*count = slot
100e0 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ->cached_certs_c
100f0 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  ount;.....}....}
10100 0a 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79  .....cackey_copy
10110 5f 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c  _certs(certs, sl
10120 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10130 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72  , *count);.....r
10140 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09  eturn(certs);...
10150 7d 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  }..}...if (slot-
10160 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b  >cached_certs) {
10170 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
10180 65 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65  erts(slot->cache
10190 64 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63  d_certs, slot->c
101a0 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
101b0 74 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e  t, 1);....slot->
101c0 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
101d0 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67  ULL;..}.../* Beg
101e0 69 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74  in a SmartCard t
101f0 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74  ransaction */..t
10200 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d  ransaction_ret =
10210 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72   cackey_begin_tr
10220 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
10230 0a 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f  ..if (transactio
10240 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
10250 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
10260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10270 54 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e  TF("Unable begin
10280 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
10290 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
102a0 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
102b0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
102c0 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  certs == NULL) {
102d0 0a 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f  ...certs = mallo
102e0 63 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29  c(sizeof(*certs)
102f0 20 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20   * 5);...*count 
10300 3d 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73  = 5;...certs_res
10310 69 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65  izable = 1;..} e
10320 6c 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65  lse {...certs_re
10330 73 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a  sizable = 0;..}.
10340 0a 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20  ../* Select the 
10350 43 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73  CCC Applet */..s
10360 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10370 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10380 6c 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69  lot, ccc_aid, si
10390 7a 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a  zeof(ccc_aid));.
103a0 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
103b0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
103c0 4b 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49  K) {.../* Try PI
103d0 56 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f  V application */
103e0 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
103f0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
10400 65 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64  et(slot, piv_aid
10410 2c 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64  , sizeof(piv_aid
10420 29 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  ));...if (send_r
10430 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  et == CACKEY_PCS
10440 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
10450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10460 28 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20  ("We have a PIV 
10470 63 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e  card -- not usin
10480 67 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69  g the CCC, pulli
10490 6e 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20  ng pre-selected 
104a0 6b 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20  keys");.....piv 
104b0 3d 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 1;...} else {.
104c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
104d0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
104e0 6f 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70  o select CCC App
104f0 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
10500 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
10510 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d  ./* Terminate Sm
10520 61 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74  artCard Transact
10530 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
10540 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
10550 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75  (slot);.....retu
10560 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d  rn(NULL);...}..}
10570 0a 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
10580 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
10590 78 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a  x < 3; idx++) {.
105a0 09 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20  ...switch (idx) 
105b0 7b 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09  {.....case 0:...
105c0 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76  ...piv_oid = piv
105d0 5f 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09  _oid_pivauth;...
105e0 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53  ...piv_key = NIS
105f0 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
10600 50 49 56 41 55 54 48 3b 0a 09 09 09 09 09 70 69  PIVAUTH;......pi
10610 76 5f 6c 61 62 65 6c 20 3d 20 22 41 75 74 68 65  v_label = "Authe
10620 6e 74 69 63 61 74 69 6f 6e 22 3b 0a 09 09 09 09  ntication";.....
10630 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
10640 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   1:......piv_oid
10650 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61   = piv_oid_signa
10660 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ture;......piv_k
10670 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
10680 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55 52  8_3_KEY_SIGNATUR
10690 45 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65  E;......piv_labe
106a0 6c 20 3d 20 22 53 69 67 6e 61 74 75 72 65 22 3b  l = "Signature";
106b0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
106c0 09 63 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69  .case 2:......pi
106d0 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
106e0 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76  keymgt;......piv
106f0 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
10700 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54  _78_3_KEY_KEYMGT
10710 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61 62 65 6c  ;......piv_label
10720 20 3d 20 22 4b 65 79 20 4d 61 6e 61 67 65 6d 65   = "Key Manageme
10730 6e 74 22 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  nt";......break;
10740 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
10750 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10760 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10770 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10780 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10790 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
107a0 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
107b0 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
107c0 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
107d0 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
107e0 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
107f0 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
10800 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
10810 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
10820 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
10830 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
10840 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10850 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10860 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65  d->card.piv.labe
10870 6c 2c 20 70 69 76 5f 6c 61 62 65 6c 2c 20 73 74  l, piv_label, st
10880 72 6c 65 6e 28 70 69 76 5f 6c 61 62 65 6c 29 20  rlen(piv_label) 
10890 2b 20 31 29 3b 0a 0a 09 09 09 63 75 72 72 5f 69  + 1);.....curr_i
108a0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
108b0 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09  en = read_ret;..
108c0 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
108d0 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28  ficate = malloc(
108e0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
108f0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62  cate_len);.....b
10900 75 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  uffer_len = size
10910 6f 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62  of(buffer);....b
10920 75 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79  uffer_p = cackey
10930 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67  _read_bertlv_tag
10940 28 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72  (buffer, &buffer
10950 5f 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72  _len, 0x70, curr
10960 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10970 2c 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  , &curr_id->cert
10980 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10990 09 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d  ..if (buffer_p =
109a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41  = NULL) {.....CA
109b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
109c0 46 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69  F("Reading certi
109d0 66 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d  ficate from BER-
109e0 54 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69  TLV response fai
109f0 6c 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65  led, skipping ke
10a00 79 20 25 69 22 2c 20 69 64 78 29 3b 0a 09 09 09  y %i", idx);....
10a10 09 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63  .free(curr_id->c
10a20 65 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09  ertificate);....
10a30 09 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09  ..outidx--;.....
10a40 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10a50 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
10a60 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
10a70 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65  applets from the
10a80 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09   CCC's TLV */...
10a90 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
10aa0 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
10ab0 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..../* Look for 
10ac0 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
10ad0 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
10ae0 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72  applets */...for
10af0 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
10b00 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
10b10 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
10b20 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
10b30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10b40 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
10b50 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45   %s ... ", CACKE
10b60 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
10b70 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10b80 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20  ->tag));.....if 
10b90 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
10ba0 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
10bb0 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  URL) {.....CACKE
10bc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10bd0 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
10be0 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
10bf0 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
10c00 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10c10 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
10c20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10c30 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10c40 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
10c50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
10c60 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
10c70 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10c80 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10c90 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10ca0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50  nly care about P
10cb0 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73  KI applets, this
10cc0 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73   applet supports
10cd0 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43  : %s/%02x)", CAC
10ce0 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
10cf0 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63  PPTYPE_TO_STR(cc
10d00 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10d10 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c  rdurl->apptype),
10d20 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
10d30 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10d40 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
10d50 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10d60 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
10d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
10d80 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
10d90 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10da0 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
10db0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10dc0 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
10dd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10de0 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
10df0 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
10e00 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
10e10 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10e20 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
10e30 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
10e40 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
10e50 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10e60 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43  ->appid);....CAC
10e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10e80 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
10e90 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
10ea0 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
10eb0 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
10ec0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10ed0 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
10ee0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
10ef0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10f00 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
10f10 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
10f20 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  id, ccc_curr->va
10f30 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
10f40 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
10f50 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10f60 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72  ->rid));....curr
10f70 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
10f80 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
10f90 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10fa0 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
10fb0 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75  8) & 0xff;....cu
10fc0 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
10fd0 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
10fe0 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
10ff0 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
11000 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  0xff;...../* Sel
11010 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
11020 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63   ... */....selec
11030 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
11040 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
11050 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
11060 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a  eof(curr_aid));.
11070 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
11080 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
11090 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
110a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
110b0 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
110c0 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
110d0 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
110e0 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
110f0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11100 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20  ...}...../* ... 
11110 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
11120 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  ) */....select_r
11130 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
11140 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63  ct_file(slot, cc
11150 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
11160 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
11170 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f  ;....if (select_
11180 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
11190 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43  SC_S_OK) {.....C
111a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
111b0 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
111c0 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
111d0 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
111e0 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
111f0 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
11200 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63  ...}...../* Proc
11210 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
11220 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
11230 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
11240 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63  ...app_tlv = cac
11250 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
11260 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70  t);......for (ap
11270 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
11280 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
11290 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
112a0 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41  >_next) {.....CA
112b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
112c0 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
112d0 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
112e0 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
112f0 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
11300 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72  .....if (app_cur
11310 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
11320 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29  TAG_CERTIFICATE)
11330 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
11340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
11350 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
11360 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
11370 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
11380 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  ");.......contin
11390 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
113a0 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b  urr_id = &certs[
113b0 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74  outidx];.....out
113c0 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72  idx++;......curr
113d0 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
113e0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
113f0 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  C;.....memcpy(cu
11400 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11410 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
11420 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
11430 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
11440 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  t));.....curr_id
11450 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ->card.cac.file 
11460 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
11470 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
11480 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
11490 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
114a0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
114b0 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
114c0 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  g curr_id->card.
114d0 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20  cac.applet (%p) 
114e0 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
114f0 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
11500 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73  cac.applet, (uns
11510 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
11520 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
11530 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
11540 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11550 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
11560 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
11570 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
11580 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
11590 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  cac.applet));...
115a0 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
115b0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
115c0 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
115d0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
115e0 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
115f0 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
11600 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
11610 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
11620 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61  ->certificate, a
11630 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20  pp_curr->value, 
11640 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
11650 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
11660 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
11670 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20  ount) {......if 
11680 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
11690 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74  ) {.......*count
116a0 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 63 65 72   *= 2;.......cer
116b0 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
116c0 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
116d0 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
116e0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
116f0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
11700 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  }.....}....}....
11710 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
11720 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69  (app_tlv);.....i
11730 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
11740 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
11750 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  ;....}...}....ca
11760 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63  ckey_free_tlv(cc
11770 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f  c_tlv);..}...*co
11780 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
11790 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
117a0 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
117b0 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
117c0 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
117d0 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
117e0 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  .slot->cached_ce
117f0 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70  rts = cackey_cop
11800 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65  y_certs(NULL, ce
11810 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73  rts, *count);..s
11820 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
11830 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74  s_count = *count
11840 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
11850 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
11860 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
11870 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
11880 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
11890 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
118a0 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
118b0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
118c0 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
118d0 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
118e0 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
118f0 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
11900 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
11910 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
11920 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
11930 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
11940 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
11950 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
11960 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
11970 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
11980 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
11990 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
119a0 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
119b0 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
119c0 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
119d0 75 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79  utput) {..cackey
119e0 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64  _pcsc_id_type id
119f0 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
11a00 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f 74   char dyn_auth_t
11a10 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a 09 75 6e  emplate[10];..un
11a20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
11a30 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20  buf, *tmpbuf_s, 
11a40 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f 75 74 62  *outbuf_s, *outb
11a50 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  uf_p;..unsigned 
11a60 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73 65  char bytes_to_se
11a70 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09  nd, p1, class;..
11a80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 6c  unsigned char bl
11a90 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  ocktype;..cackey
11aa0 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  _ret send_ret;..
11ab0 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
11ac0 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74 76  e;..ssize_t retv
11ad0 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66  al = 0, unpadoff
11ae0 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70  set;..size_t tmp
11af0 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20  buflen, padlen, 
11b00 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c 20 6f 75  tmpoutbuflen, ou
11b10 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66  tbuf_len;..int f
11b20 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
11b30 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41 43 4b 45  .int le;...CACKE
11b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11b50 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
11b60 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (slot == NULL) {
11b70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11b80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11b90 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  slot is NULL");.
11ba0 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11bb0 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d 3d 20 4e  }...if (buf == N
11bc0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
11bd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
11be0 72 6f 72 2e 20 20 62 75 66 20 69 73 20 4e 55 4c  ror.  buf is NUL
11bf0 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11c00 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 6f 75 74  1);..}...if (out
11c10 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  buf == NULL) {..
11c20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11c30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 6f 75  INTF("Error.  ou
11c40 74 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  tbuf is NULL");.
11c50 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
11c60 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  }...if (identity
11c70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
11c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11c90 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74  F("Error.  ident
11ca0 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
11cb0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
11cc0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11cd0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  >pcsc_identity =
11ce0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11cf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11d00 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74  "Error.  identit
11d10 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11d20 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11d30 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11d40 69 64 5f 74 79 70 65 20 3d 20 69 64 65 6e 74 69  id_type = identi
11d50 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11d60 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09 69 66 20  y->id_type;..if 
11d70 28 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43 4b  (id_type == CACK
11d80 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
11d90 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ONLY) {...CACKEY
11da0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11db0 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11dc0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11dd0 73 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  s CACKEY_ID_TYPE
11de0 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77 68 69 63  _CERT_ONLY, whic
11df0 68 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  h cannot be used
11e00 20 66 6f 72 20 73 69 67 6e 2f 64 65 63 72 79 70   for sign/decryp
11e10 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  t");....return(-
11e20 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
11e30 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61  (id_type) {...ca
11e40 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11e50 45 5f 50 49 56 3a 0a 09 09 63 61 73 65 20 43 41  E_PIV:...case CA
11e60 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11e70 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64 65  :....break;...de
11e80 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59  fault:....CACKEY
11e90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11ea0 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d  rror.  identity-
11eb0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69  >pcsc_identity i
11ec0 73 20 6e 6f 74 20 61 20 73 75 70 70 6f 72 74 65  s not a supporte
11ed0 64 20 76 61 6c 75 65 2e 20 54 79 70 65 20 69 73  d value. Type is
11ee0 3a 20 30 78 25 6c 78 20 28 50 49 56 20 3d 20 30  : 0x%lx (PIV = 0
11ef0 78 25 6c 78 2c 20 43 41 43 20 3d 20 30 78 25 6c  x%lx, CAC = 0x%l
11f00 78 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  x)", (unsigned l
11f10 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c 20 28 75  ong) id_type, (u
11f20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11f30 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56  CKEY_ID_TYPE_PIV
11f40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
11f50 29 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  ) CACKEY_ID_TYPE
11f60 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65 74 75 72  _CAC);.....retur
11f70 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  n(-1);..}.../* D
11f80 65 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74  etermine identit
11f90 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69  y Key size */..i
11fa0 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
11fb0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
11fc0 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65  ize < 0) {...ide
11fd0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11fe0 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20  tity->keysize = 
11ff0 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28  x509_to_keysize(
12000 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12010 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
12020 63 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  cate, identity->
12030 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
12040 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
12050 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73  ..}.../* Pad mes
12060 73 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65  sage to key size
12070 20 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75   */..if (padInpu
12080 74 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  t) {...if (ident
12090 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69  ity->pcsc_identi
120a0 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29  ty->keysize > 0)
120b0 20 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e   {....if (buflen
120c0 20 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63   != identity->pc
120d0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
120e0 73 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28  size) {.....if (
120f0 62 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69  buflen > (identi
12100 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12110 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29  y->keysize + 3))
12120 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
12130 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
12140 6f 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20  or.  Message is 
12150 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67  too large to sig
12160 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09  n/decrypt");....
12170 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12180 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66  ...}......tmpbuf
12190 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
121a0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
121b0 65 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62  eysize;.....tmpb
121c0 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62  uf = malloc(tmpb
121d0 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65  uflen);.....free
121e0 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09  _tmpbuf = 1;....
121f0 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75  ..padlen = tmpbu
12200 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20  flen - buflen - 
12210 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50  3;....../* RSA P
12220 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31  KCS#1 EMSA-PKCS1
12230 2d 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f  -v1_5 Padding */
12240 0a 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d  .....tmpbuf[0] =
12250 20 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75   0x00;.....tmpbu
12260 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09  f[1] = 0x01;....
12270 09 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b  .memset(&tmpbuf[
12280 32 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e  2], 0xFF, padlen
12290 29 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61  );.....tmpbuf[pa
122a0 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b  dlen + 2]= 0x00;
122b0 0a 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70  .....memcpy(&tmp
122c0 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c  buf[padlen + 3],
122d0 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a   buf, buflen);..
122e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
122f0 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64  _PRINTBUF("Unpad
12300 64 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c  ded:", buf, bufl
12310 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f  en);.....CACKEY_
12320 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
12330 50 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66  Padded:", tmpbuf
12340 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09  , tmpbuflen);...
12350 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d  .} else {.....tm
12360 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09  pbuf = buf;.....
12370 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c  tmpbuflen = bufl
12380 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  en;.....free_tmp
12390 62 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64  buf = 0;.....pad
123a0 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09  len = 0;....}...
123b0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
123c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
123d0 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72  "Unable to deter
123e0 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68  mine key size, h
123f0 6f 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67  oping the messag
12400 65 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61  e is properly pa
12410 64 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70  dded!");.....tmp
12420 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d  buf = buf;....tm
12430 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
12440 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  ;....free_tmpbuf
12450 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20   = 0;....padlen 
12460 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  = 0;...}..} else
12470 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75   {...tmpbuf = bu
12480 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  f;...tmpbuflen =
12490 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f   buflen;...free_
124a0 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61  tmpbuf = 0;...pa
124b0 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f  dlen = 0;..}.../
124c0 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74  * Begin transact
124d0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62  ion */..cackey_b
124e0 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
124f0 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c  (slot);.../* Sel
12500 65 63 74 20 63 6f 72 72 65 63 74 20 61 70 70 6c  ect correct appl
12510 65 74 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69  et */..switch (i
12520 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  d_type) {...case
12530 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12540 43 41 43 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44  CAC:....CACKEY_D
12550 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c  EBUG_PRINTF("Sel
12560 65 63 74 69 6e 67 20 61 70 70 6c 65 74 20 66 6f  ecting applet fo
12570 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e 22 2c 20  und at %p ...", 
12580 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12590 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
125a0 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09 09 63 61  c.applet);....ca
125b0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
125c0 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  et(slot, identit
125d0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
125e0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
125f0 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e 74 69  t, sizeof(identi
12600 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12610 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
12620 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  et));...../* Sel
12630 65 63 74 20 63 6f 72 72 65 63 74 20 66 69 6c 65  ect correct file
12640 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   */....cackey_se
12650 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20  lect_file(slot, 
12660 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12670 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 63 61  dentity->card.ca
12680 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62 72 65 61  c.file);....brea
12690 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  k;...case CACKEY
126a0 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
126b0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
126c0 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a 09 09  te[0] = 0x7C;...
126d0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
126e0 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09 09  te[1] = 0x82;...
126f0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12700 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66  te[2] = ((tmpbuf
12710 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30  len + 6) & 0xff0
12720 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79 6e 5f  0) >> 8;....dyn_
12730 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d  auth_template[3]
12740 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20   = (tmpbuflen + 
12750 36 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 09  6) & 0x00ff;....
12760 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12770 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[4] = 0x82;....
12780 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
12790 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09  e[5] = 0x00;....
127a0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
127b0 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a 09 09 09  e[6] = 0x81;....
127c0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
127d0 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09  e[7] = 0x82;....
127e0 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74  dyn_auth_templat
127f0 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65  e[8] = (tmpbufle
12800 6e 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  n & 0xff00) >> 8
12810 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
12820 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74 6d 70 62  mplate[9] = tmpb
12830 75 66 6c 65 6e 20 26 20 30 78 30 30 66 66 3b 0a  uflen & 0x00ff;.
12840 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
12850 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
12860 73 6c 6f 74 2c 20 30 78 31 30 2c 20 4e 49 53 54  slot, 0x10, NIST
12870 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
12880 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50  _GENAUTH, NISTSP
12890 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53  800_78_3_ALGO_RS
128a0 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d  A2048, identity-
128b0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
128c0 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c  card.piv.key_id,
128d0 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75 74 68   sizeof(dyn_auth
128e0 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79 6e 5f  _template), dyn_
128f0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c 20 30  auth_template, 0
12900 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  x00, NULL, NULL,
12910 20 4e 55 4c 4c 29 3b 0a 09 09 09 62 72 65 61 6b   NULL);....break
12920 3b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ;...case CACKEY_
12930 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
12940 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
12950 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70  ..tmpbuf_s = tmp
12960 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d  buf;..outbuf_s =
12970 20 6f 75 74 62 75 66 3b 0a 09 77 68 69 6c 65 20   outbuf;..while 
12980 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09  (tmpbuflen) {...
12990 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20 3d 20 6f  tmpoutbuflen = o
129a0 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09 69 66 20  utbuflen;....if 
129b0 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
129c0 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
129d0 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  ...bytes_to_send
129e0 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d   = CACKEY_APDU_M
129f0 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  TU;...} else {..
12a00 09 09 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20  ..bytes_to_send 
12a10 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 7d  = tmpbuflen;...}
12a20 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 43  ....send_ret = C
12a30 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
12a40 45 52 49 43 3b 0a 09 09 73 77 69 74 63 68 20 28  ERIC;...switch (
12a50 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  id_type) {....ca
12a60 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12a70 45 5f 43 41 43 3a 0a 09 09 09 09 69 66 20 28 74  E_CAC:.....if (t
12a80 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45  mpbuflen > CACKE
12a90 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09  Y_APDU_MTU) {...
12aa0 09 09 09 70 31 20 3d 20 30 78 38 30 3b 0a 09 09  ...p1 = 0x80;...
12ab0 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
12ac0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
12ad0 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 09  p1 = 0x00;......
12ae0 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d  le = 0x00;.....}
12af0 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65 74 20 3d  ......send_ret =
12b00 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
12b10 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
12b20 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46  ASS_GLOBAL_PLATF
12b30 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  ORM, GSCIS_INSTR
12b40 5f 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31  _SIGNDECRYPT, p1
12b50 2c 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f  , 0x00, bytes_to
12b60 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c  _send, tmpbuf, l
12b70 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75  e, &respcode, ou
12b80 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66  tbuf, &tmpoutbuf
12b90 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  len);.....break;
12ba0 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
12bb0 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
12bc0 09 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e  .if (tmpbuflen >
12bd0 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
12be0 29 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  ) {......class =
12bf0 20 30 78 31 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x10;......le =
12c00 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
12c10 65 20 7b 0a 09 09 09 09 09 63 6c 61 73 73 20 3d  e {......class =
12c20 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
12c30 37 38 31 36 3b 0a 09 09 09 09 09 6c 65 20 3d 20  7816;......le = 
12c40 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  256;.....}......
12c50 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12c60 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12c70 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50 38  , class, NISTSP8
12c80 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45  00_73_3_INSTR_GE
12c90 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30  NAUTH, NISTSP800
12ca0 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30  _78_3_ALGO_RSA20
12cb0 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  48, identity->pc
12cc0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
12cd0 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 62 79  d.piv.key_id, by
12ce0 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70  tes_to_send, tmp
12cf0 62 75 66 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f  buf, le, &respco
12d00 64 65 2c 20 6f 75 74 62 75 66 2c 20 26 74 6d 70  de, outbuf, &tmp
12d10 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  outbuflen);.....
12d20 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
12d30 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12d40 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
12d50 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ak;...}....if (s
12d60 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
12d70 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
12d80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12d90 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
12da0 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
12db0 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
12dc0 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  .");.....if (fre
12dd0 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
12de0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
12df0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
12e00 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
12e10 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
12e20 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
12e30 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
12e40 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
12e50 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
12e60 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43  x6982) {.....CAC
12e70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12e80 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
12e90 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
12ea0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45  .  Returning NEE
12eb0 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63  DLOGIN");......c
12ec0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
12ed0 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09  reset(slot);....
12ee0 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
12ef0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
12f00 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
12f10 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
12f20 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
12f30 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
12f40 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
12f50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
12f60 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
12f70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
12f80 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
12f90 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
12fa0 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  NT");......cacke
12fb0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
12fc0 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65  t(slot);......re
12fd0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
12fe0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
12ff0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
13000 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  (-1);...}....tmp
13010 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
13020 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
13030 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
13040 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
13050 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
13060 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
13070 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
13080 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
13090 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
130a0 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
130b0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
130c0 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
130d0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
130e0 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
130f0 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
13100 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
13110 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
13120 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
13130 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
13140 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
13150 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
13160 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
13170 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
13180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13190 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
131a0 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
131b0 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
131c0 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
131d0 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
131e0 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
131f0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
13200 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
13210 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
13220 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
13230 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
13240 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
13250 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
13260 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
13270 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 73 77  signature */..sw
13280 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
13290 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
132a0 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 6f  D_TYPE_PIV:....o
132b0 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76  utbuf_len = retv
132c0 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20  al;....outbuf_p 
132d0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65  = cackey_read_be
132e0 72 74 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c  rtlv_tag(outbuf,
132f0 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78   &outbuf_len, 0x
13300 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62  7C, NULL,  &outb
13310 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  uf_len);....if (
13320 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c  outbuf_p == NULL
13330 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
13340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
13350 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
13360 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
13370 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
13380 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72  ot a 0x7C tag, r
13390 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
133a0 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ure");......retu
133b0 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  rn(-1);....}....
133c0 09 72 65 74 76 61 6c 20 3d 20 6f 75 74 62 75 66  .retval = outbuf
133d0 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74 62 75 66  _len;.....outbuf
133e0 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a 09  _len = retval;..
133f0 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61 63  ..outbuf_p = cac
13400 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76 5f  key_read_bertlv_
13410 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75 74  tag(outbuf, &out
13420 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32 2c 20 4e  buf_len, 0x82, N
13430 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c 65  ULL,  &outbuf_le
13440 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62 75  n);....if (outbu
13450 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f_p == NULL) {..
13460 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13470 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73 65  PRINTF("Response
13480 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47 45   from PIV for GE
13490 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49 43  NERATE AUTHENTIC
134a0 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61 20  ATION was not a 
134b0 30 78 38 32 20 77 69 74 68 20 74 68 65 6e 20 30  0x82 with then 0
134c0 78 37 43 20 74 61 67 2c 20 72 65 74 75 72 6e 69  x7C tag, returni
134d0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
134e0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
134f0 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 76 61  ;....}.....retva
13500 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a  l = outbuf_len;.
13510 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
13520 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
13530 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43  _CAC:...case CAC
13540 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54  KEY_ID_TYPE_CERT
13550 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b  _ONLY:....break;
13560 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72  ..}.../* Unpad r
13570 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70  eply */..if (unp
13580 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66  adOutput) {...if
13590 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a   (retval < 3) {.
135a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
135b0 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73  PRINTF("Reply is
135c0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61   too small, we a
135d0 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75  re not able to u
135e0 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20  npad -- passing 
135f0 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20  back and hoping 
13600 66 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b  for the best!");
13610 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
13620 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
13630 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
13640 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
13650 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
13660 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e  tval);....return
13670 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09  (retval);...}...
13680 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21  .if (outbuf[0] !
13690 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43  = 0x00) {....CAC
136a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
136b0 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70  ("Unrecognized p
136c0 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d  adding scheme --
136d0 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e   passing back an
136e0 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65  d hoping for the
136f0 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41   best!");.....CA
13700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13710 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
13720 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
13730 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
13740 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
13750 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
13760 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74  );...}....blockt
13770 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b  ype = outbuf[1];
13780 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d  ...unpadoffset =
13790 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62   0;....switch (b
137a0 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63  locktype) {....c
137b0 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a  ase 0x00:...../*
137c0 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
137d0 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e  1, the first non
137e0 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68  -zero byte is th
137f0 65 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20  e start of data 
13800 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61  */.....for (unpa
13810 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70  doffset = 2; unp
13820 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61  adoffset < retva
13830 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b  l; unpadoffset++
13840 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74  ) {......if (out
13850 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d  buf[unpadoffset]
13860 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09   != 0x00) {.....
13870 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
13880 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b  ....}.....break;
13890 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09  ....case 0x01:..
138a0 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63  .../* Padding Sc
138b0 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65  heme 2, pad byte
138c0 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f  s are 0xFF follo
138d0 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09  wed by 0x00 */..
138e0 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
138f0 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
13900 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
13910 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
13920 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
13930 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
13940 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66  0xFF) {.......if
13950 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
13960 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
13970 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  ........unpadoff
13980 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62  set++;.........b
13990 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c  reak;.......} el
139a0 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b  se {........CACK
139b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
139c0 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
139d0 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
139e0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
139f0 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
13a00 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30  een 0x00 found 0
13a10 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
13a20 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
13a30 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
13a40 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13a50 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20  .......}......} 
13a60 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43  else {.......CAC
13a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13a80 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e  ("Invalid paddin
13a90 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65  g data found, re
13aa0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
13ab0 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20  re, should have 
13ac0 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20  been 0xFF found 
13ad0 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e  0x%02x", (unsign
13ae0 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75  ed int) outbuf[u
13af0 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09  npadoffset]);...
13b00 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
13b10 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
13b20 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
13b30 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61   0x02:...../* Pa
13b40 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20  dding Scheme 3, 
13b50 70 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f  pad bytes are no
13b60 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72  n-zero first zer
13b70 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20  o byte found is 
13b80 74 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79  the seperator by
13b90 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  te */.....for (u
13ba0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
13bb0 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
13bc0 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
13bd0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
13be0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
13bf0 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09  et] == 0x00) {..
13c00 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74  .....unpadoffset
13c10 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ++;........break
13c20 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09  ;......}.....}..
13c30 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09  ...break;...}...
13c40 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74  .if (unpadoffset
13c50 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09   > retval) {....
13c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13c70 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61  NTF("Offset grea
13c80 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73  ter than reply s
13c90 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20  ize, aborting.  
13ca0 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25  (unpadoffset = %
13cb0 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75  lu, retval = %lu
13cc0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
13cd0 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  ng) unpadoffset,
13ce0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
13cf0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65   retval);.....re
13d00 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
13d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13d20 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22  INTBUF("Padded:"
13d30 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c  , outbuf, retval
13d40 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20  );....retval -= 
13d50 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d  unpadoffset;...m
13d60 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f  emmove(outbuf, o
13d70 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66  utbuf + unpadoff
13d80 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09  set, retval);...
13d90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13da0 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64  INTBUF("Unpadded
13db0 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
13dc0 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45  al);..}....CACKE
13dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13de0 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
13df0 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25  cess, retval = %
13e00 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f  li (bytes)", (lo
13e10 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  ng) retval);...r
13e20 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
13e30 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
13e40 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13e50 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
13e60 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
13e70 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
13e80 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
13e90 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13ea0 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
13eb0 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69  _ret cackey_logi
13ec0 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
13ed0 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
13ee0 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20  gned char *pin, 
13ef0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69  unsigned long pi
13f00 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65  n_len, int *trie
13f10 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
13f20 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
13f30 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
13f40 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
13f50 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
13f60 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
13f70 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
13f80 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
13f90 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
13fa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
13fb0 5f 63 65 72 74 73 3b 0a 09 75 69 6e 74 31 36 5f  _certs;..uint16_
13fc0 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 3b  t response_code;
13fd0 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61  ..int tries_rema
13fe0 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e 64  ining;..int send
13ff0 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f 72  _ret;..int key_r
14000 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30 3b  eference = 0x00;
14010 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20 74  .../* Indicate t
14020 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  hat we do not kn
14030 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61 6e  ow about how man
14040 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d 61  y tries are rema
14050 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74 72  ining */..if (tr
14060 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
14070 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d 61   {...*tries_rema
14080 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d  ining_p = -1;..}
14090 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c 79  .../* Apparently
140a0 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20 2a  , CAC PINs are *
140b0 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65 73  EXACTLY* 8 bytes
140c0 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69 74   long -- pad wit
140d0 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73 68  h 0xFF if too sh
140e0 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e 5f  ort */..if (pin_
140f0 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d 65  len >= 8) {...me
14100 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69  mcpy(cac_pin, pi
14110 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  n, 8);..} else {
14120 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69  ...memcpy(cac_pi
14130 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29  n, pin, pin_len)
14140 3b 0a 09 7d 0a 0a 09 2f 2a 20 52 65 6a 65 63 74  ;..}.../* Reject
14150 20 50 49 4e 73 20 77 68 69 63 68 20 61 72 65 20   PINs which are 
14160 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
14170 20 28 70 69 6e 5f 6c 65 6e 20 3c 20 35 29 20 7b   (pin_len < 5) {
14180 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14190 50 52 49 4e 54 46 28 22 52 65 6a 65 63 74 69 6e  PRINTF("Rejectin
141a0 67 20 50 49 4e 20 77 68 69 63 68 20 69 73 20 74  g PIN which is t
141b0 6f 6f 20 73 68 6f 72 74 20 28 6c 65 6e 67 74 68  oo short (length
141c0 20 3d 20 25 6c 75 2c 20 6d 75 73 74 20 62 65 20   = %lu, must be 
141d0 61 74 6c 65 61 73 74 20 35 29 22 2c 20 70 69 6e  atleast 5)", pin
141e0 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
141f0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42  (CACKEY_PCSC_E_B
14200 41 44 50 49 4e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ADPIN);..}.../* 
14210 50 49 56 20 61 75 74 68 65 6e 74 69 63 61 74 69  PIV authenticati
14220 6f 6e 20 75 73 65 73 20 61 20 22 6b 65 79 5f 72  on uses a "key_r
14230 65 66 65 72 65 6e 63 65 22 20 6f 66 20 30 78 38  eference" of 0x8
14240 30 20 2a 2f 0a 09 70 63 73 63 5f 69 64 65 6e 74  0 */..pcsc_ident
14250 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
14260 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20  ead_certs(slot, 
14270 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73  NULL, &num_certs
14280 29 3b 0a 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  );..if (num_cert
14290 73 20 3e 20 30 20 26 26 20 70 63 73 63 5f 69 64  s > 0 && pcsc_id
142a0 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
142b0 29 20 7b 0a 09 09 73 77 69 74 63 68 20 28 70 63  ) {...switch (pc
142c0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 30 5d  sc_identities[0]
142d0 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
142e0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
142f0 50 45 5f 50 49 56 3a 0a 09 09 09 09 43 41 43 4b  PE_PIV:.....CACK
14300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14310 22 57 65 20 72 65 63 65 6e 74 6c 79 20 68 61 64  "We recently had
14320 20 61 20 50 49 56 20 63 61 72 64 2c 20 73 6f 20   a PIV card, so 
14330 77 65 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  we will attempt 
14340 74 6f 20 61 75 74 68 65 6e 74 69 63 61 74 65 20  to authenticate 
14350 75 73 69 6e 67 20 74 68 65 20 50 49 56 20 41 70  using the PIV Ap
14360 70 6c 69 63 61 74 69 6f 6e 20 6b 65 79 20 72 65  plication key re
14370 66 65 72 65 6e 63 65 22 29 3b 0a 0a 09 09 09 09  ference");......
14380 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20  key_reference = 
14390 30 78 38 30 3b 0a 09 09 09 09 62 72 65 61 6b 3b  0x80;.....break;
143a0 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09  ....default:....
143b0 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a  .break;...}..}..
143c0 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
143d0 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
143e0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
143f0 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
14400 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
14410 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
14420 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65  FY, 0x00, key_re
14430 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28  ference, sizeof(
14440 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
14450 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  n, 0x00, &respon
14460 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
14470 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
14480 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
14490 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
144a0 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65   ((response_code
144b0 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20 30 78   & 0x63C0) == 0x
144c0 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69 65 73  63C0) {....tries
144d0 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28 72 65  _remaining = (re
144e0 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
144f0 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  F);.....CACKEY_D
14500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
14510 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
14520 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73 20 72  iled, %i tries r
14530 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69 65 73  emaining", tries
14540 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 09 09  _remaining);....
14550 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69  .if (tries_remai
14560 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09 2a 74  ning_p) {.....*t
14570 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
14580 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69   = tries_remaini
14590 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  ng;....}.....ret
145a0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
145b0 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d 0a 0a  E_BADPIN);...}..
145c0 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65 5f 63  ..if (response_c
145d0 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29 20 7b  ode == 0x6983) {
145e0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
145f0 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72  _PRINTF("PIN Ver
14600 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64  ification failed
14610 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f 63 6b  , device is lock
14620 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ed");.....return
14630 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c  (CACKEY_PCSC_E_L
14640 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09 09 72  OCKED);...}....r
14650 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
14660 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
14670 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14680 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
14690 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64  fication succeed
146a0 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  ed");...return(C
146b0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
146c0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
146d0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
146e0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
146f0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
14700 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
14710 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
14720 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
14730 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
14740 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 74  key_ret cackey_t
14750 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73 74 72  oken_present(str
14760 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
14770 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79  *slot) {..cackey
14780 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63  _ret pcsc_connec
14790 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 72 65  t_ret;..DWORD re
147a0 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20 73 74  ader_len = 0, st
147b0 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f 63 6f  ate = 0, protoco
147c0 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e 3b 0a  l = 0, atr_len;.
147d0 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f 41 54  .BYTE atr[MAX_AT
147e0 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47 20 73  R_SIZE];..LONG s
147f0 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61 72 64  tatus_ret, scard
14800 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  _reconn_ret;...C
14810 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14820 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
14830 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72  .if (slot->inter
14840 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  nal) {...CACKEY_
14850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
14860 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
14870 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61 6c 20  esent (internal 
14880 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72 65 74  token)");....ret
14890 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
148a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b  S_TOKENPRESENT);
148b0 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65  ..}...pcsc_conne
148c0 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
148d0 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
148e0 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f  t);..if (pcsc_co
148f0 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
14900 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
14910 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14920 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
14930 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  o connect to car
14940 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
14950 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09  en absent");....
14960 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14970 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
14980 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
14990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
149a0 6c 69 6e 67 20 53 43 61 72 64 53 74 61 74 75 73  ling SCardStatus
149b0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
149c0 63 61 72 64 20 73 74 61 74 75 73 22 29 3b 0a 0a  card status");..
149d0 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  .atr_len = sizeo
149e0 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f  f(atr);..status_
149f0 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75  ret = SCardStatu
14a00 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  s(slot->pcsc_car
14a10 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72  d, NULL, &reader
14a20 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70  _len, &state, &p
14a30 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61  rotocol, atr, &a
14a40 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73  tr_len);...if (s
14a50 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
14a60 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e  RD_E_INVALID_HAN
14a70 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  DLE) {...CACKEY_
14a80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
14a90 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74 75  ardStatus() retu
14aa0 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56  rned SCARD_E_INV
14ab0 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72  ALID_HANDLE, mar
14ac0 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65  king is not alre
14ad0 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e  ady connected an
14ae0 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29  d trying again")
14af0 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ;...cackey_mark_
14b00 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
14b10 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63  ;....pcsc_connec
14b20 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
14b30 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
14b40 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f  );...if (pcsc_co
14b50 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43  nnect_ret != CAC
14b60 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
14b70 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14b80 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
14b90 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61  to connect to ca
14ba0 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
14bb0 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
14bc0 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
14bd0 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
14be0 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  NT);...}....CACK
14bf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14c00 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64 53 74  "Calling SCardSt
14c10 61 74 75 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  atus() again");.
14c20 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
14c30 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74 61 74  eof(atr);...stat
14c40 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
14c50 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
14c60 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
14c70 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
14c80 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
14c90 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   &atr_len);..}..
14ca0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
14cb0 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
14cc0 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  SS) {...cackey_m
14cd0 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
14ce0 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73 74 61  lot);....if (sta
14cf0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
14d00 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b  _W_RESET_CARD) {
14d10 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
14d20 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72  _PRINTF("Reset r
14d30 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20  equired, please 
14d40 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73  hold...");.....s
14d50 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
14d60 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  = cackey_reconne
14d70 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43  ct_card(slot, SC
14d80 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
14d90 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
14da0 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  _T1, &protocol);
14db0 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
14dc0 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
14dd0 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
14de0 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
14df0 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
14e00 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
14e10 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f 2a 20  otocol;....../* 
14e20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74 72 61  Re-establish tra
14e30 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69 74 20  nsaction, if it 
14e40 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 09  was present */..
14e50 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
14e60 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
14e70 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f 74 2d   0) {......slot-
14e80 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
14e90 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f 74 2d  th--;......slot-
14ea0 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
14eb0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09  d_hw_lock = 1;..
14ec0 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  ....cackey_begin
14ed0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
14ee0 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  t);.....}......C
14ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14f00 54 46 28 22 52 65 73 65 74 20 73 75 63 63 65 73  TF("Reset succes
14f10 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69 6e 67  sful, requerying
14f20 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73 5f 72  ");.....status_r
14f30 65 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73  et = SCardStatus
14f40 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
14f50 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f  , NULL, &reader_
14f60 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72  len, &state, &pr
14f70 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74  otocol, atr, &at
14f80 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66 20 28  r_len);.....if (
14f90 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
14fa0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
14fb0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14fc0 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69 6c 6c  UG_PRINTF("Still
14fd0 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79   unable to query
14fe0 20 63 61 72 64 20 73 74 61 74 75 73 2c 20 72 65   card status, re
14ff0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
15000 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74  sent.  SCardStat
15010 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b  us() = %s", CACK
15020 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
15030 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74  ARDERR_TO_STR(st
15040 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09  atus_ret));.....
15050 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15060 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
15070 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
15080 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
15090 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
150a0 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f 6e 6e  Unable to reconn
150b0 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
150c0 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
150d0 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63 6f 6e  ent.  SCardRecon
150e0 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20 43 41  nect() = %s", CA
150f0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
15100 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
15110 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
15120 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ));......return(
15130 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
15140 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d  KENABSENT);....}
15150 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
15160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15170 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 71 75  TF("Unable to qu
15180 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c  ery card status,
15190 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
151a0 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53   absent.  SCardS
151b0 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43  tatus() = %s", C
151c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
151d0 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
151e0 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a  (status_ret));..
151f0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
15200 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
15210 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ENT);...}..}...i
15220 66 20 28 28 73 74 61 74 65 20 26 20 53 43 41 52  f ((state & SCAR
15230 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53 43 41  D_ABSENT) == SCA
15240 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09 09 43  RD_ABSENT) {...C
15250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15260 54 46 28 22 43 61 72 64 20 69 73 20 61 62 73 65  TF("Card is abse
15270 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  nt, returning to
15280 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09  ken absent");...
15290 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
152a0 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
152b0 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
152c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
152d0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 70 72  turning token pr
152e0 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65 74 75  esent.");...retu
152f0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
15300 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 3b 0a  _TOKENPRESENT);.
15310 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
15320 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
15330 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
15340 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
15350 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
15360 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
15370 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
15380 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
15390 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  _t cackey_pcsc_i
153a0 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
153b0 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
153c0 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  csc_identity *id
153d0 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
153e0 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62 75 66   char *label_buf
153f0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
15400 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29 20 7b  label_buf_len) {
15410 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
15420 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
15430 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f 61 73  ..void *label_as
15440 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72 74 69  n1;..void *certi
15450 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78 35 30  ficate;..int x50
15460 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09 63 65  9_read_ret;...ce
15470 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
15480 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
15490 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
154a0 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
154b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
154c0 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
154d0 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  te_len < 0) {...
154e0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
154f0 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d  .x509_read_ret =
15500 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74   x509_to_subject
15510 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
15520 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 28  rtificate_len, (
15530 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65 6c 5f  void **) &label_
15540 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35 30 39  asn1);..if (x509
15550 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
15560 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
15570 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65  }...x509_read_re
15580 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73  t = x509_dn_to_s
15590 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31  tring(label_asn1
155a0 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c  , x509_read_ret,
155b0 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f   (char *) label_
155c0 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c  buf, label_buf_l
155d0 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66 20 28  en, "CN");..if (
155e0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
155f0 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72 65 61   0) {...x509_rea
15600 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
15610 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
15620 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
15630 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
15640 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
15650 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a  uf_len, NULL);..
15660 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
15670 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 72  ret <= 0) {....r
15680 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09  eturn(-1);...}..
15690 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
156a0 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
156b0 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
156c0 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f 72 65  MAX..if (x509_re
156d0 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49 58 5f  ad_ret > _POSIX_
156e0 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
156f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15700 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f 72 65  TF("x509_read_re
15710 74 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75  t exceeds maximu
15720 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69  m value, returni
15730 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28  ng in failure. (
15740 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30 39 5f  max = %li, x509_
15750 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75 29 22  read_ret = %lu)"
15760 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f  , (long) _POSIX_
15770 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69  SSIZE_MAX, (unsi
15780 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30 39 5f  gned long) x509_
15790 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09 72 65  read_ret);....re
157a0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
157b0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 72  endif.#endif...r
157c0 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61 64 5f  eturn(x509_read_
157d0 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ret);.}../* Retu
157e0 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73  rns 0 on success
157f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63   */.static int c
15800 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
15810 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65 78 29  te(void **mutex)
15820 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74 65   {..pthread_mute
15830 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75 74  x_t *pthread_mut
15840 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61 64  ex;..int pthread
15850 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20  _retval;..CK_RV 
15860 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a  custom_retval;..
15870 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15880 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
15890 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f 61  ...if ((cackey_a
158a0 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f  rgs.flags & CKF_
158b0 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d  OS_LOCKING_OK) =
158c0 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  = CKF_OS_LOCKING
158d0 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61 64  _OK) {...pthread
158e0 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f 63 28  _mutex = malloc(
158f0 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61 64 5f  sizeof(*pthread_
15900 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20 28 21  mutex));...if (!
15910 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 20 7b  pthread_mutex) {
15920 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15930 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20  _PRINTF("Failed 
15940 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
15950 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ry.");.....retur
15960 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 70 74  n(-1);...}....pt
15970 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
15980 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
15990 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 2c  t(pthread_mutex,
159a0 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28 70 74   NULL);...if (pt
159b0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
159c0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
159d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
159e0 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28  read_mutex_init(
159f0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15a00 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
15a10 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
15a20 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09  turn(-1);...}...
15a30 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72 65 61  .*mutex = pthrea
15a40 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c 73 65  d_mutex;..} else
15a50 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
15a60 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
15a70 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
15a80 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
15a90 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 6d  gs.CreateMutex(m
15aa0 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
15ab0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
15ac0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
15ad0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15ae0 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  F("cackey_args.C
15af0 72 65 61 74 65 4d 75 74 65 78 28 29 20 72 65 74  reateMutex() ret
15b00 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
15b10 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
15b20 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
15b30 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
15b40 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
15b50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b60 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
15b70 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
15b80 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20  eturn(0);.}../* 
15b90 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
15ba0 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
15bb0 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
15bc0 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65 78  lock(void *mutex
15bd0 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75 74  ) {..pthread_mut
15be0 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d 75  ex_t *pthread_mu
15bf0 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65 61  tex;..int pthrea
15c00 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  d_retval;..CK_RV
15c10 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a   custom_retval;.
15c20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15c30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
15c40 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79 5f  ;...if ((cackey_
15c50 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b 46  args.flags & CKF
15c60 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
15c70 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e  == CKF_OS_LOCKIN
15c80 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65 61  G_OK) {...pthrea
15c90 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78 3b  d_mutex = mutex;
15ca0 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
15cb0 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
15cc0 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f  ex_lock(pthread_
15cd0 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74  mutex);...if (pt
15ce0 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20  hread_retval != 
15cf0 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
15d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68  EBUG_PRINTF("pth
15d10 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  read_mutex_lock(
15d20 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15d30 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
15d40 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
15d50 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
15d60 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
15d70 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
15d80 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d  tex) {....custom
15d90 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
15da0 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
15db0 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
15dc0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
15dd0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
15de0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15df0 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
15e00 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75  LockMutex() retu
15e10 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29  rned error (%li)
15e20 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f  .", (long) custo
15e30 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09  m_retval);......
15e40 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d  return(-1);....}
15e50 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ...}..}...CACKEY
15e60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15e70 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66  eturning sucessf
15e80 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65  ully (0)");...re
15e90 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52  turn(0);.}../* R
15ea0 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63  eturns 0 on succ
15eb0 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ess */.static in
15ec0 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  t cackey_mutex_u
15ed0 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74 65  nlock(void *mute
15ee0 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
15ef0 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
15f00 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
15f10 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
15f20 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
15f30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15f40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
15f50 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
15f60 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
15f70 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
15f80 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
15f90 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
15fa0 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65 78  ad_mutex = mutex
15fb0 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  ;....pthread_ret
15fc0 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
15fd0 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68 72 65  tex_unlock(pthre
15fe0 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20  ad_mutex);...if 
15ff0 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20  (pthread_retval 
16000 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
16010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16020 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
16030 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20  lock() returned 
16040 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74  error (%i).", pt
16050 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a  hread_retval);..
16060 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
16070 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
16080 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  f (cackey_args.U
16090 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  nlockMutex) {...
160a0 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
160b0 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c   cackey_args.Unl
160c0 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ockMutex(mutex);
160d0 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
160e0 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
160f0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
16100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
16110 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
16120 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
16130 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
16140 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
16150 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
16160 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
16170 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
16180 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
16190 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
161a0 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
161b0 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 43 4b  0);.}..static CK
161c0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 63  _ATTRIBUTE_PTR c
161d0 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
161e0 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54 5f 43  utes(CK_OBJECT_C
161f0 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61 73 73  LASS objectclass
16200 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
16210 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 69  pcsc_identity *i
16220 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65  dentity, unsigne
16230 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
16240 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  num, CK_ULONG_PT
16250 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73  R pulCount) {..s
16260 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
16270 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73 74 61  k_true = 1;..sta
16280 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f  tic CK_BBOOL ck_
16290 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74 61 74  false = 0;..stat
162a0 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b 5f 74  ic CK_TRUST ck_t
162b0 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52 55 53  rusted = CK_TRUS
162c0 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b 0a 09  TED_DELEGATOR;..
162d0 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74 74 72  CK_ULONG numattr
162e0 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f 63 6f  s = 0, retval_co
162f0 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55  unt;..CK_ATTRIBU
16300 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61 74 74  TE_TYPE curr_att
16310 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54 54 52  r_type;..CK_ATTR
16320 49 42 55 54 45 20 63 75 72 72 5f 61 74 74 72 2c  IBUTE curr_attr,
16330 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 56 4f   *retval;..CK_VO
16340 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09  ID_PTR pValue;..
16350 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65  CK_ULONG ulValue
16360 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43 54 5f  Len;..CK_OBJECT_
16370 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63 74 5f  CLASS ck_object_
16380 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52 54 49  class;..CK_CERTI
16390 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b 5f 63  FICATE_TYPE ck_c
163a0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
163b0 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20 63 6b  ..CK_KEY_TYPE ck
163c0 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b 5f 55  _key_type;..CK_U
163d0 54 46 38 43 48 41 52 20 75 63 54 6d 70 42 75 66  TF8CHAR ucTmpBuf
163e0 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43 6f 6e  [1024];..SHA1Con
163f0 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b 0a 09  text sha1_ctx;..
16400 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74 78 3b  MD5_CTX md5_ctx;
16410 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31 5f 68  ..uint8_t sha1_h
16420 61 73 68 5b 53 48 41 31 48 61 73 68 53 69 7a 65  ash[SHA1HashSize
16430 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64 35 5f  ];..uint8_t md5_
16440 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69 7a 65  hash[MD5HashSize
16450 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  ];..unsigned cha
16460 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
16470 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69 66 69  .ssize_t certifi
16480 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c 20 78  cate_len = -1, x
16490 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 69  509_read_ret;..i
164a0 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65 3b 0a  nt pValue_free;.
164b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
164c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20 28 6f  RINTF("Called (o
164d0 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25 6c 75  bjectClass = %lu
164e0 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 3d  , identity_num =
164f0 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
16500 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63 74 63  ed long) objectc
16510 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79 5f 6e  lass, identity_n
16520 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  um);...*pulCount
16530 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62 6a 65   = 0;...if (obje
16540 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
16550 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62  ERTIFICATE && ob
16560 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
16570 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26 20 6f  _PUBLIC_KEY && o
16580 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16590 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
165a0 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
165b0 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
165c0 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ST) {...CACKEY_D
165d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
165e0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
165f0 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
16600 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 29 3b   object class");
16610 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
16620 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20 43 65  ;..}.../* Get Ce
16630 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e 74  rt */..if (ident
16640 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
16650 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16660 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16670 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
16680 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e 74 69  , invalid identi
16690 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a 0a 09  y provided");...
166a0 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
166b0 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  }...certificate 
166c0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
166d0 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
166e0 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
166f0 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
16700 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
16710 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 3d 20  tificate_len == 
16720 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63 61 74  -1 || certificat
16730 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
16740 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16750 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
16760 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
16770 74 68 69 73 20 69 64 65 6e 74 69 74 79 20 64 6f  this identity do
16780 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 58  es not have an X
16790 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
167a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
167b0 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 74   it and will not
167c0 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65 74 75   work");....retu
167d0 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f  rn(NULL);..}.../
167e0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 63 65  * Verify that ce
167f0 72 74 69 66 69 63 61 74 65 20 69 73 20 41 53 4e  rtificate is ASN
16800 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35 30 39  .1 encoded X.509
16810 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
16820 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73 65 72  .if (x509_to_ser
16830 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c  ial(certificate,
16840 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
16850 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b 0a 09  , NULL) < 0) {..
16860 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16870 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
16880 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
16890 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65 72 74  , the X.509 cert
168a0 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
168b0 65 64 20 77 69 74 68 20 74 68 69 73 20 69 64 65  ed with this ide
168c0 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76 61 6c  ntity is not val
168d0 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  id");....return(
168e0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  NULL);..}...retv
168f0 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b 0a 09  al_count = 64;..
16900 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f 63 28  retval = malloc(
16910 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
16920 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
16930 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
16940 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75 72 72  r_type = 0; curr
16950 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30 78 63  _attr_type < 0xc
16960 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f 61 74  e5363bf; curr_at
16970 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 69  tr_type++) {...i
16980 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f (curr_attr_typ
16990 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a 09 09  e == 0x800) {...
169a0 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20  .curr_attr_type 
169b0 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a 09 09  = 0xce536300;...
169c0 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72 65 65  }....pValue_free
169d0 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65 20 3d   = 0;...pValue =
169e0 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
169f0 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
16a00 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63  -1;....switch (c
16a10 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 20 7b  urr_attr_type) {
16a20 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  ....case CKA_CLA
16a30 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  SS:.....CACKEY_D
16a40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
16a50 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16a60 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30 78 25  e CKA_CLASS (0x%
16a70 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16a80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16a90 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16aa0 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73  ..ck_object_clas
16ab0 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73 73 3b  s = objectclass;
16ac0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16ad0 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
16ae0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16af0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62 6a 65  = sizeof(ck_obje
16b00 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09 09 09  ct_class);......
16b10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16b20 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
16b30 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
16b40 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16b50 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43 54 5f  g) *((CK_OBJECT_
16b60 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75 65 29  CLASS *) pValue)
16b70 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
16b80 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
16b90 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
16ba0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
16bb0 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59  OKEN:.....CACKEY
16bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16bd0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
16be0 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20 28 30  ute CKA_TOKEN (0
16bf0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
16c00 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
16c10 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
16c20 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
16c30 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
16c40 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
16c50 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
16c60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16c70 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16c80 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
16c90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16ca0 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
16cb0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
16cc0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16cd0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16ce0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16cf0 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09  e CKA_PRIVATE:..
16d00 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16d10 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16d20 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16d30 5f 50 52 49 56 41 54 45 20 28 30 78 25 30 38 6c  _PRIVATE (0x%08l
16d40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16d50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16d60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
16d70 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
16d80 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
16d90 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
16da0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16db0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16dc0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16dd0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
16de0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
16df0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
16e00 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16e10 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
16e20 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  se;.....ulValueL
16e30 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
16e40 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b  alse);......CACK
16e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16e60 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16e70 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
16e80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
16e90 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
16ea0 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
16eb0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
16ec0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
16ed0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
16ee0 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
16ef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16f00 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16f10 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
16f20 52 55 53 54 45 44 20 28 30 78 25 30 38 6c 78 29  RUSTED (0x%08lx)
16f30 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16f40 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16f50 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16f60 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
16f70 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16f80 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
16f90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16fa0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
16fb0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
16fc0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
16fd0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
16fe0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
16ff0 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
17000 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
17010 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17020 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
17030 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17040 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
17050 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
17060 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
17070 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
17080 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
17090 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
170a0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
170b0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
170c0 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49  ...case CKA_MODI
170d0 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b  FIABLE:.....CACK
170e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
170f0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17100 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49 46 49  ibute CKA_MODIFI
17110 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
17120 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17130 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17140 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
17150 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
17160 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17170 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
17180 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
17190 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
171a0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
171b0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
171c0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
171d0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
171e0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
171f0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17200 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17210 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4c  k;....case CKA_L
17220 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b 45 59  ABEL:.....CACKEY
17230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17240 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17250 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20 28 30  ute CKA_LABEL (0
17260 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17270 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17280 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17290 09 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79  ....if (identity
172a0 2d 3e 69 64 5f 74 79 70 65 20 3d 3d 20 43 41 43  ->id_type == CAC
172b0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 29  KEY_ID_TYPE_PIV)
172c0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
172d0 20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e   identity->card.
172e0 70 69 76 2e 6c 61 62 65 6c 3b 0a 09 09 09 09 09  piv.label;......
172f0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 74 72  ulValueLen = str
17300 6c 65 6e 28 70 56 61 6c 75 65 29 3b 0a 09 09 09  len(pValue);....
17310 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 75  .} else {......u
17320 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72  lValueLen = snpr
17330 69 6e 74 66 28 28 63 68 61 72 20 2a 29 20 75 63  intf((char *) uc
17340 54 6d 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75  TmpBuf, sizeof(u
17350 63 54 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74  cTmpBuf), "Ident
17360 69 74 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69  ity #%lu", (unsi
17370 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74  gned long) ident
17380 69 74 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 09 70  ity_num);......p
17390 56 61 6c 75 65 20 3d 20 75 63 54 6d 70 42 75 66  Value = ucTmpBuf
173a0 3b 0a 0a 09 09 09 09 09 69 66 20 28 75 6c 56 61  ;.......if (ulVa
173b0 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a 65 6f 66  lueLen >= sizeof
173c0 28 75 63 54 6d 70 42 75 66 29 29 20 7b 0a 09 09  (ucTmpBuf)) {...
173d0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
173e0 20 30 3b 0a 09 09 09 09 09 09 70 56 61 6c 75 65   0;.......pValue
173f0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 0a   = NULL;......}.
17400 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
17410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17420 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
17430 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
17440 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17450 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17460 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17470 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09  se CKA_VALUE:...
17480 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17490 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
174a0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
174b0 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20  VALUE (0x%08lx) 
174c0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
174d0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
174e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74  type);......swit
174f0 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29  ch (objectclass)
17500 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f   {......case CKO
17510 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09  _PRIVATE_KEY:...
17520 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17530 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17540 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17550 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17560 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29  a private key.")
17570 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  ;........break;.
17580 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45  .....case CKO_NE
17590 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09  TSCAPE_TRUST:...
175a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
175b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
175c0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
175d0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
175e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
175f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17600 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61  ..break;......ca
17610 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  se CKO_PUBLIC_KE
17620 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72  Y:.......if (cer
17630 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
17640 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39  0) {........x509
17650 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
17660 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69  _to_pubkey(certi
17670 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
17680 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
17690 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35  );........if (x5
176a0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
176b0 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c   { .........pVal
176c0 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
176d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
176e0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
176f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
17700 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a  ......}.......}.
17710 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17720 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54  ...case CKO_CERT
17730 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70  IFICATE:.......p
17740 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63  Value = certific
17750 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c  ate;.......ulVal
17760 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63  ueLen = certific
17770 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09  ate_len;........
17780 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17790 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
177a0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
177b0 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
177c0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
177d0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
177e0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
177f0 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55  ...case CKA_ISSU
17800 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
17810 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17820 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17830 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78  e CKA_ISSUER (0x
17840 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
17850 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17860 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17870 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17880 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
17890 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
178a0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
178b0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
178c0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
178d0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
178e0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
178f0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
17900 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
17910 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75   or Netscape tru
17920 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17930 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17940 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
17950 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
17960 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
17970 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73  ret = x509_to_is
17980 73 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65  suer(certificate
17990 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
179a0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
179b0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
179c0 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
179d0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
179e0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
179f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17a00 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
17a10 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
17a20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a30 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17a40 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
17a50 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17a60 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17a70 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17a80 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49  ...case CKA_SERI
17a90 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43  AL_NUMBER:.....C
17aa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17ab0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17ac0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52  ttribute CKA_SER
17ad0 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30  IAL_NUMBER (0x%0
17ae0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
17af0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
17b00 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
17b10 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
17b20 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
17b30 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  ATE && objectcla
17b40 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
17b50 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17b70 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17b80 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17b90 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
17ba0 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f   a certificate o
17bb0 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  r Netscape trust
17bc0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17bd0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17be0 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
17bf0 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
17c00 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
17c10 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69  t = x509_to_seri
17c20 61 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  al(certificate, 
17c30 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
17c40 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
17c50 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
17c60 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
17c70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
17c80 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
17c90 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
17ca0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
17cb0 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
17cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17cd0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17ce0 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
17cf0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17d00 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
17d10 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
17d20 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a  ...case CKA_SUBJ
17d30 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ECT:.....CACKEY_
17d40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17d50 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17d60 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28  te CKA_SUBJECT (
17d70 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17d80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17d90 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17da0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17db0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
17dc0 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
17dd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17de0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17df0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17e00 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
17e10 61 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b  a certificate");
17e20 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17e30 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
17e40 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
17e50 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
17e60 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
17e70 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66  o_subject(certif
17e80 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
17e90 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
17ea0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
17eb0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
17ec0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
17ed0 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
17ee0 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
17ef0 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
17f00 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
17f10 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
17f20 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17f30 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
17f40 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
17f50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
17f60 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
17f70 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
17f80 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  _ID:.....CACKEY_
17f90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17fa0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17fb0 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38  te CKA_ID (0x%08
17fc0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
17fd0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
17fe0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
17ff0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18000 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
18010 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18030 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18040 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18050 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
18060 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
18070 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
18080 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54  ;.....}......ucT
18090 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65  mpBuf[0] = ((ide
180a0 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e  ntity_num + 1) >
180b0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09  > 8) & 0xff;....
180c0 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20  .ucTmpBuf[1] =  
180d0 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20  (identity_num + 
180e0 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09  1) & 0xff;......
180f0 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42  pValue = &ucTmpB
18100 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  uf;.....ulValueL
18110 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43  en = 2;......CAC
18120 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18130 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
18140 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
18150 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18160 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18170 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18180 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  se CKA_CERTIFICA
18190 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  TE_TYPE:.....CAC
181a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
181b0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
181c0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49  ribute CKA_CERTI
181d0 46 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25  FICATE_TYPE (0x%
181e0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
181f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18200 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18210 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18220 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
18230 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43  CATE) {......CAC
18240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18250 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18260 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18270 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
18280 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a  ertificate.");..
18290 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
182a0 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c  }....../* We onl
182b0 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65  y support one ce
182c0 72 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a  rtificate type *
182d0 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69  /.....ck_certifi
182e0 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f  cate_type = CKC_
182f0 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c  X_509;......pVal
18300 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69  ue = &ck_certifi
18310 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75  cate_type;.....u
18320 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
18330 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74  of(ck_certificat
18340 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41  e_type);......CA
18350 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18360 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18370 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75  g CKC_X_509 (%lu
18380 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  ) (%p/%lu)", (un
18390 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
183a0 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  CK_CERTIFICATE_T
183b0 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  YPE *) pValue), 
183c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
183d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
183e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
183f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59  ....case CKA_KEY
18400 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45  _TYPE:.....CACKE
18410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18420 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
18430 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50  bute CKA_KEY_TYP
18440 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
18450 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18460 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18470 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18480 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50  ctclass != CKO_P
18490 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62  RIVATE_KEY && ob
184a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
184b0 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
184c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
184d0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
184e0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
184f0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
18500 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09  not a key.");...
18510 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18520 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
18530 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79   support one key
18540 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f   type */.....ck_
18550 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52  key_type = CKK_R
18560 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  SA;......pValue 
18570 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a  = &ck_key_type;.
18580 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18590 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74   sizeof(ck_key_t
185a0 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ype);......CACKE
185b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
185c0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43   ... returning C
185d0 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70  KK_RSA (%lu) (%p
185e0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
185f0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45  d long) *((CK_CE
18600 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a  RTIFICATE_TYPE *
18610 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18620 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18630 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18640 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18650 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09  ase CKA_SIGN:...
18660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18670 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18680 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18690 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  SIGN (0x%08lx) .
186a0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
186b0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
186c0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
186d0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
186e0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
186f0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18710 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18720 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18730 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
18740 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
18750 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18760 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
18770 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
18780 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
18790 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
187a0 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
187b0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
187c0 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
187d0 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
187e0 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
187f0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18800 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
18810 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
18820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18830 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18840 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18850 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18860 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18870 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18880 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18890 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
188a0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
188b0 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
188c0 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ER:.....CACKEY_D
188d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
188e0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
188f0 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56  e CKA_SIGN_RECOV
18900 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
18910 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18920 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
18930 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
18940 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18950 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
18960 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
18970 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18980 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
18990 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
189a0 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
189b0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
189c0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
189d0 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72  ....../* We curr
189e0 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  ently only suppo
189f0 72 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70  rt "Sign with Ap
18a00 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70  pendix" */.....p
18a10 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
18a20 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
18a30 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
18a40 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
18a50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18a60 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18a70 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18a80 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18a90 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18aa0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18ab0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18ac0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18ad0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18ae0 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09  KA_DECRYPT:.....
18af0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18b00 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18b10 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45  attribute CKA_DE
18b20 43 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20  CRYPT (0x%08lx) 
18b30 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
18b40 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
18b50 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
18b60 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18b70 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
18b80 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18ba0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18bb0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18bc0 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
18bd0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18be0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18bf0 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  ..}......if (obj
18c00 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f  ectclass == CKO_
18c10 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f  PRIVATE_KEY || o
18c20 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18c30 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a  O_PUBLIC_KEY) {.
18c40 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18c50 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
18c60 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18c70 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
18c80 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
18c90 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
18ca0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
18cb0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
18cc0 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
18cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18ce0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18cf0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18d00 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18d10 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18d20 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18d30 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18d40 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18d50 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18d60 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ase CKA_SENSITIV
18d70 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
18d80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18d90 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18da0 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28   CKA_SENSITIVE (
18db0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18dc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18dd0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18de0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18df0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
18e00 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
18e10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18e20 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
18e30 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
18e40 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
18e50 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
18e60 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
18e70 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
18e80 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18e90 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
18ea0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
18eb0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
18ec0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18ed0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
18ee0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
18ef0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18f00 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
18f10 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18f20 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
18f30 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
18f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
18f50 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
18f60 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
18f70 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
18f80 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
18f90 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
18fa0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18fb0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18fc0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18fd0 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09  EXTRACTABLE:....
18fe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18ff0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
19000 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45   attribute CKA_E
19010 58 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30  XTRACTABLE (0x%0
19020 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
19030 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
19040 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
19050 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
19060 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
19070 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
19080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
19090 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
190a0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
190b0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
190c0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
190d0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
190e0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
190f0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
19100 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
19110 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
19120 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
19130 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
19140 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
19150 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19160 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
19170 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
19180 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
19190 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
191a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
191b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
191c0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
191d0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
191e0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
191f0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
19200 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19210 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19220 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19230 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
19240 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  LUS:.....CACKEY_
19250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19260 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19270 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28  te CKA_MODULUS (
19280 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19290 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
192a0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
192b0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
192c0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
192d0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
192e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
192f0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19300 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19310 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19320 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
19330 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
19340 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
19350 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
19360 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
19370 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
19380 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c   = x509_to_modul
19390 75 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  us(certificate, 
193a0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
193b0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
193c0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
193d0 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
193e0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
193f0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
19400 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
19410 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
19420 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
19430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19440 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
19450 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
19460 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19470 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19480 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19490 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c  ...case CKA_PUBL
194a0 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09  IC_EXPONENT:....
194b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
194c0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
194d0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50   attribute CKA_P
194e0 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28  UBLIC_EXPONENT (
194f0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
19500 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
19510 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
19520 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
19530 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
19540 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
19550 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19560 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19570 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19580 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
19590 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
195a0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
195b0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
195c0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
195d0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
195e0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
195f0 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e   = x509_to_expon
19600 65 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ent(certificate,
19610 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19620 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
19630 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
19640 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
19650 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19660 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
19670 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19680 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
19690 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
196a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
196b0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
196c0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
196d0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
196e0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
196f0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
19700 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
19710 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41  ST_DIGITAL_SIGNA
19720 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b  TURE:....case CK
19730 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55  A_TRUST_NON_REPU
19740 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65  DIATION:....case
19750 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45   CKA_TRUST_KEY_E
19760 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09  NCIPHERMENT:....
19770 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44  case CKA_TRUST_D
19780 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54  ATA_ENCIPHERMENT
19790 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
197a0 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e  UST_KEY_AGREEMEN
197b0 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
197c0 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49  RUST_KEY_CERT_SI
197d0 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  GN:....case CKA_
197e0 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a  TRUST_CRL_SIGN:.
197f0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
19800 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09  T_SERVER_AUTH:..
19810 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
19820 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09  _CLIENT_AUTH:...
19830 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
19840 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09  CODE_SIGNING:...
19850 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
19860 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e  EMAIL_PROTECTION
19870 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19880 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19890 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
198a0 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30  CKA_TRUST_... (0
198b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
198c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
198d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
198e0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
198f0 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c  _trusted;.....ul
19900 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
19910 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a  f(ck_trusted);..
19920 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19930 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19940 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
19950 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
19960 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55   long) *((CK_TRU
19970 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  ST *) pValue), p
19980 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19990 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
199a0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
199b0 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54  ...case CKA_CERT
199c0 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09  _SHA1_HASH:.....
199d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
199e0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
199f0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
19a00 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78  RT_SHA1_HASH (0x
19a10 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
19a20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
19a30 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
19a40 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
19a50 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
19a60 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
19a70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19a80 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
19a90 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
19aa0 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
19ab0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
19ac0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
19ad0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
19ae0 09 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73  ....SHA1Reset(&s
19af0 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48  ha1_ctx);.....SH
19b00 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74  A1Input(&sha1_ct
19b10 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20  x, certificate, 
19b20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
19b30 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74  ;.....SHA1Result
19b40 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31  (&sha1_ctx, sha1
19b50 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61  _hash);......pVa
19b60 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b  lue = sha1_hash;
19b70 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19b80 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61  = sizeof(sha1_ha
19b90 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  sh);......CACKEY
19ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19bb0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
19bc0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
19bd0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
19be0 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
19bf0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
19c00 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
19c10 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  H:.....CACKEY_DE
19c20 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19c30 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19c40 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41   CKA_CERT_MD5_HA
19c50 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SH (0x%08lx) ...
19c60 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
19c70 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
19c80 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
19c90 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
19ca0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19cb0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19cd0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19ce0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19cf0 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
19d00 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19d10 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
19d20 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69  ...}......MD5Ini
19d30 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09  t(&md5_ctx);....
19d40 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f  .MD5Update(&md5_
19d50 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65  ctx, certificate
19d60 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
19d70 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c  n);.....MD5Final
19d80 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f  (md5_hash, &md5_
19d90 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ctx);......pValu
19da0 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09  e = md5_hash;...
19db0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
19dc0 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b  izeof(md5_hash);
19dd0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19de0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19df0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
19e00 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19e10 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
19e20 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
19e30 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a  ak;....default:.
19e40 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
19e50 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  L;.....ulValueLe
19e60 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
19e70 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ;.....break;...}
19e80 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e  ....if (((CK_LON
19e90 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21  G) ulValueLen) !
19ea0 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29  = ((CK_LONG) -1)
19eb0 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63  ) {..../* Push c
19ec0 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68  urr_attr onto th
19ed0 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75  e stack */....cu
19ee0 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63  rr_attr.type = c
19ef0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
19f00 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  ..curr_attr.ulVa
19f10 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
19f20 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74  Len;.....curr_at
19f30 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  tr.pValue = mall
19f40 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56  oc(curr_attr.ulV
19f50 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d  alueLen);....mem
19f60 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56  cpy(curr_attr.pV
19f70 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75  alue, pValue, cu
19f80 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
19f90 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61  en);.....if (pVa
19fa0 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c  lue_free && pVal
19fb0 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70  ue) {.....free(p
19fc0 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09  Value);....}....
19fd0 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d  .if (numattrs >=
19fe0 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b   retval_count) {
19ff0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65  .....retval = re
1a000 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65  alloc(retval, re
1a010 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a  tval_count * siz
1a020 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09  eof(*retval));..
1a030 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26  ..}.....memcpy(&
1a040 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d  retval[numattrs]
1a050 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69  , &curr_attr, si
1a060 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29  zeof(curr_attr))
1a070 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b  ;....numattrs++;
1a080 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75  ...}..}...if (nu
1a090 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09  mattrs != 0) {..
1a0a0 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20  .retval_count = 
1a0b0 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76  numattrs;...retv
1a0c0 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74  al = realloc(ret
1a0d0 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e  val, retval_coun
1a0e0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76  t * sizeof(*retv
1a0f0 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  al));..} else {.
1a100 09 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a  ..free(retval);.
1a110 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c  ...retval = NULL
1a120 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1a130 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43   = numattrs;...C
1a140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1a150 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c  TF("Returning %l
1a160 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22  u objects (%p)."
1a170 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69  , numattrs, (voi
1a180 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  d *) retval);...
1a190 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
1a1a0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
1a1b0 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
1a1c0 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
1a1d0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
1a1e0 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e  entities, unsign
1a1f0 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69  ed long identiti
1a200 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f  es_count) {..CK_
1a210 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f  ATTRIBUTE *curr_
1a220 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  attr;..unsigned 
1a230 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74  long id_idx, att
1a240 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65  r_idx;...if (ide
1a250 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20  ntities == NULL 
1a260 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  || identities_co
1a270 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  unt == 0) {...re
1a280 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
1a290 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69  id_idx = 0; id_i
1a2a0 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f  dx < identities_
1a2b0 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29  count; id_idx++)
1a2c0 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74   {...if (identit
1a2d0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a2e0 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72  ibutes) {....for
1a2f0 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20   (attr_idx = 0; 
1a300 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74  attr_idx < ident
1a310 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1a320 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
1a330 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
1a340 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69  ..curr_attr = &i
1a350 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a360 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74  ].attributes[att
1a370 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20  r_idx];......if 
1a380 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
1a390 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  ue) {......free(
1a3a0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
1a3b0 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a  e);.....}....}..
1a3c0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1a3d0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a3e0 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65  utes) {.....free
1a3f0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
1a400 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b  dx].attributes);
1a410 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
1a420 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e  _free_certs(iden
1a430 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1a440 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c  csc_identity, 1,
1a450 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72   1);...}..}...fr
1a460 65 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  ee(identities);.
1a470 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  }..static unsign
1a480 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72  ed long cackey_r
1a490 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
1a4a0 65 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  es(struct cackey
1a4b0 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
1a4c0 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20  ities, unsigned 
1a4d0 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  long num_dod_cer
1a4e0 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ts) {..unsigned 
1a4f0 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69  long cert_idx, i
1a500 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20  d_idx = 0;...if 
1a510 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  (identities == N
1a520 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
1a530 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20  num_dod_certs * 
1a540 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65  3);..}...for (ce
1a550 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
1a560 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63  _idx < num_dod_c
1a570 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b  erts; cert_idx++
1a580 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  ) {...identities
1a590 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1a5a0 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
1a5b0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a5c0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1a5d0 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1a5e0 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49  ibutes(CKO_CERTI
1a5f0 46 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63  FICATE, &extra_c
1a600 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  erts[cert_idx], 
1a610 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64  0xf000 | cert_id
1a620 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
1a630 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a640 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69  s_count);...id_i
1a650 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74  dx++;....identit
1a660 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1a670 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
1a680 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ;...identities[i
1a690 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a6a0 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1a6b0 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55  ttributes(CKO_PU
1a6c0 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61  BLIC_KEY, &extra
1a6d0 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
1a6e0 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
1a6f0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1a700 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a710 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
1a720 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74  _idx++;....ident
1a730 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1a740 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
1a750 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
1a760 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a770 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
1a780 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
1a790 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20  NETSCAPE_TRUST, 
1a7a0 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
1a7b0 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
1a7c0 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1a7d0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a7e0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1a7f0 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d  ;...id_idx++;..}
1a800 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78  ...return(id_idx
1a810 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72  );.}..static str
1a820 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
1a830 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
1a840 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1a850 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
1a860 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c  slot, unsigned l
1a870 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20  ong *ids_found) 
1a880 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
1a890 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
1a8a0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
1a8b0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1a8c0 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
1a8d0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
1a8e0 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64  long num_ids, id
1a8f0 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79  _idx, curr_id_ty
1a900 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  pe;..unsigned lo
1a910 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75  ng num_certs, nu
1a920 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72  m_dod_certs, cer
1a930 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c  t_idx;..int incl
1a940 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
1a950 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 0;...CACKEY_DE
1a960 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1a970 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73  ed.");...if (ids
1a980 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20  _found == NULL) 
1a990 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1a9a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1a9b0 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55   ids_found is NU
1a9c0 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  LL");....return(
1a9d0 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65  NULL);..}..#ifde
1a9e0 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c  f CACKEY_CARD_SL
1a9f0 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41  OT_INCLUDE_EXTRA
1aa00 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f  _CERTS..include_
1aa10 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
1aa20 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65  .#endif...if (ge
1aa30 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f 44  tenv("CACKEY_DOD
1aa40 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f  _CERTS_ON_HW_SLO
1aa50 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1aa60 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
1aa70 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09  certs = 1;..}...
1aa80 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1aa90 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f  EY_NO_DOD_CERTS_
1aaa0 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d  ON_HW_SLOTS") !=
1aab0 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1aac0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1aad0 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74   0;..}...if (get
1aae0 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45  env("CACKEY_NO_E
1aaf0 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20  XTRA_CERTS") != 
1ab00 4e 55 4c 4c 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f  NULL) {...num_do
1ab10 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20  d_certs = 0;..} 
1ab20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64  else {...num_dod
1ab30 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66 28  _certs = sizeof(
1ab40 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20 73  extra_certs) / s
1ab50 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
1ab60 73 5b 30 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  s[0]);..}...if (
1ab70 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20  slot->internal) 
1ab80 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  {...num_ids = ca
1ab90 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
1aba0 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e  entities(NULL, n
1abb0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a  um_dod_certs);..
1abc0 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d  ..if (num_ids !=
1abd0 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74   0) {....identit
1abe0 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1abf0 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1ac00 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1ac10 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64  .cackey_read_dod
1ac20 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e  _identities(iden
1ac30 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f  tities, num_dod_
1ac40 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65  certs);...} else
1ac50 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73   {....identities
1ac60 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
1ac70 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d  *ids_found = num
1ac80 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _ids;....return(
1ac90 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a  identities);..}.
1aca0 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
1acb0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1acc0 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c  certs(slot, NULL
1acd0 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09  , &num_certs);..
1ace0 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1acf0 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1ad00 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62  ./* Convert numb
1ad10 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e  er of Certs to n
1ad20 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1ad30 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20   */...num_ids = 
1ad40 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59  (CKO_PRIVATE_KEY
1ad50 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   - CKO_CERTIFICA
1ad60 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65  TE + 1) * num_ce
1ad70 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c  rts;....if (incl
1ad80 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29  ude_extra_certs)
1ad90 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d   {....num_ids +=
1ada0 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1adb0 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c  _identities(NULL
1adc0 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1add0 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74  ;...}....identit
1ade0 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d  ies = malloc(num
1adf0 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69  _ids * sizeof(*i
1ae00 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09  dentities));....
1ae10 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61  /* Add certifica
1ae20 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73  tes, public keys
1ae30 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65  , and private ke
1ae40 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72  ys from the smar
1ae50 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64  tcard */...id_id
1ae60 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65  x = 0;...for (ce
1ae70 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74  rt_idx = 0; cert
1ae80 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73  _idx < num_certs
1ae90 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
1aea0 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f  ...for (curr_id_
1aeb0 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49  type = CKO_CERTI
1aec0 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f  FICATE; curr_id_
1aed0 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56  type <= CKO_PRIV
1aee0 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64  ATE_KEY; curr_id
1aef0 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69  _type++) {.....i
1af00 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1af10 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63  ].attributes = c
1af20 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62  ackey_get_attrib
1af30 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70  utes(curr_id_typ
1af40 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74  e, &pcsc_identit
1af50 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63  ies[cert_idx], c
1af60 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1af70 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1af80 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1af90 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1afa0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1afb0 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
1afc0 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65  izeof(*identitie
1afd0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1afe0 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d  dentity));.....m
1aff0 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
1b000 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1b010 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64  entity, &pcsc_id
1b020 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1b030 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e  x], sizeof(*iden
1b040 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1b050 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a  csc_identity));.
1b060 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1b070 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1b080 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1b090 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  te = malloc(pcsc
1b0a0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1b0b0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1b0c0 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63  e_len);.....memc
1b0d0 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  py(identities[id
1b0e0 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1b0f0 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
1b100 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
1b110 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1b120 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64  ificate, pcsc_id
1b130 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64  entities[cert_id
1b140 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  x].certificate_l
1b150 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78  en);......id_idx
1b160 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ++;....}...}....
1b170 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72  if (include_extr
1b180 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41  a_certs) {....CA
1b190 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b1a0 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53 20  F("Including US 
1b1b0 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1b1c0 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77  ficates on hardw
1b1d0 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09  are slot");.....
1b1e0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1b1f0 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
1b200 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20  ities + id_idx, 
1b210 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a  num_dod_certs);.
1b220 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72  ..}....cackey_fr
1b230 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1b240 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1b250 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73  rts, 1);....*ids
1b260 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
1b270 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
1b280 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a  tities);..}....*
1b290 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09  ids_found = 0;..
1b2a0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a  return(NULL);.}.
1b2b0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1b2c0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1b2d0 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  tialize)(CK_VOID
1b2e0 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20  _PTR pInitArgs) 
1b2f0 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  {..CK_C_INITIALI
1b300 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61  ZE_ARGS CK_PTR a
1b310 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69  rgs;..uint32_t i
1b320 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  dx, highest_slot
1b330 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69  ;..int mutex_ini
1b340 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  t_ret;...CACKEY_
1b350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1b360 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63  lled.");...if (c
1b370 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b380 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1b390 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b3a0 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74  r.  Already init
1b3b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b3c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b3d0 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49  KI_ALREADY_INITI
1b3e0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1b3f0 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e   (pInitArgs != N
1b400 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20  ULL) {...args = 
1b410 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d  pInitArgs;...mem
1b420 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73  cpy(&cackey_args
1b430 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63  , args, sizeof(c
1b440 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09  ackey_args));...
1b450 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1b460 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  eMutex == NULL |
1b470 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1b480 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  utex == NULL || 
1b490 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1b4a0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1b4b0 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20  >UnlockMutex == 
1b4c0 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61  NULL) {....if (a
1b4d0 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
1b4e0 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1b4f0 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21  ->DestroyMutex !
1b500 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1b510 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  LockMutex != NUL
1b520 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
1b530 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20  kMutex != NULL) 
1b540 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
1b550 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1b560 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20  . Some, but not 
1b570 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72  All threading pr
1b580 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65  imitives provide
1b590 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
1b5a0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1b5b0 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  BAD);....}...}..
1b5c0 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65  } else {...cacke
1b5d0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
1b5e0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  ex = NULL;...cac
1b5f0 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79  key_args.Destroy
1b600 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1b610 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
1b620 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1b630 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f  cackey_args.Unlo
1b640 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1b650 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ..cackey_args.fl
1b660 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ags = 0;..}...fo
1b670 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1b680 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1b690 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1b6a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1b6b0 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1b6c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
1b6d0 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  ions[idx].active
1b6e0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28   = 0;..}...for (
1b6f0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1b700 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b710 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1b720 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1b730 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b   idx++) {...cack
1b740 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
1b750 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b  tive = 0;...cack
1b760 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1b770 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1b780 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1b790 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
1b7a0 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63  n_depth = 0;...c
1b7b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b7c0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
1b7d0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
1b7e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1b7f0 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  x].slot_reset = 
1b800 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1b810 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  s[idx].token_fla
1b820 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  gs = 0;...cackey
1b830 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
1b840 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  l = NULL;...cack
1b850 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e  ey_slots[idx].in
1b860 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a  ternal = 0;..}..
1b870 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1b880 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1b890 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1b8a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b8b0 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74  RINTF("Asked not
1b8c0 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20   to include DoD 
1b8d0 63 65 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a  certificates");.
1b8e0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68  .} else {...high
1b8f0 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65  est_slot = (size
1b900 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1b910 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1b920 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b  _slots[0])) - 1;
1b930 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b940 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69  _PRINTF("Includi
1b950 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20  ng DoD certs in 
1b960 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69  slot %lu", (unsi
1b970 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65  gned long) highe
1b980 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63  st_slot);....cac
1b990 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1b9a0 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  t_slot].active =
1b9b0 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   1;...cackey_slo
1b9c0 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1b9d0 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09  .internal = 1;..
1b9e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1b9f0 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65  ghest_slot].labe
1ba00 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  l = (unsigned ch
1ba10 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65 72 6e  ar *) "US Govern
1ba20 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65  ment Certificate
1ba30 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  s";...cackey_slo
1ba40 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1ba50 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22  .pcsc_reader = "
1ba60 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65  CACKey";...cacke
1ba70 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1ba80 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  slot].token_flag
1ba90 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b  s = 0;..}...cack
1baa0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1bab0 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65   1;...if (!cacke
1bac0 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20  y_biglock_init) 
1bad0 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72  {...mutex_init_r
1bae0 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  et = cackey_mute
1baf0 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79  x_create(&cackey
1bb00 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
1bb10 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74   (mutex_init_ret
1bb20 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
1bb30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bb40 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69  "Error.  Mutex i
1bb50 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
1bb60 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74  iled.");.....ret
1bb70 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43  urn(CKR_CANT_LOC
1bb80 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  K);...}....cacke
1bb90 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
1bba0 20 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 66 69   1;..}.../* Defi
1bbb0 6e 65 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  ne a command to 
1bbc0 70 72 6f 6d 70 74 20 75 73 65 72 20 66 6f 72 20  prompt user for 
1bbd0 61 20 50 49 4e 20 2a 2f 0a 23 69 66 64 65 66 20  a PIN */.#ifdef 
1bbe0 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41  CACKEY_PIN_COMMA
1bbf0 4e 44 5f 44 45 46 41 55 4c 54 0a 09 63 61 63 6b  ND_DEFAULT..cack
1bc00 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d  ey_pin_command =
1bc10 20 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d   CACKEY_PIN_COMM
1bc20 41 4e 44 5f 44 45 46 41 55 4c 54 5f 58 53 54 52  AND_DEFAULT_XSTR
1bc30 28 43 41 43 4b 45 59 5f 50 49 4e 5f 43 4f 4d 4d  (CACKEY_PIN_COMM
1bc40 41 4e 44 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65  AND_DEFAULT);.#e
1bc50 6e 64 69 66 0a 23 69 66 64 65 66 20 43 41 43 4b  ndif.#ifdef CACK
1bc60 45 59 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58  EY_PIN_COMMAND_X
1bc70 4f 4e 4c 59 5f 44 45 46 41 55 4c 54 0a 09 63 61  ONLY_DEFAULT..ca
1bc80 63 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64  ckey_pin_command
1bc90 5f 78 6f 6e 6c 79 20 3d 20 43 41 43 4b 45 59 5f  _xonly = CACKEY_
1bca0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 44 45 46 41  PIN_COMMAND_DEFA
1bcb0 55 4c 54 5f 58 53 54 52 28 43 41 43 4b 45 59 5f  ULT_XSTR(CACKEY_
1bcc0 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c  PIN_COMMAND_XONL
1bcd0 59 5f 44 45 46 41 55 4c 54 29 3b 0a 23 65 6e 64  Y_DEFAULT);.#end
1bce0 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  if...if (getenv(
1bcf0 22 44 49 53 50 4c 41 59 22 29 20 21 3d 20 4e 55  "DISPLAY") != NU
1bd00 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
1bd10 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 63 61 63  in_command = cac
1bd20 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 5f  key_pin_command_
1bd30 78 6f 6e 6c 79 3b 0a 09 7d 0a 0a 09 69 66 20 28  xonly;..}...if (
1bd40 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50  getenv("CACKEY_P
1bd50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e 4c 59  IN_COMMAND_XONLY
1bd60 22 29 20 21 3d 20 4e 55 4c 4c 20 26 26 20 67 65  ") != NULL && ge
1bd70 74 65 6e 76 28 22 44 49 53 50 4c 41 59 22 29 20  tenv("DISPLAY") 
1bd80 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63  != NULL) {...cac
1bd90 6b 65 79 5f 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20  key_pin_command 
1bda0 3d 20 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59  = getenv("CACKEY
1bdb0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 5f 58 4f 4e  _PIN_COMMAND_XON
1bdc0 4c 59 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 67  LY");..}...if (g
1bdd0 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49  etenv("CACKEY_PI
1bde0 4e 5f 43 4f 4d 4d 41 4e 44 22 29 20 21 3d 20 4e  N_COMMAND") != N
1bdf0 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
1be00 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 3d 20 67 65  pin_command = ge
1be10 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 50 49 4e  tenv("CACKEY_PIN
1be20 5f 43 4f 4d 4d 41 4e 44 22 29 3b 0a 09 7d 0a 0a  _COMMAND");..}..
1be30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1be40 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1be50 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1be60 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1be70 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1be80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1be90 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65  K_RV, C_Finalize
1bea0 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52  )(CK_VOID_PTR pR
1beb0 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74  eserved) {..uint
1bec0 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  32_t idx;...CACK
1bed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bee0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1bef0 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e   (pReserved != N
1bf00 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1bf10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1bf20 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
1bf30 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
1bf40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1bf50 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1bf60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1bf70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1bf80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bf90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1bfa0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1bfb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1bfc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1bfd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f  ALIZED);..}...fo
1bfe0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1bff0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1c000 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1c010 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1c020 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
1c030 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
1c040 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
1c050 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f  tive) {....C_Clo
1c060 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
1c070 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
1c080 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
1c090 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69  _all();...for (i
1c0a0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1c0b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c0c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1c0d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1c0e0 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63  idx++) {...if (c
1c0f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1c100 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09  .internal) {....
1c110 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
1c120 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1c130 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1c140 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  er) {....free(ca
1c150 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1c160 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09  pcsc_reader);...
1c170 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
1c180 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65  slots[idx].cache
1c190 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61  d_certs) {....ca
1c1a0 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1c1b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c1c0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20  ].cached_certs, 
1c1d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1c1e0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  ].cached_certs_c
1c1f0 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61  ount, 1);.....ca
1c200 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1c210 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e  cached_certs = N
1c220 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61  ULL;...}..}...ca
1c230 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
1c240 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79  nect();...cackey
1c250 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
1c260 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c270 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1c280 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1c290 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1c2a0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1c2b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1c2c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e  N(CK_RV, C_GetIn
1c2d0 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20  fo)(CK_INFO_PTR 
1c2e0 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63  pInfo) {..static
1c2f0 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e   CK_UTF8CHAR man
1c300 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20  ufacturerID[] = 
1c310 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74  "U.S. Government
1c320 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
1c330 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44 65  F8CHAR libraryDe
1c340 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43  scription[] = "C
1c350 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59  ACKey";...CACKEY
1c360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1c370 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1c380 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
1c390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c3a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1c3b0 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
1c3c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c3d0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c3e0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c3f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c410 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c420 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c430 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c440 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c450 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c460 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
1c470 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
1c480 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
1c490 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
1c4a0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1c4b0 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65  Info->cryptokiVe
1c4c0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
1c4d0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
1c4e0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
1c4f0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65   8) & 0xff;...me
1c500 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1c510 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1c520 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1c530 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1c540 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1c550 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1c560 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1c570 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
1c580 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70  rerID) - 1);...p
1c590 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78  Info->flags = 0x
1c5a0 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  00;...memset(pIn
1c5b0 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72  fo->libraryDescr
1c5c0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
1c5d0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  eof(pInfo->libra
1c5e0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b  ryDescription));
1c5f0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1c600 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
1c610 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72  on, libraryDescr
1c620 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c  iption, sizeof(l
1c630 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1c640 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f  n) - 1);...pInfo
1c650 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e  ->libraryVersion
1c660 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79  .major = (cackey
1c670 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1c680 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49   16) & 0xff;..pI
1c690 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73  nfo->libraryVers
1c6a0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63  ion.minor = (cac
1c6b0 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29  key_getversion()
1c6c0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
1c6d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c6e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1c6f0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1c700 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1c710 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  CKR_OK);.}../*. 
1c720 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f  * Process list o
1c730 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63  f readers, and c
1c740 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65  reate mapping be
1c750 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d  tween reader nam
1c760 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a  e and slot ID. *
1c770 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
1c780 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1c790 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42  tSlotList)(CK_BB
1c7a0 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  OOL tokenPresent
1c7b0 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
1c7c0 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55   pSlotList, CK_U
1c7d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
1c7e0 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74  t) {..static int
1c7f0 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b   first_call = 1;
1c800 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1c810 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f  al;..int pcsc_co
1c820 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55  nnect_ret;..CK_U
1c830 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  LONG count, slot
1c840 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72  _count = 0, curr
1c850 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a  slot, slot_idx;.
1c860 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
1c870 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65  ers, *pcsc_reade
1c880 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  rs_s, *pcsc_read
1c890 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63  ers_e;..DWORD pc
1c8a0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a  sc_readers_len;.
1c8b0 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74  .LONG scard_list
1c8c0 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69  readers_ret;..si
1c8d0 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72  ze_t curr_reader
1c8e0 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f  _len;..int slot_
1c8f0 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  reset;...CACKEY_
1c900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1c910 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1c920 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29  ulCount == NULL)
1c930 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1c940 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1c950 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
1c960 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1c970 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1c980 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1c990 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1c9a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c9b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c9c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1c9d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c9e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1c9f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ca00 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1ca10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1ca20 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1ca30 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1ca40 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1ca50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ca60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ca70 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1ca80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ca90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1caa0 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c  ..}.../* Clear l
1cab0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a  ist of slots */.
1cac0 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b  .slot_reset = 0;
1cad0 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29  ..if (pSlotList)
1cae0 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63   {...if (first_c
1caf0 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f  all) {....first_
1cb00 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c  call = 0;.....sl
1cb10 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09  ot_reset = 1;...
1cb20 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f  }..../* If any o
1cb30 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65  f the slots have
1cb40 20 62 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e   been reset then
1cb50 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72   purge all infor
1cb60 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b  mation and check
1cb70 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20   again */...for 
1cb80 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63  (currslot = 0; c
1cb90 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1cba0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1cbb0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1cbc0 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
1cbd0 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20  slot++) {....if 
1cbe0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1cbf0 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
1cc00 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  ) {.....continue
1cc10 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
1cc20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1cc30 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1cc40 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1cc50 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b  ..}.....if (cack
1cc60 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1cc70 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  t].slot_reset) {
1cc80 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20  .....slot_reset 
1cc90 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  = 1;......break;
1cca0 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
1ccb0 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  (slot_reset) {..
1ccc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ccd0 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61  RINTF("Purging a
1cce0 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  ll slot informat
1ccf0 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f  ion.");...../* O
1cd00 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c  nly update the l
1cd10 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20  ist of slots if 
1cd20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  we are actually 
1cd30 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65  being supply the
1cd40 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
1cd50 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73  n */....cackey_s
1cd60 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f  lots_disconnect_
1cd70 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28  all();.....for (
1cd80 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1cd90 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1cda0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1cdb0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1cdc0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1cdd0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  lot++) {.....if 
1cde0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1cdf0 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
1ce00 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75  ) {......continu
1ce10 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  e;.....}......if
1ce20 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1ce30 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
1ce40 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65  ader) {......fre
1ce50 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  e(cackey_slots[c
1ce60 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65  urrslot].pcsc_re
1ce70 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63  ader);.......cac
1ce80 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1ce90 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
1cea0 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09  = NULL;.....}...
1ceb0 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1cec0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
1ced0 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  bel) {......free
1cee0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1cef0 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a  rrslot].label);.
1cf00 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1cf10 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1cf20 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d  el = NULL;.....}
1cf30 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1cf40 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1cf50 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09  ive = 0;....}...
1cf60 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d  } else {.......}
1cf70 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
1cf80 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65  ne list of reade
1cf90 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e  rs */..pcsc_conn
1cfa0 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
1cfb0 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b  _pcsc_connect();
1cfc0 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
1cfd0 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
1cfe0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
1cff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d000 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
1d010 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c  to PC/SC failed,
1d020 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f   assuming no slo
1d030 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f  ts");....slot_co
1d040 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  unt = 0;..} else
1d050 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72   {...pcsc_reader
1d060 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63  s_len = 0;....sc
1d070 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1d080 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52  ret = SCardListR
1d090 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70  eaders(*cackey_p
1d0a0 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c  csc_handle, NULL
1d0b0 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65  , NULL, &pcsc_re
1d0c0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69  aders_len);....i
1d0d0 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61  f (scard_listrea
1d0e0 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52  ders_ret == SCAR
1d0f0 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20  D_F_COMM_ERROR) 
1d100 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1d110 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d120 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1d130 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  s() returned SCA
1d140 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c  RD_F_COMM_ERROR,
1d150 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63   assuming Connec
1d160 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65  tion to PC/SC we
1d170 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65  nt away. Reconne
1d180 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61  cting.");.....ca
1d190 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
1d1a0 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65  nect();....cacke
1d1b0 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
1d1c0 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
1d1d0 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e  UG_PRINTF("Tryin
1d1e0 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  g SCardListReade
1d1f0 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09  rs() again");...
1d200 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
1d210 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
1d220 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
1d230 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
1d240 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63  ULL, NULL, &pcsc
1d250 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
1d260 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  .}....if (scard_
1d270 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
1d280 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
1d290 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64 65  SS && pcsc_reade
1d2a0 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09  rs_len != 0) {..
1d2b0 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d  ..pcsc_readers =
1d2c0 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61   malloc(pcsc_rea
1d2d0 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63  ders_len);....pc
1d2e0 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70  sc_readers_s = p
1d2f0 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09  csc_readers;....
1d300 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  .scard_listreade
1d310 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69  rs_ret = SCardLi
1d320 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65  stReaders(*cacke
1d330 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e  y_pcsc_handle, N
1d340 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72  ULL, pcsc_reader
1d350 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  s, &pcsc_readers
1d360 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63  _len);....if (sc
1d370 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1d380 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
1d390 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63  UCCESS) {.....pc
1d3a0 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70  sc_readers_e = p
1d3b0 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63  csc_readers + pc
1d3c0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a  sc_readers_len;.
1d3d0 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69  ...../* Start wi
1d3e0 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f  th Slot ID 1, to
1d3f0 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20   avoid a bug in 
1d400 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09  GDM on RHEL */..
1d410 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31  .../* Bug 594911
1d420 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c  : https://bugzil
1d430 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68  la.redhat.com/sh
1d440 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39  ow_bug.cgi?id=59
1d450 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72  4911 */.....curr
1d460 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c  slot = 1;.....sl
1d470 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ot_count = 0;...
1d480 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65  ..while (pcsc_re
1d490 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61  aders < pcsc_rea
1d4a0 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f  ders_e) {....../
1d4b0 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69  * Find next avai
1d4c0 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09  lable slot */...
1d4d0 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c  ...for (; currsl
1d4e0 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1d4f0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1d500 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d510 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
1d520 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21  +) {.......if (!
1d530 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d540 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1d550 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1d560 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09  .....}......}...
1d570 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f  ....curr_reader_
1d580 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73  len = strlen(pcs
1d590 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09  c_readers);.....
1d5a0 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61 64  ..if ((pcsc_read
1d5b0 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65  ers + curr_reade
1d5c0 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65  r_len) > pcsc_re
1d5d0 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09  aders_e) {......
1d5e0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1d5f0 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72 65  .....if (curr_re
1d600 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b  ader_len == 0) {
1d610 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
1d620 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63  ...}.......if (c
1d630 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65  urrslot >= (size
1d640 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1d650 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1d660 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1d670 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d680 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1d690 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68 61  more readers tha
1d6a0 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69  n slots are avai
1d6b0 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09  lable!");.......
1d6c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1d6d0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1d6e0 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1d6f0 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73  reader: %s", pcs
1d700 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09  c_readers);.....
1d710 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65  ../* Only update
1d720 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f   the list of slo
1d730 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63 74  ts if we are act
1d740 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65  ually being aske
1d750 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f  d supply the slo
1d760 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  t information */
1d770 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c  ......if (pSlotL
1d780 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20  ist) {.......if 
1d790 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  (slot_reset) {..
1d7a0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1d7b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1d7c0 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09  ive = 1;........
1d7d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d7e0 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  rslot].internal 
1d7f0 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
1d800 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d810 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1d820 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65 61   strdup(pcsc_rea
1d830 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61  ders);........ca
1d840 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d850 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  lot].pcsc_card_c
1d860 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09  onnected = 0;...
1d870 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1d880 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
1d890 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
1d8a0 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1d8b0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1d8c0 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  .transaction_nee
1d8d0 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09  d_hw_lock = 0;..
1d8e0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1d8f0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b  ts[currslot].tok
1d900 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
1d910 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09  OGIN_REQUIRED;..
1d920 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1d930 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62  ts[currslot].lab
1d940 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  el = NULL;......
1d950 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
1d960 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65  lot_reset(&cacke
1d970 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1d980 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  ]);.......}.....
1d990 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
1d9a0 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20  /* Artificially 
1d9b0 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d  increase the num
1d9c0 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c  ber of active sl
1d9d0 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c  ots by what will
1d9e0 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a   become active *
1d9f0 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75  /.......slot_cou
1da00 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  nt++;......}....
1da10 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09  ..currslot++;...
1da20 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1da30 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f   += curr_reader_
1da40 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a  len + 1;.....}..
1da50 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f  ....for (currslo
1da60 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20  t = 0; currslot 
1da70 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1da80 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1da90 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1daa0 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20  )); currslot++) 
1dab0 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b 65  {......if (cacke
1dac0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1dad0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
1dae0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1daf0 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74  RINTF("Found act
1db00 69 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28  ive slot %lu", (
1db10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
1db20 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09  urrslot);.......
1db30 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09  .slot_count++;..
1db40 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d  ....}.....}....}
1db50 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b   else {.....CACK
1db60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1db70 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20  "Second call to 
1db80 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1db90 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
1dba0 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
1dbb0 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
1dbc0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
1dbd0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1dbe0 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
1dbf0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
1dc00 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28  ;....}.....free(
1dc10 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b  pcsc_readers_s);
1dc20 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
1dc30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dc40 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74  TF("First call t
1dc50 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
1dc60 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
1dc70 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
1dc80 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
1dc90 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
1dca0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1dcb0 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
1dcc0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1dcd0 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  t);...}..}...mut
1dce0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1dcf0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1dd00 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1dd10 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1dd20 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1dd30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dd40 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1dd50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1dd60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1dd70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1dd80 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20  ..if (pSlotList 
1dd90 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75  == NULL) {...*pu
1dda0 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f  lCount = slot_co
1ddb0 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  unt;....CACKEY_D
1ddc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1ddd0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1dde0 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
1ddf0 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20  eaders, but not 
1de00 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c  storing IDs (pSl
1de10 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22  otList == NULL)"
1de20 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67  , CKR_OK, (unsig
1de30 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63  ned long) slot_c
1de40 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
1de50 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63  (CKR_OK);..}...c
1de60 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74  ount = *pulCount
1de70 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73  ;..if (count < s
1de80 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43  lot_count) {...C
1de90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dea0 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
1deb0 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
1dec0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68 61  tries, but we ha
1ded0 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22  ve %lu entries."
1dee0 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f  , count, slot_co
1def0 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  unt);....CACKEY_
1df00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1df10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46  turning CKR_BUFF
1df20 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a  ER_TOO_SMALL");.
1df30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
1df40 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
1df50 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ...}...mutex_ret
1df60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1df70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1df80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1df90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1dfa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dfb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dfc0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1dfd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1dfe0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1dff0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78  );..}...slot_idx
1e000 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
1e010 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73  slot = 0; (currs
1e020 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1e030 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1e040 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1e050 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f  s[0]))); currslo
1e060 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  t++) {...if (!ca
1e070 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1e080 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1e090 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
1e0a0 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20  ...if (slot_idx 
1e0b0 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  >= count) {....C
1e0c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e0d0 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20  TF("Error. User 
1e0e0 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e  allocated %lu en
1e0f0 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75  tries, but we ju
1e100 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69 74  st tried to writ
1e110 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64  e to the %lu ind
1e120 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c  ex -- ignoring",
1e130 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78   count, slot_idx
1e140 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  );.....continue;
1e150 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73  ...}....pSlotLis
1e160 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75  t[slot_idx] = cu
1e170 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69  rrslot;...slot_i
1e180 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  dx++;..}...mutex
1e190 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e1a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e1b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e1c0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e1d0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e1e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e1f0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e200 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e210 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e220 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e230 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74  *pulCount = slot
1e240 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59  _count;...CACKEY
1e250 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e260 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1e270 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
1e280 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f   readers.", CKR_
1e290 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
1e2a0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
1e2b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1e2c0 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e  );...tokenPresen
1e2d0 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74  t = tokenPresent
1e2e0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
1e2f0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
1e300 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45  ning */.}..CK_DE
1e310 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1e320 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e  _RV, C_GetSlotIn
1e330 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
1e340 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49  lotID, CK_SLOT_I
1e350 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1e360 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1e370 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70  CHAR slotDescrip
1e380 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
1e390 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74   Slot";..int mut
1e3a0 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1e3b0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
1e3c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e3d0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1e3e0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1e3f0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1e400 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e410 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1e420 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1e430 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1e440 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1e450 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1e460 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1e470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e480 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1e490 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1e4a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1e4b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1e4c0 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
1e4d0 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1e4e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1e4f0 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1e500 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1e510 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1e520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e530 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1e540 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1e550 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1e560 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1e570 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1e580 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
1e590 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1e5a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1e5b0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1e5c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1e5d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1e5e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1e5f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e600 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1e610 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1e620 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1e630 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1e640 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e650 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1e660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e680 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1e690 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1e6a0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1e6b0 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1e6c0 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1e6d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1e6e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1e6f0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1e700 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1e710 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1e720 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69  CKF_HW_SLOT;...i
1e730 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
1e740 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61  [slotID].interna
1e750 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  l) {...pInfo->fl
1e760 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56  ags |= CKF_REMOV
1e770 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a  ABLE_DEVICE;..}.
1e780 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
1e790 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
1e7a0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1e7b0 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) == CACKEY_PCSC
1e7c0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
1e7d0 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
1e7e0 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50  s |= CKF_TOKEN_P
1e7f0 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74  RESENT;..}...byt
1e800 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72  es_to_copy = str
1e810 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  len(cackey_slots
1e820 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
1e830 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65  ader);..if (size
1e840 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1e850 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74 65  cturerID) < byte
1e860 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62  s_to_copy) {...b
1e870 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
1e880 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1e890 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d  ufacturerID);..}
1e8a0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1e8b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1e8c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1e8d0 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  tID].pcsc_reader
1e8e0 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
1e8f0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
1e900 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1e910 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1e920 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1e930 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1e940 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e950 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e960 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1e970 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e980 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1e990 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  R);..}...memset(
1e9a0 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1e9b0 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a  iption, ' ', siz
1e9c0 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  eof(pInfo->slotD
1e9d0 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d  escription));..m
1e9e0 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f  emcpy(pInfo->slo
1e9f0 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c  tDescription, sl
1ea00 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
1ea10 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69  izeof(slotDescri
1ea20 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d  ption) - 1);...m
1ea30 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
1ea40 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
1ea50 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1ea60 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
1ea70 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
1ea80 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
1ea90 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1eaa0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
1eab0 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
1eac0 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1ead0 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
1eae0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
1eaf0 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
1eb00 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
1eb10 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
1eb20 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
1eb30 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
1eb40 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f   0x00;...CACKEY_
1eb50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1eb60 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1eb70 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1eb80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1eb90 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1eba0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ebb0 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b  GetTokenInfo)(CK
1ebc0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1ebd0 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50   CK_TOKEN_INFO_P
1ebe0 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
1ebf0 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
1ec00 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d  manufacturerID[]
1ec10 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d   = "U.S. Governm
1ec20 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ent";..static CK
1ec30 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75 6c  _UTF8CHAR defaul
1ec40 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e  tLabel[] = "Unkn
1ec50 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61  own Token";..sta
1ec60 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
1ec70 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54  model[] = "CAC T
1ec80 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63  oken";..struct c
1ec90 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
1eca0 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69  ity *pcsc_identi
1ecb0 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
1ecc0 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a  long num_certs;.
1ecd0 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72  .ssize_t label_r
1ece0 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
1ecf0 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f  etval;..int use_
1ed00 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a  default_label;..
1ed10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ed20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1ed30 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1ed40 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1ed50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ed60 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1ed70 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1ed80 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1ed90 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1eda0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1edb0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1edc0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1edd0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1ede0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1edf0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1ee00 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1ee10 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
1ee20 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
1ee30 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
1ee40 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1ee50 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1ee60 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
1ee70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ee80 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1ee90 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1eea0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
1eeb0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
1eec0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
1eed0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
1eee0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1eef0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ef00 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
1ef10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ef20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1ef30 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1ef40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ef50 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
1ef60 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1ef70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1ef80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
1ef90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1efa0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
1efb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1efc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1efd0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1efe0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
1eff0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
1f000 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
1f010 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
1f020 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1f030 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
1f040 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1f050 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1f060 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65  .if (cackey_toke
1f070 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65  n_present(&cacke
1f080 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29  y_slots[slotID])
1f090 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1f0a0 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20  S_TOKENPRESENT) 
1f0b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f0c0 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65  _PRINTF("No toke
1f0d0 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  n is present in 
1f0e0 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73  slotID = %lu", s
1f0f0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1f100 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f110 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f120 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
1f130 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29  KEN_NOT_PRESENT)
1f140 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1f150 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1f160 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1f170 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1f180 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1f190 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1f1a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f1b0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1f1c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1f1d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1f1e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  RROR);..}.../* D
1f1f0 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c  etermine token l
1f200 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66  abel from certif
1f210 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65  icates */..memse
1f220 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  t(pInfo->label, 
1f230 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1f240 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65  o->label));..use
1f250 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
1f260 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79   1;...if (cackey
1f270 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1f280 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  abel == NULL) {.
1f290 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  ..pcsc_identitie
1f2a0 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1f2b0 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c  certs(&cackey_sl
1f2c0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c  ots[slotID], NUL
1f2d0 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a  L, &num_certs);.
1f2e0 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
1f2f0 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
1f300 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74  ....if (num_cert
1f310 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62  s > 0) {.....lab
1f320 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  el_ret = cackey_
1f330 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
1f340 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e  _label(pcsc_iden
1f350 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c  tities, pInfo->l
1f360 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e  abel, sizeof(pIn
1f370 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09  fo->label));....
1f380 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e  .if (label_ret >
1f390 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64   0) {......use_d
1f3a0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
1f3b0 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1f3c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1f3d0 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  el = malloc(size
1f3e0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1f3f0 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  );.......memcpy(
1f400 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f410 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66  tID].label, pInf
1f420 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
1f430 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1f440 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
1f450 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1f460 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
1f470 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
1f480 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a  ;...}..} else {.
1f490 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1f4a0 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c  label, cackey_sl
1f4b0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1f4c0 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  l, sizeof(pInfo-
1f4d0 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65  >label));....use
1f4e0 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
1f4f0 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65   0;..}...if (use
1f500 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20  _default_label) 
1f510 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
1f520 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74  ->label, default
1f530 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65  Label, sizeof(de
1f540 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29  faultLabel) - 1)
1f550 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
1f560 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1f570 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  rID, ' ', sizeof
1f580 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1f590 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70  urerID));..memcp
1f5a0 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  y(pInfo->manufac
1f5b0 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63  turerID, manufac
1f5c0 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28  turerID, sizeof(
1f5d0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 20  manufacturerID) 
1f5e0 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  - 1);...memset(p
1f5f0 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27  Info->model, ' '
1f600 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1f610 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79  model));..memcpy
1f620 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d  (pInfo->model, m
1f630 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64  odel, sizeof(mod
1f640 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  el) - 1);...mems
1f650 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c  et(pInfo->serial
1f660 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a  Number, ' ', siz
1f670 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  eof(pInfo->seria
1f680 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d  lNumber));...mem
1f690 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  set(pInfo->utcTi
1f6a0 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  me, ' ', sizeof(
1f6b0 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29  pInfo->utcTime))
1f6c0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77  ;...pInfo->hardw
1f6d0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  areVersion.major
1f6e0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1f6f0 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
1f700 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68   0xff;..pInfo->h
1f710 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1f720 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
1f730 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
1f740 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66  ) & 0xff;...pInf
1f750 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
1f760 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b  on.major = 0x00;
1f770 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72  ..pInfo->firmwar
1f780 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
1f790 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   0x00;...pInfo->
1f7a0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54  flags = CKF_WRIT
1f7b0 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b  E_PROTECTED | CK
1f7c0 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49  F_USER_PIN_INITI
1f7d0 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b  ALIZED | CKF_TOK
1f7e0 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c  EN_INITIALIZED |
1f7f0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
1f800 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
1f810 73 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  s;...if (cackey_
1f820 70 69 6e 5f 63 6f 6d 6d 61 6e 64 20 21 3d 20 4e  pin_command != N
1f830 55 4c 4c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ULL) {...pInfo->
1f840 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 50 52 4f  flags |= CKF_PRO
1f850 54 45 43 54 45 44 5f 41 55 54 48 45 4e 54 49 43  TECTED_AUTHENTIC
1f860 41 54 49 4f 4e 5f 50 41 54 48 3b 0a 09 7d 0a 0a  ATION_PATH;..}..
1f870 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73  .pInfo->ulMaxSes
1f880 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a  sionCount = (siz
1f890 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1f8a0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1f8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1f8c0 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e  )) - 1;..pInfo->
1f8d0 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  ulSessionCount =
1f8e0 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1f8f0 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1f900 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73  nfo->ulMaxRwSess
1f910 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70  ionCount = 0;..p
1f920 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f  Info->ulRwSessio
1f930 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
1f940 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1f950 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
1f960 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a  axPinLen = 128;.
1f970 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e  .pInfo->ulMinPin
1f980 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  Len = 0;..pInfo-
1f990 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65  >ulTotalPublicMe
1f9a0 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1f9b0 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1f9c0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65  N;..pInfo->ulFre
1f9d0 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20  ePublicMemory = 
1f9e0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1f9f0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1fa00 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61  fo->ulTotalPriva
1fa10 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
1fa20 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1fa30 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1fa40 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f  lFreePrivateMemo
1fa50 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
1fa60 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1fa70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fa80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1fa90 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1faa0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1fab0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1fac0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1fad0 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f  (CK_RV, C_WaitFo
1fae0 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46  rSlotEvent)(CK_F
1faf0 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53  LAGS flags, CK_S
1fb00 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
1fb10 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ID, CK_VOID_PTR 
1fb20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41  pReserved) {..CA
1fb30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fb40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fb50 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
1fb60 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1fb70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fb80 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
1fb90 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1fba0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1fbb0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1fbc0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1fbd0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1fbe0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fbf0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1fc00 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1fc10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fc20 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1fc30 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1fc40 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d  /* XXX: TODO: Im
1fc50 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20  plement this... 
1fc60 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  */..CACKEY_DEBUG
1fc70 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1fc80 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
1fc90 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
1fca0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
1fcb0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
1fcc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
1fcd0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1fce0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
1fcf0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1fd00 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e  _RV, C_GetMechan
1fd10 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54  ismList)(CK_SLOT
1fd20 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d  _ID slotID, CK_M
1fd30 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54  ECHANISM_TYPE_PT
1fd40 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  R pMechanismList
1fd50 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
1fd60 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
1fd70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1fd80 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1fd90 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1fda0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1fdb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fdc0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1fdd0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1fde0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1fdf0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1fe00 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
1fe10 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20  lCount == NULL) 
1fe20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fe30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fe40 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c   pulCount is NUL
1fe50 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1fe60 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1fe70 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
1fe80 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e  chanismList == N
1fe90 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75  ULL) {...*pulCou
1fea0 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45  nt = 1;....CACKE
1feb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fec0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1fed0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1fee0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1fef0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75  K);..}...if (*pu
1ff00 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09  lCount < 1) {...
1ff10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff20 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66  NTF("Error.  Buf
1ff30 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29  fer too small.")
1ff40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1ff50 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1ff60 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69  );..}...pMechani
1ff70 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f  smList[0] = CKM_
1ff80 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43  RSA_PKCS;..*pulC
1ff90 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  ount = 1;...CACK
1ffa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ffb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ffc0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1ffd0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1ffe0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1fff0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20000 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49   C_GetMechanismI
20010 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
20020 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41  slotID, CK_MECHA
20030 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20  NISM_TYPE type, 
20040 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46  CK_MECHANISM_INF
20050 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
20060 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
20070 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
20080 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20090 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
200a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
200b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
200c0 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
200d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
200e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
200f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
20100 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20110 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20120 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20130 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20140 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20150 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
20160 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
20170 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
20180 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
20190 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
201a0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
201b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
201c0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
201d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
201e0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
201f0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
20200 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
20210 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
20220 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
20230 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
20240 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
20250 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20260 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
20270 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20280 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20290 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
202a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
202b0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
202c0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
202d0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
202e0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
202f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
20300 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
20310 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20330 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20340 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20350 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
20360 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
20370 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
20380 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20390 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
203a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
203b0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
203c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
203d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
203e0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
203f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
20400 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
20410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20430 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
20440 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20450 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
20460 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
20470 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20  (type) {...case 
20480 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09  CKM_RSA_PKCS:...
20490 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79  .pInfo->ulMinKey
204a0 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70  Size = 512;....p
204b0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69  Info->ulMaxKeySi
204c0 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49  ze = 8192;....pI
204d0 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46  nfo->flags = CKF
204e0 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50  _HW | CKF_ENCRYP
204f0 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20  T | CKF_DECRYPT 
20500 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46  | CKF_SIGN | CKF
20510 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61  _VERIFY;....brea
20520 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  k;..}...CACKEY_D
20530 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20540 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
20550 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
20560 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
20570 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73  }../* We don't s
20580 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68  upport this meth
20590 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  od. */.CK_DEFINE
205a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
205b0 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b   C_InitToken)(CK
205c0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
205d0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
205e0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
205f0 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46  ulPinLen, CK_UTF
20600 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c  8CHAR_PTR pLabel
20610 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
20620 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20630 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
20640 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
20650 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20660 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20670 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
20680 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20690 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
206a0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
206b0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
206c0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
206d0 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  g CKR_TOKEN_WRIT
206e0 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29  E_PROTECTED (%i)
206f0 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ", CKR_TOKEN_WRI
20700 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a  TE_PROTECTED);..
20710 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
20720 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
20730 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e  D);.}../* We don
20740 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20  't support this 
20750 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45  method. */.CK_DE
20760 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20770 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28  _RV, C_InitPIN)(
20780 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
20790 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
207a0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
207b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
207c0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
207d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
207e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
207f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20800 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20820 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
20830 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
20840 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
20850 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
20860 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
20870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
20880 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  ning CKR_TOKEN_W
20890 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28  RITE_PROTECTED (
208a0 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f  %i)", CKR_TOKEN_
208b0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
208c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ;...return(CKR_T
208d0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
208e0 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20  CTED);.}../* We 
208f0 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68  don't support th
20900 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b  is method. */.CK
20910 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20920 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e  (CK_RV, C_SetPIN
20930 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20940 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20950 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f  _UTF8CHAR_PTR pO
20960 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ldPin, CK_ULONG 
20970 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f  ulOldPinLen, CK_
20980 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65  UTF8CHAR_PTR pNe
20990 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  wPin, CK_ULONG u
209a0 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  lNewPinLen) {..C
209b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
209c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
209d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
209e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
209f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20a00 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20a10 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20a20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20a30 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20a40 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
20a50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20a60 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20a70 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
20a80 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
20a90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20aa0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
20ab0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
20ac0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
20ad0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20ae0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20af0 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f  OpenSession)(CK_
20b00 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
20b10 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20  CK_FLAGS flags, 
20b20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
20b30 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54  lication, CK_NOT
20b40 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53  IFY notify, CK_S
20b50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54  ESSION_HANDLE_PT
20b60 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  R phSession) {..
20b70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
20b80 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
20b90 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64  tval;..int found
20ba0 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09  _session = 0;...
20bb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20bc0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20bd0 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43  ..if ((flags & C
20be0 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f  KF_SERIAL_SESSIO
20bf0 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c  N) != CKF_SERIAL
20c00 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65  _SESSION) {...re
20c10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20c20 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55  _PARALLEL_NOT_SU
20c30 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69  PPORTED);..}...i
20c40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
20c50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
20c60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20c70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
20c80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
20c90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20ca0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20cb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
20cc0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
20cd0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
20ce0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
20cf0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
20d00 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
20d10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20d20 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
20d30 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
20d40 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
20d50 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
20d60 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
20d70 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
20d80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
20d90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
20da0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
20db0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20dc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20dd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20df0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
20e00 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20e10 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
20e20 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
20e30 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
20e40 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
20e50 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
20e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20e70 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
20e80 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
20e90 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
20ea0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
20eb0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
20ec0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
20ed0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20ee0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
20ef0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
20f00 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
20f10 68 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20  hat the card is 
20f20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20  actually in the 
20f30 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58  slot. */../* XXX
20f40 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  : Check to make 
20f50 73 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20  sure this is in 
20f60 74 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63  the PKCS#11 spec
20f70 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66  ification */..if
20f80 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70   (cackey_token_p
20f90 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73  resent(&cackey_s
20fa0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d  lots[slotID]) !=
20fb0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54   CACKEY_PCSC_S_T
20fc0 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09  OKENPRESENT) {..
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 43 61  INTF("Error.  Ca
20ff0 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20  rd not present. 
21000 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44   Returning CKR_D
21010 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b  EVICE_REMOVED");
21020 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21030 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21040 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
21050 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  rn(CKR_DEVICE_RE
21060 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72  MOVED);..}...for
21070 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c   (idx = 1; idx <
21080 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
21090 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
210a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
210b0 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
210c0 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  {...if (!cackey_
210d0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
210e0 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64  tive) {....found
210f0 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09  _session = 1;...
21100 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69  ..*phSession = i
21110 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  dx;.....cackey_s
21120 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
21130 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b  ive = 1;....cack
21140 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
21150 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44  .slotID = slotID
21160 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
21170 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20  ions[idx].state 
21180 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f  = CKS_RO_PUBLIC_
21190 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b  SESSION;....cack
211a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
211b0 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  .flags = flags;.
211c0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
211d0 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65  ns[idx].ulDevice
211e0 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61  Error = 0;....ca
211f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
21200 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20  x].pApplication 
21210 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a  = pApplication;.
21220 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21230 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d  ns[idx].Notify =
21240 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63   notify;.....cac
21250 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21260 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ].identities = N
21270 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ULL;....cackey_s
21280 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
21290 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20  ntities_count = 
212a0 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  0;.....cackey_se
212b0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72  ssions[idx].sear
212c0 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  ch_active = 0;..
212d0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
212e0 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74  ns[idx].sign_act
212f0 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  ive = 0;.....cac
21300 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21310 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
21320 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79   = 0;.....cackey
21330 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
21340 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
21350 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
21360 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
21370 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
21380 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
21390 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
213a0 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
213b0 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
213c0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
213d0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
213e0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
213f0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21400 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21410 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21420 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
21430 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21440 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21450 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21460 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29  (!found_session)
21470 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21480 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21490 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  ing CKR_SESSION_
214a0 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52  COUNT (%i)", CKR
214b0 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
214c0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
214d0 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09  ESSION_COUNT);..
214e0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
214f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21500 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
21510 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
21520 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
21530 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21540 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
21550 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53  Session)(CK_SESS
21560 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
21570 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  ion) {..int mute
21580 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
21590 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
215a0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
215b0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
215c0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
215d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
215e0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
215f0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
21600 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
21610 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
21620 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
21630 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
21640 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
21650 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
21660 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
21670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
21680 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
21690 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
216a0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
216b0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
216c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
216d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
216e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
216f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21700 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
21710 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
21720 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
21730 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21740 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21750 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
21760 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
21770 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21780 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
21790 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
217a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
217b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
217c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
217d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
217e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
217f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
21800 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
21810 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
21820 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
21830 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
21840 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
21850 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
21860 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66  e = 0;..cackey_f
21870 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63  ree_identities(c
21880 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21890 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
218a0 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ies, cackey_sess
218b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
218c0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
218d0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
218e0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
218f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21900 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21910 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21920 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21930 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21940 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
21950 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
21960 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
21970 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
21980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21990 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
219a0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
219b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
219c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
219d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
219e0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
219f0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
21a00 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74  tID) {..uint32_t
21a10 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
21a20 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
21a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21a40 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21a50 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21a60 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21a70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21a80 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21a90 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21aa0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21ab0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21ac0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
21ad0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
21ae0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
21af0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
21b00 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21b10 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21b20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21b30 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21b40 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21b50 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
21b60 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
21b70 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
21b80 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
21b90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21ba0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21bb0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21bc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21bd0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21be0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21bf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21c00 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21c10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21c20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21c30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21c40 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21c50 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21c60 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21c70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21c80 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21c90 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21ca0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
21cb0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
21cc0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21cd0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21ce0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21cf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
21d00 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
21d10 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
21d20 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
21d30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
21d40 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
21d50 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
21d60 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
21d70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
21d80 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
21d90 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
21da0 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
21db0 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09  != slotID) {....
21dc0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
21dd0 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21de0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21df0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c  iglock);....C_Cl
21e00 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
21e10 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
21e20 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
21e30 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  lock);...}..}...
21e40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21e50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21e60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21e70 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21e80 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21e90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21ea0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
21eb0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21ec0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21ed0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21ee0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
21ef0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
21f00 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
21f10 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
21f20 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
21f30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21f40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
21f50 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53  essionInfo)(CK_S
21f60 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21f70 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49  ession, CK_SESSI
21f80 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  ON_INFO_PTR pInf
21f90 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
21fa0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
21fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21fc0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21fd0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
21fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21ff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
22000 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
22010 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
22020 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
22030 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22040 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22050 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22060 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22070 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22080 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22090 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
220a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
220b0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
220c0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
220d0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
220e0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
220f0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
22100 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
22110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22120 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
22130 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
22140 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
22150 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
22160 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
22170 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
22180 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
22190 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
221a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
221b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
221c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
221d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
221e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
221f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22200 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22210 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
22220 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22230 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
22240 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
22250 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22260 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
22270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22280 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
22290 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
222a0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
222b0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
222c0 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c  ;..}...pInfo->sl
222d0 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
222e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
222f0 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d  .slotID;..pInfo-
22300 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f  >state = cackey_
22310 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22320 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f  n].state;..pInfo
22330 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79  ->flags = cackey
22340 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22350 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66  on].flags;..pInf
22360 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  o->ulDeviceError
22370 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
22380 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44  ns[hSession].ulD
22390 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75  eviceError;...mu
223a0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
223b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
223c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
223d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
223e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
223f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22400 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
22410 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22420 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22430 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22440 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22450 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22460 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
22470 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
22480 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
22490 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
224a0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65  (CK_RV, C_GetOpe
224b0 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f  rationState)(CK_
224c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
224d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
224e0 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53  _PTR pOperationS
224f0 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  tate, CK_ULONG_P
22500 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53  TR pulOperationS
22510 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tateLen) {..CACK
22520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22530 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22540 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22550 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22570 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22580 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22590 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
225a0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
225b0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
225c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
225d0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
225e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
225f0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22600 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22610 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
22620 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22630 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
22640 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22650 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74  ION(CK_RV, C_Set
22660 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28  OperationState)(
22670 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22680 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
22690 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69  YTE_PTR pOperati
226a0 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  onState, CK_ULON
226b0 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61  G ulOperationSta
226c0 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  teLen, CK_OBJECT
226d0 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74  _HANDLE hEncrypt
226e0 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ionKey, CK_OBJEC
226f0 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e  T_HANDLE hAuthen
22700 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09  ticationKey) {..
22710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22720 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22730 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22740 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22760 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22770 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22780 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22790 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
227a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
227b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
227c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
227d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
227e0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
227f0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22800 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22810 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22820 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22830 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22840 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22850 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49  _Login)(CK_SESSI
22860 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22870 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45  on, CK_USER_TYPE
22880 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54   userType, CK_UT
22890 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
228a0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
228b0 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  en) {..CK_SLOT_I
228c0 44 20 73 6c 6f 74 49 44 3b 0a 09 46 49 4c 45 20  D slotID;..FILE 
228d0 2a 70 69 6e 66 64 3b 0a 09 63 68 61 72 20 2a 70  *pinfd;..char *p
228e0 69 6e 63 6d 64 2c 20 70 69 6e 62 75 66 5b 36 34  incmd, pinbuf[64
228f0 5d 2c 20 2a 66 67 65 74 73 5f 72 65 74 3b 0a 09  ], *fgets_ret;..
22900 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22910 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
22920 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
22930 69 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 70 63 6c  in_ret;..int pcl
22940 6f 73 65 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ose_ret;...CACKE
22950 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22960 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
22970 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
22980 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
22990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
229a0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
229b0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
229c0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
229d0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
229e0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
229f0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
22a00 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
22a10 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
22a20 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
22a30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
22a40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22a50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22a60 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
22a70 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
22a80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
22a90 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
22aa0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  ID);..}...if (us
22ab0 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53  erType != CKU_US
22ac0 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ER) {...CACKEY_D
22ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22ae0 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70  or.  We only sup
22af0 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20  port USER mode, 
22b00 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f  asked for %lu mo
22b10 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  de.", (unsigned 
22b20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a  long) userType).
22b30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53  ...return(CKR_US
22b40 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  ER_TYPE_INVALID)
22b50 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
22b60 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
22b70 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
22b80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22b90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22ba0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22bb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22bc0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
22bd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22be0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22bf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
22c00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22c10 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
22c20 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22c30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
22c40 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
22c50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c60 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
22c70 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
22c80 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
22c90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
22ca0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
22cb0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
22cc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
22cd0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
22ce0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
22cf0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
22d00 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
22d10 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
22d20 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
22d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22d40 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
22d50 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
22d60 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
22d70 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
22d80 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
22d90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22da0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
22db0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22dc0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
22dd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22de0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22df0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
22e00 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
22e10 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
22e20 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
22e30 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
22e40 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22e50 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
22e60 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
22e70 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 70  L_ERROR);..}...p
22e80 69 6e 63 6d 64 20 3d 20 63 61 63 6b 65 79 5f 70  incmd = cackey_p
22e90 69 6e 5f 63 6f 6d 6d 61 6e 64 3b 0a 09 69 66 20  in_command;..if 
22ea0 28 70 69 6e 63 6d 64 20 21 3d 20 4e 55 4c 4c 29  (pincmd != NULL)
22eb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22ec0 47 5f 50 52 49 4e 54 46 28 22 43 41 43 4b 45 59  G_PRINTF("CACKEY
22ed0 5f 50 49 4e 5f 43 4f 4d 4d 41 4e 44 20 3d 20 25  _PIN_COMMAND = %
22ee0 73 22 2c 20 70 69 6e 63 6d 64 29 3b 0a 0a 09 09  s", pincmd);....
22ef0 69 66 20 28 70 50 69 6e 20 21 3d 20 4e 55 4c 4c  if (pPin != NULL
22f00 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
22f10 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74  BUG_PRINTF("Prot
22f20 65 63 74 65 64 20 61 75 74 68 65 6e 74 69 63 61  ected authentica
22f30 74 69 6f 6e 20 70 61 74 68 20 69 6e 20 65 66 66  tion path in eff
22f40 65 63 74 20 61 6e 64 20 50 49 4e 20 70 72 6f 76  ect and PIN prov
22f50 69 64 65 64 20 21 3f 22 29 3b 0a 09 09 7d 0a 0a  ided !?");...}..
22f60 09 09 70 69 6e 66 64 20 3d 20 70 6f 70 65 6e 28  ..pinfd = popen(
22f70 70 69 6e 63 6d 64 2c 20 22 72 22 29 3b 0a 09 09  pincmd, "r");...
22f80 69 66 20 28 70 69 6e 66 64 20 3d 3d 20 4e 55 4c  if (pinfd == NUL
22f90 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
22fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22fb0 6f 72 2e 20 20 25 73 3a 20 55 6e 61 62 6c 65 20  or.  %s: Unable 
22fc0 74 6f 20 72 75 6e 22 2c 20 70 69 6e 63 6d 64 29  to run", pincmd)
22fd0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  ;.....cackey_mut
22fe0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22ff0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
23000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23010 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
23020 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20  R_PIN_INCORRECT 
23030 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52  (%i)", (int) CKR
23040 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
23050 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23060 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
23070 09 09 7d 0a 0a 09 09 66 67 65 74 73 5f 72 65 74  ..}....fgets_ret
23080 20 3d 20 66 67 65 74 73 28 70 69 6e 62 75 66 2c   = fgets(pinbuf,
23090 20 73 69 7a 65 6f 66 28 70 69 6e 62 75 66 29 2c   sizeof(pinbuf),
230a0 20 70 69 6e 66 64 29 3b 0a 09 09 69 66 20 28 66   pinfd);...if (f
230b0 67 65 74 73 5f 72 65 74 20 3d 3d 20 4e 55 4c 4c  gets_ret == NULL
230c0 29 20 7b 0a 09 09 09 70 69 6e 62 75 66 5b 30 5d  ) {....pinbuf[0]
230d0 20 3d 20 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09   = '\0';...}....
230e0 70 63 6c 6f 73 65 5f 72 65 74 20 3d 20 70 63 6c  pclose_ret = pcl
230f0 6f 73 65 28 70 69 6e 66 64 29 3b 0a 09 09 69 66  ose(pinfd);...if
23100 20 28 70 63 6c 6f 73 65 5f 72 65 74 20 21 3d 20   (pclose_ret != 
23110 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
23120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23130 6f 72 2e 20 20 25 73 3a 20 65 78 69 74 65 64 20  or.  %s: exited 
23140 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 74  with non-zero st
23150 61 74 75 73 20 6f 66 20 25 69 22 2c 20 70 69 6e  atus of %i", pin
23160 63 6d 64 2c 20 70 63 6c 6f 73 65 5f 72 65 74 29  cmd, pclose_ret)
23170 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  ;.....cackey_mut
23180 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23190 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
231a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
231b0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
231c0 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20  R_PIN_INCORRECT 
231d0 28 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52  (%i)", (int) CKR
231e0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b  _PIN_INCORRECT);
231f0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23200 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
23210 09 09 7d 0a 0a 09 09 69 66 20 28 73 74 72 6c 65  ..}....if (strle
23220 6e 28 70 69 6e 62 75 66 29 20 3c 20 31 29 20 7b  n(pinbuf) < 1) {
23230 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23240 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23250 20 25 73 3a 20 72 65 74 75 72 6e 65 64 20 6e 6f   %s: returned no
23260 20 64 61 74 61 22 2c 20 70 69 6e 63 6d 64 29 3b   data", pincmd);
23270 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
23280 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23290 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
232a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
232b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
232c0 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 20 28  _PIN_INCORRECT (
232d0 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
232e0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
232f0 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50  ....return(CKR_P
23300 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09  IN_INCORRECT);..
23310 09 7d 0a 0a 09 09 69 66 20 28 70 69 6e 62 75 66  .}....if (pinbuf
23320 5b 73 74 72 6c 65 6e 28 70 69 6e 62 75 66 29 20  [strlen(pinbuf) 
23330 2d 20 31 5d 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a  - 1] == '\n') {.
23340 09 09 09 70 69 6e 62 75 66 5b 73 74 72 6c 65 6e  ...pinbuf[strlen
23350 28 70 69 6e 62 75 66 29 20 2d 20 31 5d 20 3d 20  (pinbuf) - 1] = 
23360 27 5c 30 27 3b 0a 09 09 7d 0a 0a 09 09 70 50 69  '\0';...}....pPi
23370 6e 20 3d 20 28 43 4b 5f 55 54 46 38 43 48 41 52  n = (CK_UTF8CHAR
23380 5f 50 54 52 29 20 70 69 6e 62 75 66 3b 0a 09 09  _PTR) pinbuf;...
23390 75 6c 50 69 6e 4c 65 6e 20 3d 20 73 74 72 6c 65  ulPinLen = strle
233a0 6e 28 70 69 6e 62 75 66 29 3b 0a 09 7d 0a 0a 09  n(pinbuf);..}...
233b0 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b  login_ret = cack
233c0 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79  ey_login(&cackey
233d0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
233e0 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20  pPin, ulPinLen, 
233f0 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  &tries_remaining
23400 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  );..if (login_re
23410 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
23420 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65  _S_OK) {...cacke
23430 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
23440 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
23450 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ...if (login_ret
23460 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
23470 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43  E_LOCKED) {....C
23480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23490 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65  TF("Error.  Toke
234a0 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a  n is locked.");.
234b0 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
234c0 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
234d0 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52  lags |= CKF_USER
234e0 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09  _PIN_LOCKED;....
234f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23500 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23510 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 28  CKR_PIN_LOCKED (
23520 25 69 29 22 2c 20 28 69 6e 74 29 20 43 4b 52 5f  %i)", (int) CKR_
23530 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 0a 09 09  PIN_LOCKED);....
23540 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f  .return(CKR_PIN_
23550 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73  LOCKED);...} els
23560 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  e if (login_ret 
23570 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
23580 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41  _BADPIN) {....CA
23590 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
235a0 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c  F("Error.  Inval
235b0 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63  id PIN.");.....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 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
235e0 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
235f0 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69  COUNT_LOW;.....i
23600 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  f (tries_remaini
23610 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63  ng == 1) {.....c
23620 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
23630 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
23640 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
23650 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a  FINAL_TRY;....}.
23660 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
23670 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23680 6e 67 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  ng CKR_PIN_INCOR
23690 52 45 43 54 20 28 25 69 29 22 2c 20 28 69 6e 74  RECT (%i)", (int
236a0 29 20 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  ) CKR_PIN_INCORR
236b0 45 43 54 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ECT);.....return
236c0 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45  (CKR_PIN_INCORRE
236d0 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  CT);...}....CACK
236e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
236f0 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e  "Error.  Unknown
23700 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   error returned 
23710 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69  from cackey_logi
23720 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e  n() (%i)", login
23730 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
23740 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23750 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
23760 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
23770 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28  oken_flags &= ~(
23780 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
23790 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  KED | CKF_USER_P
237a0 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43  IN_COUNT_LOW | C
237b0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
237c0 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
237d0 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63  _FINAL_TRY);...c
237e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
237f0 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d  Session].state =
23800 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e   CKS_RO_USER_FUN
23810 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f  CTIONS;...mutex_
23820 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23830 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23840 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
23850 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
23860 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
23870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23880 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
23890 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
238a0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
238b0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
238c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
238d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
238e0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
238f0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
23900 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
23910 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23920 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b  RV, C_Logout)(CK
23930 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23940 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
23950 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
23960 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
23970 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
23980 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23990 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
239a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
239b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
239c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
239d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
239e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
239f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23a00 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23a10 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
23a20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
23a30 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
23a40 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
23a50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
23a60 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
23a70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23a80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
23a90 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
23aa0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
23ab0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
23ac0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23ad0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
23ae0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23af0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
23b00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
23b10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
23b20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23b30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
23b40 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
23b50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23b60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23b70 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23b80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23b90 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
23ba0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23bb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23bc0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
23bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23be0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
23bf0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
23c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
23c10 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
23c20 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44  ID);..}...slotID
23c30 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
23c40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f  ns[hSession].slo
23c50 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49  tID;...if (slotI
23c60 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
23c70 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
23c80 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
23c90 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
23ca0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
23cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
23cc0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
23cd0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
23ce0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
23cf0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
23d00 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
23d10 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23d20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
23d30 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
23d40 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
23d50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23d60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
23d70 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
23d80 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
23d90 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
23da0 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
23db0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
23dc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23dd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
23de0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23df0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
23e00 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23e10 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b  sion].state = CK
23e20 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53  S_RO_PUBLIC_SESS
23e30 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c 6f  ION;..cackey_slo
23e40 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
23e50 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
23e60 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 6d  IN_REQUIRED;...m
23e70 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
23e80 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
23e90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23ea0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
23eb0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
23ec0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23ed0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
23ee0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
23ef0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23f00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23f10 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
23f20 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23f30 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
23f40 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
23f50 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
23f60 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23f70 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74  N(CK_RV, C_Creat
23f80 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  eObject)(CK_SESS
23f90 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23fa0 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ion, CK_ATTRIBUT
23fb0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
23fc0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
23fd0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
23fe0 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74  DLE_PTR phObject
23ff0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
24000 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24010 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24020 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
24030 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24040 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24050 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
24060 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24070 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
24080 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24090 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
240a0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
240b0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
240c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
240d0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
240e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
240f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
24100 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
24110 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
24120 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
24130 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  RV, C_CopyObject
24140 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
24150 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
24160 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
24170 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
24180 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
24190 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
241a0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
241b0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77  HANDLE_PTR phNew
241c0 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45  Object) {..CACKE
241d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
241e0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
241f0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
24200 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
24210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24220 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
24230 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
24240 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
24250 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24260 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
24270 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
24280 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
24290 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
242a0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
242b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
242c0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
242d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
242e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
242f0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24300 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74  ON(CK_RV, C_Dest
24310 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  royObject)(CK_SE
24320 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24330 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
24340 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29  _HANDLE hObject)
24350 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
24360 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
24370 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
24380 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
24390 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
243a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
243b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
243c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
243d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
243e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
243f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24400 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
24410 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
24420 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
24430 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
24440 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
24450 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
24460 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24470 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
24480 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
24490 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69  V, C_GetObjectSi
244a0 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ze)(CK_SESSION_H
244b0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
244c0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
244d0 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f   hObject, CK_ULO
244e0 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20  NG_PTR pulSize) 
244f0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
24500 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
24510 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
24520 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
24530 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24540 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
24550 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
24560 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24570 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
24580 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
24590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
245a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
245b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
245c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
245d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
245e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
245f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
24600 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24610 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
24620 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
24630 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65  , C_GetAttribute
24640 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f  Value)(CK_SESSIO
24650 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
24660 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
24670 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
24680 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
24690 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
246a0 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b  G ulCount) {..CK
246b0 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
246c0 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63  _attr;..struct c
246d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
246e0 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67  identity;..unsig
246f0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
24700 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c  y_idx, attr_idx,
24710 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20   sess_attr_idx, 
24720 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75  num_ids;..int mu
24730 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  tex_retval;..CK_
24740 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
24750 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52  OK;..CK_VOID_PTR
24760 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f   pValue;..CK_ULO
24770 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  NG ulValueLen;..
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 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
247a0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
247b0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
247c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
247d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
247e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
247f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
24800 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
24810 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
24820 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
24830 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
24840 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
24850 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
24860 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24870 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
24880 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24890 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
248a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
248b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
248c0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
248d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
248e0 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30  if (hObject == 0
248f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24900 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24910 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
24920 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
24930 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24940 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  R_OBJECT_HANDLE_
24950 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
24960 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29  f (ulCount == 0)
24970 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
24980 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
24990 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
249a0 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
249b0 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
249c0 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ely */...CACKEY_
249d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
249e0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
249f0 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
24a00 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
24a10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
24a20 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70  ;..}...if (pTemp
24a30 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  late == NULL) {.
24a40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24a50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
24a60 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c  Template is NULL
24a70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
24a80 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
24a90 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
24aa0 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d  _idx = hObject -
24ab0 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76   1;...mutex_retv
24ac0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
24ad0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
24ae0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
24af0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
24b00 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24b10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24b20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
24b30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
24b40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24b50 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
24b60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24b70 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
24b80 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24b90 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24ba0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
24bb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24bc0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
24bd0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
24be0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
24bf0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
24c00 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f  ALID);..}...num_
24c10 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  ids = cackey_ses
24c20 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24c30 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
24c40 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79  ;...if (identity
24c50 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29  _idx >= num_ids)
24c60 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
24c70 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24c80 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
24c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24ca0 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74  ("Error.  Object
24cb0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
24cc0 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f  ange.  identity_
24cd0 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69  idx = %lu, num_i
24ce0 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73  ds = %lu.", (uns
24cf0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e  igned long) iden
24d00 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67  tity_idx, (unsig
24d10 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64  ned long) num_id
24d20 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  s);....return(CK
24d30 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  R_OBJECT_HANDLE_
24d40 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
24d50 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
24d60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24d70 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
24d80 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a  identity_idx];..
24d90 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d  .for (attr_idx =
24da0 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75   0; attr_idx < u
24db0 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78  lCount; attr_idx
24dc0 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74  ++) {...curr_att
24dd0 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61  r = &pTemplate[a
24de0 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61  ttr_idx];....pVa
24df0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c  lue = NULL;...ul
24e00 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c  ValueLen = (CK_L
24e10 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b  ONG) -1;....CACK
24e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24e30 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74  "Looking for att
24e40 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20 28  ribute 0x%08lx (
24e50 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e  identity:%lu) ..
24e60 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
24e70 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74  ng) curr_attr->t
24e80 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ype, (unsigned l
24e90 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
24ea0 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73  x);....for (sess
24eb0 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
24ec0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69  ess_attr_idx < i
24ed0 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75  dentity->attribu
24ee0 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f  tes_count; sess_
24ef0 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
24f00 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61  .if (identity->a
24f10 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
24f20 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d  ttr_idx].type ==
24f30 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65   curr_attr->type
24f40 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
24f50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
24f60 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c  . found it, pVal
24f70 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65  ue = %p, ulValue
24f80 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e  Len = %lu", iden
24f90 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
24fa0 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
24fb0 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79  pValue, identity
24fc0 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
24fd0 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
24fe0 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09  lueLen);........
24ff0 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74  ..pValue = ident
25000 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b  ity->attributes[
25010 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70  sess_attr_idx].p
25020 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  Value;.....ulVal
25030 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  ueLen = identity
25040 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73  ->attributes[ses
25050 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61  s_attr_idx].ulVa
25060 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d  lueLen;....}...}
25070 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74  ....if (curr_att
25080 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61  r->pValue && pVa
25090 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75  lue) {....if (cu
250a0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
250b0 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65  Len >= ulValueLe
250c0 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28  n) {.....memcpy(
250d0 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
250e0 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c  e, pValue, ulVal
250f0 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73  ueLen);....} els
25100 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  e {.....ulValueL
25110 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d  en = (CK_LONG) -
25120 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  1;......retval =
25130 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
25140 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a  SMALL;....}...}.
25150 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  ...curr_attr->ul
25160 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
25170 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ueLen;..}...mute
25180 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
25190 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
251a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
251b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
251c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
251d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
251e0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
251f0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25200 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25210 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25220 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43  .if (retval == C
25230 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  KR_ATTRIBUTE_TYP
25240 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43  E_INVALID) {...C
25250 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25260 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
25270 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45  R_ATTRIBUTE_TYPE
25280 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20  _INVALID (%i)", 
25290 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
252a0 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61  } else if (retva
252b0 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  l == CKR_BUFFER_
252c0 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43  TOO_SMALL) {...C
252d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
252e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
252f0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
25300 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  LL (%i)", (int) 
25310 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
25320 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43   if (retval == C
25330 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
25340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25350 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
25360 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
25370 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  tval);..} else {
25380 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25390 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
253a0 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
253b0 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  val);..}...retur
253c0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
253d0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
253e0 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74  (CK_RV, C_SetAtt
253f0 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f  ributeValue)(CK_
25400 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
25410 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
25420 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
25430 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
25440 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
25450 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
25460 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
25470 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
25480 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
25490 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
254a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
254b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
254c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
254d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
254e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
254f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
25500 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25510 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25520 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
25530 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
25540 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
25550 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
25560 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
25570 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
25580 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
25590 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
255a0 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
255b0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
255c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
255d0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
255e0 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
255f0 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
25600 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  {..CK_SLOT_ID sl
25610 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  otID;..CK_ULONG 
25620 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
25630 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
25640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
25650 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
25660 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
25670 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
25680 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25690 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
256a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
256b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
256c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
256d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
256e0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
256f0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
25700 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25710 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
25720 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
25730 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25740 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
25750 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
25760 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
25770 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
25780 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
25790 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
257a0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
257b0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
257c0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
257d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
257e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
257f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25800 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
25810 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
25820 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25830 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
25840 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25850 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
25860 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
25870 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
25880 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
25890 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
258a0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
258b0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
258c0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
258d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
258e0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
258f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
25900 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
25910 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
25920 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
25930 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25940 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
25950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25960 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65  or.  Search alre
25970 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  ady active.");..
25980 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
25990 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
259a0 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
259b0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
259c0 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
259d0 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
259e0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
259f0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
25a00 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
25a10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
25a20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25a30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25a40 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
25a50 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
25a60 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
25a70 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
25a80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25a90 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
25aa0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
25ab0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
25ac0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
25ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25ae0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
25af0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
25b00 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
25b10 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
25b20 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
25b30 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
25b40 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25b50 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
25b60 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
25b70 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
25b80 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
25b90 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a  ].slot_reset) {.
25ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25bb0 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20  RINTF("The slot 
25bc0 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20 73  has been reset s
25bd0 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f  ince we last loo
25be0 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69  ked for identiti
25bf0 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67  es -- rescanning
25c00 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ");....if (cacke
25c10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25c20 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
25c30 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61  != NULL) {....ca
25c40 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
25c50 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
25c60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
25c70 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
25c80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25c90 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
25ca0 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b  count);.....cack
25cb0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25cc0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
25cd0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b   = NULL;....cack
25ce0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25cf0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
25d00 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a  _count = 0;...}.
25d10 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
25d20 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
25d30 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  l != NULL) {....
25d40 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
25d50 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29  s[slotID].label)
25d60 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ;....cackey_slot
25d70 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
25d80 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63  = NULL;...}....c
25d90 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
25da0 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c  reset(&cackey_sl
25db0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09  ots[slotID]);...
25dc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
25dd0 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  tID].slot_reset 
25de0 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  = 0;..}...if (ca
25df0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25e00 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25e10 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es == NULL) {...
25e20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25e30 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
25e40 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
25e50 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
25e60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25e70 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
25e80 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25e90 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
25ea0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  );..}...if (pTem
25eb0 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  plate != NULL) {
25ec0 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21  ...if (ulCount !
25ed0 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79  = 0) {....cackey
25ee0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25ef0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
25f00 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74  _count = ulCount
25f10 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
25f20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25f30 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61  earch_query = ma
25f40 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73  lloc(ulCount * s
25f50 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65  izeof(*pTemplate
25f60 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ));.....memcpy(c
25f70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25f80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25f90 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65  query, pTemplate
25fa0 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65  , ulCount * size
25fb0 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b  of(*pTemplate));
25fc0 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ....for (idx = 0
25fd0 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  ; idx < ulCount;
25fe0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66   idx++) {.....if
25ff0 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d   (pTemplate[idx]
26000 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30  .ulValueLen == 0
26010 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  ) {......cackey_
26020 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26030 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
26040 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55  idx].pValue = NU
26050 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  LL;.......contin
26060 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......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 73 65 61 72 63 68 5f  Session].search_
26090 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75  query[idx].pValu
260a0 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70  e = malloc(pTemp
260b0 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
260c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  eLen);......if (
260d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
260e0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
260f0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
26100 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  ue) {......memcp
26110 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
26120 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26130 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
26140 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
26150 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65  idx].pValue, pTe
26160 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
26170 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09  lueLen);.....}..
26180 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ..}...} else {..
26190 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
261a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
261b0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
261c0 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   0;....cackey_se
261d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
261e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
261f0 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  NULL;...}..} els
26200 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e  e {...if (ulCoun
26210 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63  t != 0) {....cac
26220 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
26230 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
26240 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
26250 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26260 2e 20 20 53 65 61 72 63 68 20 71 75 65 72 79 20  .  Search query 
26270 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
26280 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66  L, but number of
26290 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74   query terms not
262a0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30 2e   specified as 0.
262b0 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
262c0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
262d0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
262e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
262f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26300 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61  _count = 0;...ca
26310 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26320 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26330 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  uery = NULL;..}.
26340 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
26350 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26360 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  ch_active = 1;..
26370 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26380 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26390 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09  _curr_id = 0;...
263a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
263b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
263c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
263d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
263e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
263f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26400 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
26410 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
26420 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26430 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
26440 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26450 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26460 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
26470 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
26480 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
26490 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
264a0 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
264b0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41  _attributes(CK_A
264c0 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f  TTRIBUTE *a, CK_
264d0 41 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a  ATTRIBUTE *b) {.
264e0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
264f0 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65  smallbuf, *large
26500 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61  buf;..size_t sma
26510 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65  llbuf_len, large
26520 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61  buf_len;...if (a
26530 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70  ->type != b->typ
26540 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29  e) {...return(0)
26550 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26560 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
26570 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69  ... found matchi
26580 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a  ng type ...");..
26590 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
265a0 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20  INTBUF("    ... 
265b0 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e  our value:", a->
265c0 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c  pValue, a->ulVal
265d0 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d  ueLen);...if (b-
265e0 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29  >pValue == NULL)
265f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26600 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20  G_PRINTF("      
26610 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63   ... found wildc
26620 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ard match");....
26630 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
26640 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d  if (a->pValue ==
26650 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
26660 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28  n(0);..}.. .if (
26670 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  b->ulValueLen ==
26680 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26   a->ulValueLen &
26690 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c  & memcmp(a->pVal
266a0 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62  ue, b->pValue, b
266b0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d  ->ulValueLen) ==
266c0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
266d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
266e0 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78      ... found ex
266f0 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  act match");....
26700 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09  return(1);..}...
26710 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29  switch (a->type)
26720 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f   {...case CKA_MO
26730 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d  DULUS:....if (a-
26740 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62  >ulValueLen == b
26750 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  ->ulValueLen) {.
26760 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
26770 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c  ....if (a->ulVal
26780 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c  ueLen > b->ulVal
26790 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61  ueLen) {.....sma
267a0 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  llbuf = b->pValu
267b0 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f  e;.....smallbuf_
267c0 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
267d0 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62  Len;......largeb
267e0 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
267f0 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e  ....largebuf_len
26800 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
26810 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
26820 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e  ..smallbuf = a->
26830 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
26840 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  lbuf_len = a->ul
26850 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
26860 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61  argebuf = b->pVa
26870 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
26880 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
26890 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09  ueLen;....}.....
268a0 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f  for (; largebuf_
268b0 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f  len != smallbuf_
268c0 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c  len; largebuf++,
268d0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20  largebuf_len--) 
268e0 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65 62  {.....if (largeb
268f0 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09  uf[0] != 0) {...
26900 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
26910 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72  ...}.....if (lar
26920 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61  gebuf_len != sma
26930 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09  llbuf_len) {....
26940 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09  .break;....}....
26950 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67  .if (memcmp(larg
26960 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20  ebuf, smallbuf, 
26970 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d  smallbuf_len) ==
26980 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
26990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
269a0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
269b0 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63  approximate matc
269c0 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  h");......return
269d0 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72  (1);....}.....br
269e0 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  eak;..}...return
269f0 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  (0);.}..CK_DEFIN
26a00 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26a10 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29  , C_FindObjects)
26a20 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26a30 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26a40 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
26a50 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  R phObject, CK_U
26a60 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74  LONG ulMaxObject
26a70 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  Count, CK_ULONG_
26a80 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  PTR pulObjectCou
26a90 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  nt) {..struct ca
26aa0 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
26ab0 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52  urr_id;..CK_ATTR
26ac0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
26ad0 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72  ;..CK_ULONG curr
26ae0 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75  _id_idx, curr_ou
26af0 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61  t_id_idx, curr_a
26b00 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
26b10 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e  tr_idx;..CK_ULON
26b20 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  G matched_count,
26b30 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f   prev_matched_co
26b40 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  unt;..int mutex_
26b50 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43  retval;.#ifdef C
26b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
26b70 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74  CH_SPEEDTEST..st
26b80 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61  ruct timeval sta
26b90 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34  rt, end;..uint64
26ba0 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e  _t start_int, en
26bb0 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09  d_int;.#endif...
26bc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26bd0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
26be0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
26bf0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
26c00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26c10 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
26c20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
26c30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
26c40 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
26c50 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
26c60 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   (pulObjectCount
26c70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
26c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26c90 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62  F("Error.  pulOb
26ca0 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c  jectCount is NUL
26cb0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
26cc0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
26cd0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f  D);..}...if (phO
26ce0 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  bject == NULL &&
26cf0 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e   ulMaxObjectCoun
26d00 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  t == 0) {.../* S
26d10 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69 66  hort circuit, if
26d20 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65   zero objects we
26d30 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65 74  re specified ret
26d40 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69  urn zero items i
26d50 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09  mmediately */...
26d60 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20  *pulObjectCount 
26d70 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  = 0;....CACKEY_D
26d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26d90 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
26da0 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
26db0 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
26dc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
26dd0 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65  ..}...if (phObje
26de0 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ct == NULL) {...
26df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f  NTF("Error.  phO
26e10 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29  bject is NULL.")
26e20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26e30 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
26e40 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62  .}...if (ulMaxOb
26e50 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
26e60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26e70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26e80 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
26e90 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69  of objects speci
26ea0 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b  fied as zero.");
26eb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
26ec0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
26ed0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
26ee0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
26ef0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
26f00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
26f10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26f20 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
26f30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26f40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26f50 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
26f60 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
26f70 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
26f80 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26f90 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
26fa0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
26fb0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
26fc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26fd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26fe0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26ff0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27000 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
27010 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27020 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27030 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
27040 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27050 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
27060 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27070 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27080 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
27090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
270a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
270b0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
270c0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
270d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
270e0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
270f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27100 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27110 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
27120 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27130 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27140 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27150 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27160 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
27170 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
27180 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
27190 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
271a0 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43  D);..}..#ifdef C
271b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
271c0 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65  CH_SPEEDTEST..ge
271d0 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72  ttimeofday(&star
271e0 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  t, NULL);.#endif
271f0 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
27200 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
27210 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b  rr_id_idx = cack
27220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27230 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
27240 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64  r_id; curr_id_id
27250 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
27260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
27270 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26  entities_count &
27280 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
27290 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b  nt; curr_id_idx+
272a0 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d  +) {...curr_id =
272b0 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   &cackey_session
272c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
272d0 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69  tities[curr_id_i
272e0 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  dx];....CACKEY_D
272f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f  EBUG_PRINTF("Pro
27300 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79  cessing identity
27310 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64  :%lu", (unsigned
27320 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69   long) curr_id_i
27330 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f  dx);....matched_
27340 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f  count = 0;....fo
27350 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78  r (curr_attr_idx
27360 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
27370 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
27380 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27390 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
273a0 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64  nt; curr_attr_id
273b0 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d  x++) {....prev_m
273c0 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d  atched_count = m
273d0 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09  atched_count;...
273e0 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63  ..curr_attr = &c
273f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27400 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
27410 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f  query[curr_attr_
27420 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59  idx];.....CACKEY
27430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
27440 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74   Checking for at
27450 74 72 69 62 75 74 65 20 25 73 20 28 30 78 25 30  tribute %s (0x%0
27460 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79  8lx) in identity
27470 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f  :%i...", CACKEY_
27480 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49  DEBUG_FUNC_ATTRI
27490 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72  BUTE_TO_STR(curr
274a0 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75  _attr->type), (u
274b0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
274c0 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28  rr_attr->type, (
274d0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
274e0 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
274f0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
27500 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66   Value looking f
27510 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d  or:", curr_attr-
27520 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74  >pValue, curr_at
27530 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  tr->ulValueLen);
27540 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61  .....for (sess_a
27550 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
27560 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72  s_attr_idx < cur
27570 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
27580 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74  _count; sess_att
27590 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  r_idx++) {.....i
275a0 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  f (cackey_pkcs11
275b0 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
275c0 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74  tes(&curr_id->at
275d0 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
275e0 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74  tr_idx], curr_at
275f0 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63  tr)) {......matc
27600 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09  hed_count++;....
27610 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
27620 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74  ...}...../* If t
27630 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f 75  he attribute cou
27640 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65  ld not be matche
27650 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f  d, do not try to
27660 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61   match additiona
27670 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a  l attributes */.
27680 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63  ...if (prev_matc
27690 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74  hed_count == mat
276a0 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  ched_count) {...
276b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09  ..break;....}...
276c0 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64  }....if (matched
276d0 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79  _count == cackey
276e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
276f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
27700 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43  _count) {....CAC
27710 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27720 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61  ("  ... All %i a
27730 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
27740 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64  d for found, add
27750 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20  ing identity:%i 
27760 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74  to returned list
27770 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f  ", (int) cackey_
27780 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
27790 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
277a0 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
277b0 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70  r_id_idx);.....p
277c0 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74  hObject[curr_out
277d0 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f  _id_idx] = curr_
277e0 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09  id_idx + 1;.....
277f0 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
27800 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74  --;.....curr_out
27810 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65  _id_idx++;...} e
27820 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
27830 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
27840 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28  ... Not all %i (
27850 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61  only found %i) a
27860 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b 65  ttributes checke
27870 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74  d for found, not
27880 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79   adding identity
27890 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b  :%i", (int) cack
278a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
278b0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
278c0 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ry_count, (int) 
278d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28  matched_count, (
278e0 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
278f0 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65  );...}..}..cacke
27900 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27910 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
27920 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  _id = curr_id_id
27930 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f  x;..*pulObjectCo
27940 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69  unt = curr_out_i
27950 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43  d_idx;..#ifdef C
27960 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52  ACKEY_DEBUG_SEAR
27970 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65  CH_SPEEDTEST..ge
27980 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c  ttimeofday(&end,
27990 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69   NULL);..start_i
279a0 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73  nt = (start.tv_s
279b0 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20  ec * 1000000) + 
279c0 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09  start.tv_usec;..
279d0 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74  end_int = (end.t
279e0 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29  v_sec * 1000000)
279f0 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a   + end.tv_usec;.
27a00 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  .fprintf(stderr,
27a10 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c   "Search took %l
27a20 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e  u microseconds\n
27a30 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
27a40 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74  g) (end_int - st
27a50 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69  art_int));.#endi
27a60 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  f...mutex_retval
27a70 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
27a80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27a90 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27aa0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27ab0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27ac0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27ad0 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
27ae0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27af0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
27b00 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
27b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27b20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
27b30 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73  %i), num objects
27b40 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c   = %lu", CKR_OK,
27b50 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74   *pulObjectCount
27b60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
27b70 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
27b80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27b90 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  , C_FindObjectsF
27ba0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
27bb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27bc0 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ) {..CK_ULONG id
27bd0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
27be0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
27bf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
27c00 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27c10 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27c20 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27c30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27c40 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27c50 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27c60 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27c70 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27c80 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
27c90 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
27ca0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
27cb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
27cc0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
27cd0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
27ce0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27cf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27d00 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
27d10 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
27d20 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
27d30 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
27d40 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
27d50 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
27d60 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
27d70 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
27d80 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27d90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27da0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27db0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
27dc0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
27dd0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
27de0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
27df0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27e00 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
27e10 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
27e20 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
27e30 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
27e40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27e50 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
27e60 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
27e70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27e80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27e90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
27ea0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
27eb0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
27ec0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
27ed0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
27ee0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27ef0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
27f00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27f10 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
27f20 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
27f30 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
27f40 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
27f50 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ZED);..}...cacke
27f60 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27f70 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
27f80 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69  ve = 0;...for (i
27f90 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61  dx = 0; idx < ca
27fa0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27fb0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
27fc0 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b  uery_count; idx+
27fd0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
27fe0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27ff0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
28000 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b  y[idx].pValue) {
28010 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
28020 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28030 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
28040 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09  idx].pValue);...
28050 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  }..}...if (cacke
28060 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28070 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
28080 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b  y) {...free(cack
28090 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
280a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
280b0 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ry);..}...mutex_
280c0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
280d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
280e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
280f0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28100 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
28110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28120 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
28130 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
28140 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28150 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
28160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28170 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
28180 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
28190 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
281a0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
281b0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
281c0 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  RV, C_EncryptIni
281d0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
281e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
281f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
28200 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
28210 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
28220 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
28230 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
28240 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
28250 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
28260 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28270 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28280 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
28290 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
282a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
282b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
282c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
282d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
282e0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
282f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
28300 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
28310 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
28320 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
28330 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28340 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
28350 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
28360 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28  _RV, C_Encrypt)(
28370 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28380 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
28390 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
283a0 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
283b0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
283c0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
283d0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
283e0 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29  ncryptedDataLen)
283f0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
28400 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28410 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28420 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28430 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28440 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28450 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28460 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28470 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
28480 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28490 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
284a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
284b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
284c0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
284d0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
284e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
284f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
28500 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28510 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
28520 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28530 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61  V, C_EncryptUpda
28540 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
28550 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
28560 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
28570 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
28580 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
28590 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
285a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
285b0 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
285c0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
285d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
285e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
285f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
28600 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
28610 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28620 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
28630 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
28640 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
28650 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
28660 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28670 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28680 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
28690 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
286a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
286b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
286c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
286d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
286e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
286f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28700 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
28710 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
28720 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
28730 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28740 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61 72  LastEncryptedPar
28750 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
28760 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64  pulLastEncrypted
28770 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
28780 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28790 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
287a0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
287b0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
287c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
287d0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
287e0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
287f0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
28800 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
28810 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
28820 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28830 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
28840 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
28850 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
28860 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
28870 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
28880 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
28890 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
288a0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
288b0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
288c0 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53  ryptInit)(CK_SES
288d0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
288e0 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
288f0 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
28900 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
28910 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74  DLE hKey) {..int
28920 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
28930 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45  .hKey--;...CACKE
28940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28950 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28960 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28970 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28990 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
289a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
289b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
289c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
289d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
289e0 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29  chanism == NULL)
289f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28a00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28a10 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e   pMechanism is N
28a20 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
28a30 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
28a40 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
28a50 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
28a60 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f  nism != CKM_RSA_
28a70 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  PKCS) {...CACKEY
28a80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28a90 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
28aa0 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20  ->mechanism not 
28ab0 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d  specified as CKM
28ac0 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09  _RSA_PKCS");....
28ad0 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41  return(CKR_MECHA
28ae0 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c  NISM_PARAM_INVAL
28af0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ID);..}...if (hS
28b00 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
28b10 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
28b20 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
28b30 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
28b40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
28b50 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
28b60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28b70 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
28b80 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
28b90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
28ba0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
28bb0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
28bc0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28bd0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
28be0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28bf0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28c00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28c10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28c20 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28c30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
28c40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28c50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28c60 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28c70 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28c80 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28c90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28ca0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28cc0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28cd0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
28ce0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
28cf0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
28d00 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
28d10 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
28d20 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
28d30 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
28d40 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
28d50 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
28d60 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
28d70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28d80 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
28d90 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
28da0 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
28db0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
28dc0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
28dd0 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
28de0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28df0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
28e00 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
28e10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28e20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28e30 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28e40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28e50 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
28e60 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
28e70 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
28e80 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
28e90 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
28ea0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
28eb0 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
28ec0 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
28ed0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
28ee0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
28ef0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28f00 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
28f10 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
28f20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28f30 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
28f40 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79  ve = 1;...cackey
28f50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28f60 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68  on].decrypt_mech
28f70 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69  anism = pMechani
28f80 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  sm->mechanism;..
28f90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28fa0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
28fb0 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d  t_mech_parm = pM
28fc0 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d  echanism->pParam
28fd0 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65  eter;..cackey_se
28fe0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28ff0 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61  .decrypt_mech_pa
29000 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69  rmlen = pMechani
29010 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c  sm->ulParameterL
29020 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  en;..cackey_sess
29030 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
29040 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20  ecrypt_identity 
29050 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
29060 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
29070 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
29080 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
29090 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
290a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
290b0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
290c0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
290d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
290e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
290f0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
29100 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29110 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29120 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29130 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29140 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
29150 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
29160 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
29170 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
29180 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
29190 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rypt)(CK_SESSION
291a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
291b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
291c0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b  ncryptedData, CK
291d0 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
291e0 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  edDataLen, CK_BY
291f0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
29200 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
29210 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  taLen) {..CK_ULO
29220 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  NG datalen_updat
29230 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  e, datalen_final
29240 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74  ;..CK_RV decrypt
29250 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
29260 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
29270 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29280 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29290 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
292a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
292b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
292c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
292d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
292e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
292f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29300 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
29310 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  DataLen == NULL)
29320 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29330 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29340 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e   pulDataLen is N
29350 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29360 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29370 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c  BAD);..}...datal
29380 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c  en_update = *pul
29390 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79  DataLen;...decry
293a0 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
293b0 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69 6f  ptUpdate(hSessio
293c0 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  n, pEncryptedDat
293d0 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61  a, ulEncryptedDa
293e0 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64  taLen, pData, &d
293f0 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a  atalen_update);.
29400 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74  .if (decrypt_ret
29410 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
29420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
29440 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65 74  ryptUpdate() ret
29450 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
29460 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
29470 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
29480 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20  ypt_ret);....if 
29490 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
294a0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
294b0 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65  MALL) {..../* Te
294c0 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74 69  rminate decrypti
294d0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
294e0 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ....mutex_retval
294f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
29500 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29510 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
29520 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
29530 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
29540 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29550 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
29560 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
29570 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
29580 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  ROR);....}.....i
29590 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
295a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
295b0 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
295c0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
295d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
295e0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
295f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29600 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
29610 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
29620 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
29630 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
29640 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ID);....}.....if
29650 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
29660 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29670 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
29680 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
29690 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
296a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43  glock);......CAC
296b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
296c0 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
296d0 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
296e0 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
296f0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
29700 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29710 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
29720 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29730 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
29740 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f   = 0;.....mutex_
29750 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
29760 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29770 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
29780 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
29790 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
297a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
297b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
297c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
297d0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
297e0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
297f0 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75  ...}...}....retu
29800 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b  rn(decrypt_ret);
29810 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29  ..}...if (pData)
29820 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61   {...pData += da
29830 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d  talen_update;..}
29840 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20  ..datalen_final 
29850 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20  = *pulDataLen - 
29860 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
29870 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20  ..decrypt_ret = 
29880 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68  C_DecryptFinal(h
29890 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20  Session, pData, 
298a0 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b  &datalen_final);
298b0 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
298c0 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
298d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
298e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
298f0 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74  cryptFinal() ret
29900 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
29910 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
29920 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72  igned long) decr
29930 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74  ypt_ret);....ret
29940 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
29950 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c  ;..}...*pulDataL
29960 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en = datalen_upd
29970 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69  ate + datalen_fi
29980 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  nal;...CACKEY_DE
29990 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
299a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
299b0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
299c0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
299d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
299e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
299f0 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
29a00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
29a10 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
29a20 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
29a30 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
29a40 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
29a50 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
29a60 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
29a70 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
29a80 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
29a90 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69  buf[16384];..ssi
29aa0 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b  ze_t buflen;..CK
29ab0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
29ac0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
29ad0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
29ae0 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  OR;..int mutex_r
29af0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
29b00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29b10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29b20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29b30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29b50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29b60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29b70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29b80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29b90 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
29ba0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
29bb0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
29bc0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
29bd0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
29be0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
29bf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29c00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29c10 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
29c20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
29c30 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
29c40 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
29c50 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
29c60 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
29c70 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65  LL && ulEncrypte
29c80 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b  dPartLen == 0) {
29c90 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
29ca0 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73  uit if we are as
29cb0 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e  ked to decrypt n
29cc0 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43  othing... */...C
29cd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29ce0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29cf0 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74  R_OK (%i) (short
29d00 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f   circuit)", CKR_
29d10 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  OK);....return(C
29d20 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20  KR_OK);..}...if 
29d30 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
29d40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
29d50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29d60 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70  ("Error. pEncryp
29d70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  tedPart is NULL,
29d80 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64   but ulEncrypted
29d90 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
29da0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29db0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
29dc0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e  );..}...if (ulEn
29dd0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d  cryptedPartLen =
29de0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
29df0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29e00 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64  ror. ulEncrypted
29e10 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75  PartLen is 0, bu
29e20 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e  t pPart is not N
29e30 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29e40 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29e50 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
29e60 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  ulPartLen == NUL
29e70 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
29e80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29e90 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73  r. pulPartLen is
29ea0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
29eb0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29ec0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
29ed0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
29ee0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
29ef0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
29f00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
29f10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
29f20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29f30 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
29f40 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
29f50 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
29f60 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
29f70 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
29f80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
29f90 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
29fa0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
29fb0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
29fc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29fd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
29fe0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
29ff0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2a000 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a010 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2a020 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2a030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a040 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
2a050 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2a060 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a070 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2a080 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a090 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
2a0a0 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
2a0b0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2a0c0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2a0d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2a0e0 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
2a0f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a100 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
2a110 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
2a120 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
2a130 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2a140 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2a150 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
2a160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a170 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
2a180 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
2a190 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
2a1a0 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
2a1b0 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
2a1c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2a1d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2a1e0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
2a1f0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
2a200 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
2a210 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a220 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2a230 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2a240 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
2a250 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
2a260 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
2a270 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2a280 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2a290 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a2a0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a2b0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63  .}...switch (cac
2a2c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a2d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d  ssion].decrypt_m
2a2e0 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
2a2f0 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
2a300 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20  ..../* Ask card 
2a310 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09  to decrypt */...
2a320 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  .buflen = cackey
2a330 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2a340 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2a350 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2a360 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
2a370 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20  crypt_identity, 
2a380 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2a390 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2a3a0 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  en, buf, sizeof(
2a3b0 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09  buf), 0, 1);....
2a3c0 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29  .if (buflen < 0)
2a3d0 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70   {...../* Decryp
2a3e0 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  tion failed. */.
2a3f0 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d  ....if (buflen =
2a400 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2a410 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
2a420 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
2a430 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
2a440 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
2a450 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b   (buflen == CACK
2a460 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
2a470 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
2a480 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
2a490 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
2a4a0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
2a4b0 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2a4c0 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2a4d0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2a4e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75  nsigned long) bu
2a4f0 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74  flen) > *pulPart
2a500 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a  Len && pPart) {.
2a510 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64  ..../* Decrypted
2a520 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2a530 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20  */.....retval = 
2a540 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2a550 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20  MALL;....} else 
2a560 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74 29  {.....if (pPart)
2a570 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70   {......memcpy(p
2a580 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65  Part, buf, bufle
2a590 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a  n);.....}......*
2a5a0 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66  pulPartLen = buf
2a5b0 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2a5c0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2a5d0 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2a5e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2a5f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a600 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a610 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2a620 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2a630 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a640 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2a650 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2a660 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a670 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2a680 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a690 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a6a0 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
2a6b0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
2a6c0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f  (retval);.}..CK_
2a6d0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a6e0 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2a6f0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2a700 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a710 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a720 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  LastPart, CK_ULO
2a730 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61  NG_PTR pulLastPa
2a740 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  rtLen) {..int mu
2a750 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
2a760 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79   terminate_decry
2a770 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  pt = 1;...CACKEY
2a780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a790 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a7a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a7b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a7c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a7d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a7e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a7f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a800 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a810 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2a820 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2a830 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2a840 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2a850 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2a860 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2a870 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a880 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a890 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2a8a0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2a8b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2a8c0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2a8d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
2a8e0 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  LastPartLen == N
2a8f0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2a900 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a910 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74  ror. pulLastPart
2a920 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
2a930 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2a940 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2a950 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a960 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2a970 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a980 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2a990 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2a9a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a9b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2a9c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2a9d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a9e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a9f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2aa00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2aa10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2aa20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2aa30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2aa40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2aa50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2aa60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2aa70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2aa80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2aa90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2aaa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2aab0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2aac0 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
2aad0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2aae0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2aaf0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ab00 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ab10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ab20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74   Decrypt not act
2ab30 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2ab40 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2ab50 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2ab60 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73  D);..}...*pulLas
2ab70 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09  tPartLen = 0;...
2ab80 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d  if (pLastPart ==
2ab90 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69   NULL) {...termi
2aba0 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30  nate_decrypt = 0
2abb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2abc0 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a  nate_decrypt) {.
2abd0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2abe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
2abf0 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ypt_active = 0;.
2ac00 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2ac10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2ac20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ac30 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2ac40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2ac50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ac60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2ac70 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2ac80 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ac90 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2aca0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2acb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2acc0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2acd0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2ace0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2acf0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ad00 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ad10 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f  _DigestInit)(CK_
2ad20 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ad30 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2ad40 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2ad50 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f  nism) {..CACKEY_
2ad60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ad70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2ad80 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2ad90 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2ada0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2adb0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2adc0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2add0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ade0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2adf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ae00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ae10 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ae20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ae30 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ae40 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ae50 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2ae60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ae70 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2ae80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2ae90 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
2aea0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2aeb0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2aec0 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2aed0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2aee0 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2aef0 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f   pDigest, CK_ULO
2af00 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74  NG_PTR pulDigest
2af10 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2af20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2af30 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2af40 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2af50 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2af60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2af70 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2af80 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2af90 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2afa0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2afb0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2afc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2afd0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2afe0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2aff0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2b000 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2b010 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2b020 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2b030 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2b040 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2b050 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55  CK_RV, C_DigestU
2b060 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2b070 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b080 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b090 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2b0a0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  lPartLen) {..CAC
2b0b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b0c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2b0d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2b0e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2b0f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b100 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2b110 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2b120 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2b130 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2b140 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2b150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b160 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2b170 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2b180 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2b190 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b1a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2b1b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2b1c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2b1d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2b1e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2b1f0 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53  gestKey)(CK_SESS
2b200 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2b210 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
2b220 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2b230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b240 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2b250 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2b260 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2b270 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b280 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2b290 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2b2a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2b2b0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2b2c0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2b2d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b2e0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2b2f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2b300 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2b310 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2b320 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2b330 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2b340 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2b350 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b360 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b370 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f  DigestFinal)(CK_
2b380 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b390 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2b3a0 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b  _PTR pDigest, CK
2b3b0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69  _ULONG_PTR pulDi
2b3c0 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  gestLen) {..CACK
2b3d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b3e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2b3f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2b400 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2b410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b420 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2b430 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2b440 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2b450 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2b460 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2b470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b480 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2b490 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2b4a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2b4b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2b4c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2b4d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2b4e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2b4f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b500 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2b510 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  nInit)(CK_SESSIO
2b520 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2b530 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2b540 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2b550 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2b560 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75   hKey) {..int mu
2b570 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b  tex_retval;...hK
2b580 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ey--;...CACKEY_D
2b590 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2b5a0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2b5b0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2b5c0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2b5d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b5e0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2b5f0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2b600 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2b610 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b620 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
2b630 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  nism == NULL) {.
2b640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b650 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
2b660 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c  echanism is NULL
2b670 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b680 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2b690 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
2b6a0 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
2b6b0 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  m != CKM_RSA_PKC
2b6c0 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
2b6d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b6e0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d  r. pMechanism->m
2b6f0 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65  echanism not spe
2b700 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53  cified as CKM_RS
2b710 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74  A_PKCS");....ret
2b720 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53  urn(CKR_MECHANIS
2b730 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29  M_PARAM_INVALID)
2b740 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2b750 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2b760 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2b770 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2b780 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2b790 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2b7a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b7b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b7c0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2b7d0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2b7e0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2b7f0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2b800 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2b810 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2b820 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2b830 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2b840 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2b850 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b860 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b870 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2b880 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b890 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2b8a0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2b8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b8c0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2b8d0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2b8e0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2b8f0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2b900 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b910 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b920 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2b930 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2b940 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2b950 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2b960 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2b970 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b980 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2b990 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2b9a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b9b0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2b9c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b9d0 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69    Sign already i
2b9e0 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09  n progress.");..
2b9f0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2ba00 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29  PERATION_ACTIVE)
2ba10 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20  ;..}...if (hKey 
2ba20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  >= cackey_sessio
2ba30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2ba40 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b  ntities_count) {
2ba50 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2ba60 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ba70 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2ba80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ba90 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64  Error.  Key hand
2baa0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  le out of range 
2bab0 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 25  (requested key %
2bac0 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65  lu, only %lu ide
2bad0 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c  ntities availabl
2bae0 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  e).", (unsigned 
2baf0 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73  long) hKey, (uns
2bb00 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b  igned long) cack
2bb10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2bb20 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2bb30 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
2bb40 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c  rn(CKR_KEY_HANDL
2bb50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2bb60 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2bb70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bb80 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61  active = 1;...ca
2bb90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2bba0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
2bbb0 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
2bbc0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
2bbd0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2bbe0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2bbf0 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09  _buflen = 128;..
2bc00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bc10 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2bc20 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63  ufused = 0;..cac
2bc30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bc40 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20  ssion].sign_buf 
2bc50 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2bc60 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
2bc70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bc80 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
2bc90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2bca0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a  .sign_buflen);..
2bcb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bcc0 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c  INTF("Session %l
2bcd0 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  u sign_identity 
2bce0 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79 20  is %p (identity 
2bcf0 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  #%lu)", (unsigne
2bd00 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
2bd10 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b  , (void *) &cack
2bd20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2bd30 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2bd40 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65  [hKey], (unsigne
2bd50 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09  d long) hKey);..
2bd60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bd70 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2bd80 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
2bd90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2bda0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
2bdb0 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
2bdc0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2bdd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2bde0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2bdf0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2be00 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2be10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2be20 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
2be30 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2be40 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2be50 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
2be60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2be70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2be80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2be90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2bea0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
2beb0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2bec0 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45  V, C_Sign)(CK_SE
2bed0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2bee0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2bef0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2bf00 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2bf10 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2bf20 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2bf30 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2bf40 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  en) {..unsigned 
2bf50 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f  long start_sign_
2bf60 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20  bufused;..CK_RV 
2bf70 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d  sign_ret;..int m
2bf80 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
2bf90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bfa0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2bfb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2bfc0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2bfd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bfe0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2bff0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2c000 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2c010 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2c020 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
2c030 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
2c040 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
2c050 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
2c060 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
2c070 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c080 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
2c090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c0a0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
2c0b0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
2c0c0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2c0d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2c0e0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74  NVALID);..}...st
2c0f0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2c100 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   = cackey_sessio
2c110 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c120 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67  n_bufused;...sig
2c130 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70  n_ret = C_SignUp
2c140 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70  date(hSession, p
2c150 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29  Data, ulDataLen)
2c160 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ;..if (sign_ret 
2c170 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
2c180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c190 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2c1a0 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65  Update() returne
2c1b0 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2c1c0 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2c1d0 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2c1e0 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72  );....if (sign_r
2c1f0 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52  et != CKR_BUFFER
2c200 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
2c210 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2c220 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2c230 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c240 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2c250 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2c260 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c270 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c280 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2c290 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
2c2a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2c2b0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
2c2c0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2c2d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2c2e0 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  e) {.....cackey_
2c2f0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c300 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2c310 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c320 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c330 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2c340 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65  ve.");........re
2c350 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2c360 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2c370 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21  ;....}.....if (!
2c380 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2c390 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2c3a0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
2c3b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c3c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c3d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
2c3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c3f0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
2c400 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2c410 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2c420 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
2c430 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  ZED);....}.....c
2c440 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c450 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2c460 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75  tive = 0;.....mu
2c470 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2c480 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c490 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c4a0 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72  ;....if (mutex_r
2c4b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2c4c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c4d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2c4e0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2c4f0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2c500 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2c510 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  R);....}...}....
2c520 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
2c530 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20  ;..}...sign_ret 
2c540 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53  = C_SignFinal(hS
2c550 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75  ession, pSignatu
2c560 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  re, pulSignature
2c570 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f  Len);..if (sign_
2c580 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
2c590 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20  ...if (sign_ret 
2c5a0 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
2c5b0 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41  O_SMALL) {....CA
2c5c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c5d0 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  F("SignFinal() r
2c5e0 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46  eturned CKR_BUFF
2c5f0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76  ER_TOO_SMALL (rv
2c600 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67   = %lu), undoing
2c610 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
2c620 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c630 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09  ) sign_ret);....
2c640 09 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 73 69 67 6e 5f  [hSession].sign_
2c660 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f  bufused = start_
2c670 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09  sign_bufused;...
2c680 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2c690 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  t);...}....CACKE
2c6a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c6b0 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61  Error.  SignFina
2c6c0 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  l() returned fai
2c6d0 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2c6e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2c6f0 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
2c700 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2c710 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67  );..}...if (pSig
2c720 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20  nature == NULL) 
2c730 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c740 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74  _PRINTF("pSignat
2c750 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61 73  ure specified as
2c760 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43   NULL, undoing C
2c770 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b  _SignUpdate()");
2c780 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2c790 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c7a0 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61  gn_bufused = sta
2c7b0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2c7c0 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
2c7d0 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ret);..}...CACKE
2c7e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c7f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2c800 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2c810 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2c820 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2c830 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2c840 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b  C_SignUpdate)(CK
2c850 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2c860 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2c870 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2c880 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2c890 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
2c8a0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2c8b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2c8c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2c8d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2c8e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2c8f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c900 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2c910 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2c920 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2c930 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2c940 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2c950 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2c960 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2c970 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2c980 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2c990 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2c9a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c9b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c9c0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2c9d0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2c9e0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2c9f0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2ca00 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
2ca10 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61   == NULL && ulPa
2ca20 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2ca30 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
2ca40 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65 64   if we are asked
2ca50 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67   to sign nothing
2ca60 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f  ... */...CACKEY_
2ca70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2ca80 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2ca90 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
2caa0 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
2cab0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2cac0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74  ;..}...if (pPart
2cad0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
2cae0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2caf0 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20  F("Error. pPart 
2cb00 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50  is NULL, but ulP
2cb10 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e  artLen is not 0.
2cb20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2cb30 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2cb40 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72  ;..}...if (ulPar
2cb50 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tLen == 0) {...C
2cb60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb70 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72  TF("Error. ulPar
2cb80 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70  tLen is 0, but p
2cb90 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Part is not NULL
2cba0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cbb0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2cbc0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2cbd0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2cbe0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2cbf0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2cc00 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2cc10 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2cc20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cc30 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2cc40 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2cc50 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2cc60 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2cc70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2cc80 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2cc90 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2cca0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ccb0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2ccc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ccd0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2cce0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2ccf0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2cd00 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2cd10 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2cd20 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2cd30 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2cd40 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2cd50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2cd60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2cd70 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2cd80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cd90 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
2cda0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2cdb0 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2cdc0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2cdd0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
2cde0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cdf0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
2ce00 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61  echanism) {...ca
2ce10 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a  se CKM_RSA_PKCS:
2ce20 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74  ..../* Accumulat
2ce30 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09  e directly */...
2ce40 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73  .if ((cackey_ses
2ce50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ce60 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75  sign_bufused + u
2ce70 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b  lPartLen) > cack
2ce80 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ce90 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2cea0 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f  n) {.....cackey_
2ceb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cec0 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a  n].sign_buflen *
2ced0 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79  = 2;......cackey
2cee0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cef0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72  on].sign_buf = r
2cf00 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65  ealloc(cackey_se
2cf10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cf20 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f  .sign_buf, sizeo
2cf30 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
2cf40 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2cf50 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
2cf60 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cf70 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
2cf80 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
2cf90 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2cfa0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2cfb0 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73  buf + cackey_ses
2cfc0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cfd0 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50  sign_bufused, pP
2cfe0 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b  art, ulPartLen);
2cff0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2d000 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d010 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75  ign_bufused += u
2d020 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72  lPartLen;.....br
2d030 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  eak;..}...mutex_
2d040 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2d050 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2d060 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2d070 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2d080 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2d090 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d0a0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2d0b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2d0c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2d0d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2d0e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d0f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2d100 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2d110 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2d120 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2d130 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d140 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29  RV, C_SignFinal)
2d150 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d160 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d170 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2d180 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
2d190 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
2d1a0 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
2d1b0 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32 34  BYTE sigbuf[1024
2d1c0 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62  ];..ssize_t sigb
2d1d0 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f  uflen;..CK_SLOT_
2d1e0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52  ID slotID;..CK_R
2d1f0 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  V retval = CKR_G
2d200 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69  ENERAL_ERROR;..i
2d210 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  nt terminate_sig
2d220 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65  n = 1;..int mute
2d230 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
2d240 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d250 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d260 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d270 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d280 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d290 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d2a0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d2b0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d2c0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d2d0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
2d2e0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d  lSignatureLen ==
2d2f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2d300 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d310 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74  Error. pulSignat
2d320 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  ureLen is NULL."
2d330 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2d340 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2d350 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2d360 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2d370 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2d380 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2d390 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2d3a0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2d3b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d3c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d3d0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2d3e0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2d3f0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2d400 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2d410 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
2d420 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2d430 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
2d440 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2d450 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2d460 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d470 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d480 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2d490 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d4a0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2d4b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2d4c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2d4d0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
2d4e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2d4f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2d500 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2d510 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d520 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2d530 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2d540 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2d550 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2d560 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
2d570 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2d580 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d590 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
2d5a0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2d5b0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2d5c0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2d5d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d5e0 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
2d5f0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
2d600 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
2d610 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d620 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20  ;..}...slotID = 
2d630 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d640 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44  hSession].slotID
2d650 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  ;...if (slotID <
2d660 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
2d670 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2d680 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
2d690 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
2d6a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d6b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d6c0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
2d6d0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
2d6e0 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
2d6f0 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
2d700 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d710 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
2d720 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
2d730 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
2d740 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
2d750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d760 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2d770 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2d780 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
2d790 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
2d7a0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
2d7b0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2d7c0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d7d0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
2d7e0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2d7f0 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  R);..}...switch 
2d800 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2d810 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2d820 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2d830 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2d840 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
2d850 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43   to sign */....C
2d860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d870 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69  TF("Asking to si
2d880 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79  gn from identity
2d890 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25   %p in session %
2d8a0 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61  lu", (void *) ca
2d8b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2d8c0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
2d8d0 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64  ntity, (unsigned
2d8e0 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29   long) hSession)
2d8f0 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d  ;....sigbuflen =
2d900 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72   cackey_signdecr
2d910 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ypt(&cackey_slot
2d920 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65  s[slotID], cacke
2d930 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d940 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
2d950 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ty, cackey_sessi
2d960 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2d970 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73  gn_buf, cackey_s
2d980 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d990 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
2d9a0 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73  sigbuf, sizeof(s
2d9b0 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a  igbuf), 1, 0);..
2d9c0 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e  ...if (sigbuflen
2d9d0 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53   < 0) {...../* S
2d9e0 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a  igning failed. *
2d9f0 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75 66  /.....if (sigbuf
2da00 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
2da10 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
2da20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2da30 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
2da40 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
2da50 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e  se if (sigbuflen
2da60 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
2da70 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
2da80 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2da90 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
2daa0 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  D;.....} else {.
2dab0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2dac0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
2dad0 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
2dae0 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
2daf0 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29  long) sigbuflen)
2db00 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65   > *pulSignature
2db10 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72  Len && pSignatur
2db20 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e  e) {...../* Sign
2db30 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
2db40 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f  e */.....CACKEY_
2db50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65  DEBUG_PRINTF("re
2db60 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45  tval = CKR_BUFFE
2db70 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69  R_TOO_SMALL;  si
2db80 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70  gbuflen = %lu, p
2db90 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
2dba0 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
2dbb0 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
2dbc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2dbd0 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  ) *pulSignatureL
2dbe0 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  en);......retval
2dbf0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
2dc00 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65  O_SMALL;......te
2dc10 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30  rminate_sign = 0
2dc20 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ;....} else {...
2dc30 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e  ..terminate_sign
2dc40 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70   = 0;......if (p
2dc50 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
2dc60 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74  ..memcpy(pSignat
2dc70 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67  ure, sigbuf, sig
2dc80 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74  buflen);.......t
2dc90 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2dca0 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70  1;.....}......*p
2dcb0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
2dcc0 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09   sigbuflen;.....
2dcd0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b  .retval = CKR_OK
2dce0 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b  ;....}.....break
2dcf0 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69  ;..}...if (termi
2dd00 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69  nate_sign) {...i
2dd10 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
2dd20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2dd30 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65  n_buf) {....free
2dd40 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2dd50 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2dd60 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  buf);...}....cac
2dd70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2dd80 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
2dd90 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
2dda0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2ddb0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2ddc0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ddd0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2dde0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2ddf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2de00 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2de10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2de20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2de30 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2de40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2de50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2de60 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76   %i", (int) retv
2de70 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
2de80 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  tval);.}..CK_DEF
2de90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2dea0 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
2deb0 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  rInit)(CK_SESSIO
2dec0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ded0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2dee0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2def0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2df00 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
2df10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2df20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2df30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2df40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2df50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2df60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2df70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2df80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2df90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2dfa0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2dfb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2dfc0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2dfd0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2dfe0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2dff0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e000 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2e010 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e020 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2e030 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2e040 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
2e050 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49  ecover)(CK_SESSI
2e060 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e070 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e080 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2e090 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2e0a0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2e0b0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
2e0c0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
2e0d0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2e0e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2e0f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2e100 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2e110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e120 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e130 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2e140 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e150 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2e160 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2e170 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e180 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e190 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e1a0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2e1b0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2e1c0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e1d0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2e1e0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e1f0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2e200 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2e210 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29  V, C_VerifyInit)
2e220 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2e230 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2e240 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2e250 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
2e260 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2e270 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2e280 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2e290 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2e2a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2e2b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e2c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e2d0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2e2e0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e2f0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2e300 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2e310 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e320 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e330 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e340 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2e350 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2e360 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e370 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2e380 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e390 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2e3a0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2e3b0 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f  V, C_Verify)(CK_
2e3c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e3d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2e3e0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2e3f0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2e400 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2e410 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2e420 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29   ulSignatureLen)
2e430 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2e440 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2e450 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2e460 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2e470 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e480 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e490 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2e4a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2e4b0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2e4c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2e4d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e4e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2e4f0 20 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 20 28 25 69 29  T_SUPPORTED (%i)
2e510 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2e520 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e530 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2e540 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e550 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2e560 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2e570 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61 74  V, C_VerifyUpdat
2e580 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2e590 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e5a0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2e5b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2e5c0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2e5d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e5e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2e5f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2e600 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2e610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e620 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2e630 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2e640 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2e650 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2e660 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2e670 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2e680 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2e690 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e6a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2e6b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e6c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2e6d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e6e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2e6f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2e700 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2e710 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
2e720 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e730 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e740 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2e750 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
2e760 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2e770 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2e780 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2e790 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2e7a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e7b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e7c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2e7d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e7e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2e7f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2e800 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2e810 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2e820 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2e830 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2e840 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2e850 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e860 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2e870 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e880 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2e890 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2e8a0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
2e8b0 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45  coverInit)(CK_SE
2e8c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2e8d0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2e8e0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2e8f0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2e900 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
2e910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e920 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e930 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e940 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e960 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2e970 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2e980 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2e990 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2e9a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2e9b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e9c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2e9d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e9e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2e9f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ea00 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2ea10 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2ea20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ea30 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2ea40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
2ea50 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b  erifyRecover)(CK
2ea60 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ea70 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2ea80 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65  E_PTR pSignature
2ea90 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67  , CK_ULONG ulSig
2eaa0 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59  natureLen, CK_BY
2eab0 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2eac0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61  _ULONG_PTR pulDa
2ead0 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  taLen) {..CACKEY
2eae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2eaf0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2eb00 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2eb10 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2eb20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2eb30 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2eb40 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2eb50 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2eb60 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2eb70 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2eb80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2eb90 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2eba0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2ebb0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2ebc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ebd0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2ebe0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ebf0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2ec00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2ec10 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
2ec20 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  tEncryptUpdate)(
2ec30 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2ec40 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2ec50 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2ec60 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2ec70 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2ec80 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2ec90 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
2eca0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
2ecb0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ecc0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ecd0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ece0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ecf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ed00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ed10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2ed20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ed30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ed40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ed50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ed60 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2ed70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ed80 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2ed90 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2eda0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2edb0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2edc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2edd0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2ede0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2edf0 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67 65  V, C_DecryptDige
2ee00 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  stUpdate)(CK_SES
2ee10 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ee20 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2ee30 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2ee40 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2ee50 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
2ee60 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2ee70 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2ee80 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..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 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2eeb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2eec0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2eed0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2eee0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2eef0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2ef00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2ef10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2ef20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2ef30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ef40 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2ef50 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ef60 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2ef70 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ef80 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2ef90 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2efa0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2efb0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2efc0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2efd0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
2efe0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2eff0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f000 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
2f010 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
2f020 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2f030 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2f040 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2f050 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2f060 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2f070 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2f080 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2f090 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2f0a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f0b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f0c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2f0d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f0e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2f0f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f100 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f110 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f120 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f130 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f140 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f150 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f160 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2f170 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f180 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2f190 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f1a0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65  _RV, C_DecryptVe
2f1b0 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
2f1c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f1d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2f1e0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2f1f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
2f200 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
2f210 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2f220 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2f230 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
2f240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f250 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f260 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2f270 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2f280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f290 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2f2a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2f2b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2f2c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2f2d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2f2e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f2f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2f300 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f310 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2f320 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f330 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2f340 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2f350 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f360 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2f370 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f380 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b  _GenerateKey)(CK
2f390 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f3a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2f3b0 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2f3c0 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
2f3d0 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2f3e0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
2f3f0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2f400 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
2f410 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2f420 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2f430 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2f440 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2f450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2f460 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2f470 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2f480 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2f490 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2f4a0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2f4b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f4c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f4d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f4e0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2f4f0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2f500 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f510 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2f520 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f530 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2f540 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2f550 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  V, C_GenerateKey
2f560 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Pair)(CK_SESSION
2f570 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f580 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2f590 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2f5a0 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
2f5b0 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61  pPublicKeyTempla
2f5c0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  te, CK_ULONG ulP
2f5d0 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74  ublicKeyAttribut
2f5e0 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49  eCount, CK_ATTRI
2f5f0 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61 74  BUTE_PTR pPrivat
2f600 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b  eKeyTemplate, CK
2f610 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65  _ULONG ulPrivate
2f620 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
2f630 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
2f640 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63  DLE_PTR phPublic
2f650 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
2f660 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76  ANDLE_PTR phPriv
2f670 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ateKey) {..CACKE
2f680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f690 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2f6a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2f6b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2f6c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f6d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2f6e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2f6f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2f700 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2f710 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2f720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2f730 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2f740 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f750 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2f760 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f770 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2f780 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f790 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2f7a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2f7b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70  ON(CK_RV, C_Wrap
2f7c0 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
2f7d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2f7e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2f7f0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2f800 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2f810 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  WrappingKey, CK_
2f820 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2f830 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  ey, CK_BYTE_PTR 
2f840 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f  pWrappedKey, CK_
2f850 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61  ULONG_PTR pulWra
2f860 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43  ppedKeyLen) {..C
2f870 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f880 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f890 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f8a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f8c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f8d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f8e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f8f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f900 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f910 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f920 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f930 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f940 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f950 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f960 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f970 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f980 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f990 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f9a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f9b0 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45  UnwrapKey)(CK_SE
2f9c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2f9d0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2f9e0 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2f9f0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2fa00 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67  NDLE hUnwrapping
2fa10 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
2fa20 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
2fa30 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64  _ULONG ulWrapped
2fa40 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49  KeyLen, CK_ATTRI
2fa50 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2fa60 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41  te, CK_ULONG ulA
2fa70 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43  ttributeCount, C
2fa80 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
2fa90 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41  PTR phKey) {..CA
2faa0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fab0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2fac0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2fad0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2fae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2faf0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2fb00 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2fb10 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2fb20 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2fb30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2fb40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2fb50 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2fb60 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2fb70 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2fb80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2fb90 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2fba0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2fbb0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2fbc0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2fbd0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2fbe0 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53  eriveKey)(CK_SES
2fbf0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2fc00 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2fc10 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2fc20 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2fc30 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b  DLE hBaseKey, CK
2fc40 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
2fc50 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
2fc60 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f  NG ulAttributeCo
2fc70 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2fc80 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29  ANDLE_PTR phKey)
2fc90 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2fca0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2fcb0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2fcc0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2fcd0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2fce0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2fcf0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2fd00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2fd10 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2fd20 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2fd30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2fd40 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2fd50 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2fd60 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2fd70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2fd80 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2fd90 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2fda0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2fdb0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2fdc0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2fdd0 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29  V, C_SeedRandom)
2fde0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2fdf0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2fe00 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20  BYTE_PTR pSeed, 
2fe10 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c  CK_ULONG ulSeedL
2fe20 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2fe30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2fe40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2fe50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2fe60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2fe70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2fe80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2fe90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2fea0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2feb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2fec0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2fed0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2fee0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2fef0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2ff00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2ff10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ff20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ff30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ff40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2ff50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ff60 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65  K_RV, C_Generate
2ff70 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49  Random)(CK_SESSI
2ff80 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2ff90 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2ffa0 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f  pRandomData, CK_
2ffb0 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65  ULONG ulRandomLe
2ffc0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2ffd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2ffe0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2fff0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
30000 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
30010 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
30020 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
30030 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
30040 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
30050 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
30060 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
30070 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
30080 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
30090 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
300a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
300b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
300c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
300d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
300e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65  ORTED);.}../* De
300f0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
30100 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
30110 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
30120 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
30130 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  us)(CK_SESSION_H
30140 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
30150 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
30160 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
30170 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
30180 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30190 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
301a0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
301b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
301c0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
301d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
301e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
301f0 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
30200 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
30210 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
30220 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
30230 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  */.}../* Depreca
30240 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
30250 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
30260 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63  ON(CK_RV, C_Canc
30270 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53  elFunction)(CK_S
30280 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
30290 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
302a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
302b0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
302c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
302d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
302e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
302f0 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
30300 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
30310 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
30320 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
30330 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
30340 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
30350 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
30360 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
30370 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b  warning */.}..CK
30380 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
30390 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
303a0 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55  ctionList)(CK_FU
303b0 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f  NCTION_LIST_PTR_
303c0 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  PTR ppFunctionLi
303d0 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49  st) {..CK_FUNCTI
303e0 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e  ON_LIST_PTR pFun
303f0 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43  ctionList;...CAC
30400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
30410 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
30420 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  f (ppFunctionLis
30430 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
30440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30450 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e  TF("Error. ppFun
30460 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c  ctionList is NUL
30470 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
30480 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
30490 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69  D);..}...pFuncti
304a0 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28  onList = malloc(
304b0 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f  sizeof(*pFunctio
304c0 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63  nList));...pFunc
304d0 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
304e0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
304f0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
30500 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
30510 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74   & 0xff;..pFunct
30520 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e  ionList->version
30530 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
30540 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
30550 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
30560 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69   0xff;...pFuncti
30570 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61  onList->C_Initia
30580 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c  lize = C_Initial
30590 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ize;..pFunctionL
305a0 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20  ist->C_Finalize 
305b0 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70  = C_Finalize;..p
305c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
305d0 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49  GetInfo = C_GetI
305e0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
305f0 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69  ist->C_GetSlotLi
30600 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69  st = C_GetSlotLi
30610 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
30620 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66  st->C_GetSlotInf
30630 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66  o = C_GetSlotInf
30640 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
30650 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66  t->C_GetTokenInf
30660 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  o = C_GetTokenIn
30670 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
30680 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f  st->C_WaitForSlo
30690 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46  tEvent = C_WaitF
306a0 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46  orSlotEvent;..pF
306b0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
306c0 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20  etMechanismList 
306d0 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  = C_GetMechanism
306e0 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
306f0 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61  List->C_GetMecha
30700 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74  nismInfo = C_Get
30710 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09  MechanismInfo;..
30720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30730 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49  _InitToken = C_I
30740 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63  nitToken;..pFunc
30750 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
30760 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b  PIN = C_InitPIN;
30770 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30780 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65  >C_SetPIN = C_Se
30790 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
307a0 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73  List->C_OpenSess
307b0 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73  ion = C_OpenSess
307c0 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ion;..pFunctionL
307d0 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73  ist->C_CloseSess
307e0 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73  ion = C_CloseSes
307f0 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
30800 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c  List->C_CloseAll
30810 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f  Sessions = C_Clo
30820 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09  seAllSessions;..
30830 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30840 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20  _GetSessionInfo 
30850 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  = C_GetSessionIn
30860 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
30870 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69  st->C_GetOperati
30880 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f  onState = C_GetO
30890 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
308a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
308b0 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _SetOperationSta
308c0 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74  te = C_SetOperat
308d0 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
308e0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69  tionList->C_Logi
308f0 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46  n = C_Login;..pF
30900 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c  unctionList->C_L
30910 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74  ogout = C_Logout
30920 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30930 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  ->C_CreateObject
30940 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63   = C_CreateObjec
30950 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
30960 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20  t->C_CopyObject 
30970 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a  = C_CopyObject;.
30980 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30990 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20  C_DestroyObject 
309a0 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  = C_DestroyObjec
309b0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
309c0 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69  t->C_GetObjectSi
309d0 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74  ze = C_GetObject
309e0 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Size;..pFunction
309f0 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69  List->C_GetAttri
30a00 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65  buteValue = C_Ge
30a10 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
30a20 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30a30 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56  >C_SetAttributeV
30a40 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72  alue = C_SetAttr
30a50 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
30a60 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
30a70 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20  ndObjectsInit = 
30a80 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69  C_FindObjectsIni
30a90 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
30aa0 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
30ab0 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73   = C_FindObjects
30ac0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30ad0 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  ->C_FindObjectsF
30ae0 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a  inal = C_FindObj
30af0 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  ectsFinal;..pFun
30b00 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
30b10 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63  ryptInit = C_Enc
30b20 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  ryptInit;..pFunc
30b30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
30b40 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b  ypt = C_Encrypt;
30b50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30b60 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65  >C_EncryptUpdate
30b70 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61   = C_EncryptUpda
30b80 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
30b90 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e  st->C_EncryptFin
30ba0 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69  al = C_EncryptFi
30bb0 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
30bc0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e  ist->C_DecryptIn
30bd0 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e  it = C_DecryptIn
30be0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
30bf0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20  st->C_Decrypt = 
30c00 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e  C_Decrypt;..pFun
30c10 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
30c20 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
30c30 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ecryptUpdate;..p
30c40 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30c50 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43  DecryptFinal = C
30c60 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09  _DecryptFinal;..
30c70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30c80 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f  _DigestInit = C_
30c90 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75  DigestInit;..pFu
30ca0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
30cb0 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b  gest = C_Digest;
30cc0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30cd0 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 20  >C_DigestUpdate 
30ce0 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  = C_DigestUpdate
30cf0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
30d00 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20  ->C_DigestKey = 
30d10 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46  C_DigestKey;..pF
30d20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
30d30 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44  igestFinal = C_D
30d40 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75  igestFinal;..pFu
30d50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
30d60 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49  gnInit = C_SignI
30d70 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
30d80 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f  ist->C_Sign = C_
30d90 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Sign;..pFunction
30da0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61  List->C_SignUpda
30db0 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74  te = C_SignUpdat
30dc0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
30dd0 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d  t->C_SignFinal =
30de0 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70   C_SignFinal;..p
30df0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30e00 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20  SignRecoverInit 
30e10 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  = C_SignRecoverI
30e20 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
30e30 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76  ist->C_SignRecov
30e40 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76  er = C_SignRecov
30e50 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  er;..pFunctionLi
30e60 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74  st->C_VerifyInit
30e70 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b   = C_VerifyInit;
30e80 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30e90 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65  >C_Verify = C_Ve
30ea0 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rify;..pFunction
30eb0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70  List->C_VerifyUp
30ec0 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55  date = C_VerifyU
30ed0 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
30ee0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46  nList->C_VerifyF
30ef0 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46  inal = C_VerifyF
30f00 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
30f10 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
30f20 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65  coverInit = C_Ve
30f30 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b  rifyRecoverInit;
30f40 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30f50 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72  >C_VerifyRecover
30f60 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76   = C_VerifyRecov
30f70 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  er;..pFunctionLi
30f80 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72  st->C_DigestEncr
30f90 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69  yptUpdate = C_Di
30fa0 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
30fb0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
30fc0 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65  t->C_DecryptDige
30fd0 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  stUpdate = C_Dec
30fe0 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
30ff0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
31000 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  ->C_SignEncryptU
31010 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e  pdate = C_SignEn
31020 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
31030 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
31040 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
31050 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65  te = C_DecryptVe
31060 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
31070 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31080 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65  nerateKey = C_Ge
31090 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e  nerateKey;..pFun
310a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e  ctionList->C_Gen
310b0 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43  erateKeyPair = C
310c0 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72  _GenerateKeyPair
310d0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
310e0 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f  ->C_WrapKey = C_
310f0 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  WrapKey;..pFunct
31100 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61  ionList->C_Unwra
31110 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b  pKey = C_UnwrapK
31120 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
31130 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20  st->C_DeriveKey 
31140 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09  = C_DeriveKey;..
31150 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
31160 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f  _SeedRandom = C_
31170 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75  SeedRandom;..pFu
31180 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
31190 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43  nerateRandom = C
311a0 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b  _GenerateRandom;
311b0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
311c0 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74  >C_GetFunctionSt
311d0 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63  atus = C_GetFunc
311e0 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75  tionStatus;..pFu
311f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61  nctionList->C_Ca
31200 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43  ncelFunction = C
31210 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b  _CancelFunction;
31220 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
31230 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69  >C_GetFunctionLi
31240 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69  st = C_GetFuncti
31250 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e  onList;...*ppFun
31260 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e  ctionList = pFun
31270 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43  ctionList;...CAC
31280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
31290 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
312a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
312b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
312c0 4f 4b 29 3b 0a 7d 0a 0a                          OK);.}..